• 滴滴算法大赛算法解决过程


    按照前面文章的方法进行数据预测,完全不使用POI,天气,交通情况的数据,可以达到0.43的成绩。
    不过如果想要获得更好的成绩,简单的预测方法显然无法满足要求了。

    GBDT

    网友说可以使用GBDT的方法来进行数据预测。所以,我们先来聊聊GBDT算法的一些基础知识。

    凡是说到算法,人工智能,机器学习的文章,多半一定要说到 熵 这个概念的。什么是熵?
    百度一下:

    熵(entropy)指的是体系的混乱的程度,它在控制论、概率论、数论、天体物理、生命科学等领域都有重要应用,在不同的学科中也有引申出的更为具体的定义,是各领域十分重要的参量。熵由鲁道夫·克劳修斯(Rudolf Clausius)提出,并应用在热力学中。后来在,克劳德·艾尔伍德·香农(Claude Elwood Shannon)第一次将熵的概念引入到信息论中来。

    一个体系越是单调,则熵越低,反之亦然。
    这里我们引用数据挖掘大神的文章来接单说一下熵。

    • 如果有一个字符串,里面包含了4种字符,每种出现的概率都是P= 1/4。
      P(X=A) = 1/4
      P(X=B) = 1/4
      P(X=C) = 1/4
      P(X=D) = 1/4
      这样的字符串可能是:BAACBADCDADDDA。传送这样的字符串,每一个字符需要用几个bit?
      答案是2个bit
      A = 00, B = 01, C = 10, D =11

    • 如果有一个字符串,里面包含了4种字符,但是每个字符串出现的概率不同
      P(X=A) = 1/2
      P(X=B) = 1/4
      P(X=C) = 1/8
      P(X=D) = 1/8
      传送这样的字符串,每一个字符平均需要用几个bit?注意这里说平均。
      答案是1.75个bit
      A = 0, B = 10, C = 110, D =111
      (如果使用等概率的方法, A = 00, B = 01, C = 10, D =11,则无法节省编码量,还是2个bit)
      这里巧妙的做到了,出现概率高的字符,使用的bit位少,同时做到了编码上的问题。
      (AB =〉010 和 C 110,D 111 不重复。AA =〉00 和 B 10 不重复 等)

    • 有如果有一个字符串,里面3种字符串,每种出现概率都是 1/3呢?
      最简单的编码方式是 A = 00, B = 01, C = 10, 这样是2个bit,但是如果好好计算一下,可以做到1.6个bit。
      A=10,B= 11,C = 0(理论上是1.58496 个bit)

    • 有如果有一个字符串,里面N种字符串,每种出现概率是 PN呢?

    • 如果有一个字符串,里面包含了4种字符,每种出现的概率都是P= 1/4 = 0.25。
      log(0.25,2) = - 2
      H(X) = - (1/4) * log(0.25,2) - (1/4) * log(0.25,2) - (1/4) * log(0.25,2) - (1/4) * log(0.25,2) = 2;

    • 如果要表示下图的H(X)和H(Y)呢?

    这个很容易计算
    这个很容易计算
    H(X)= 1.5

    P(Math) = 1/2 P(History)= 1/4 P(CS)= 1/4
    log(0.25,2) = - 2 log(0.5,2) = - 1
    H(X) = - (1/2) * log(0.5,2) - (1/4) * log(0.25,2) - (1/4) * log(0.25,2) = 0.5 + 0.5 + 0.5 = 1.5;

    H(Y)= 1
    P(Yes) = 1/2 P(No) = 1/2
    H(Y) = - (1/2) * log(0.5,2) - (1/2) * log(0.5,2) = 0.5 + 0.5 = 1;

    • 如果说,我们的计算范围只是 X = Math 的数据。那么这个时候 H(Y | X = Math) 是多少呢?是多少呢?答案是1。(一共4条记录,但是Y有两种可能性)
    • 如果说,我们的计算范围只是 X = Histroy 的数据。那么这个时候 H(Y| X = Histroy)是多少呢?答案也是 0 。(一共2条记录,但是Y只是一种可能性)
    • 如果说,我们的计算范围只是 X = CS 的数据。那么这个时候 H(Y| X = CS)是多少呢?答案也是 0 。(一共2条记录,但是Y只是一种可能性)

    H(Y | X ): 条件熵 Conditional Entropy

    现在我们考虑一个问题,如果我们需要将Y传输出去。当然,如果直接传输的话, H(Y)= 1。
    如果我们在传输的时候,双方都知道X的值,则需要熵定义为H(Y | X )。

    例如:大家都知道X=History,则 Y 必然是 NO, H(Y ) = 0 , Histroy的可能性是1/4 ,需要的传输量是 0(CS同理)
    大家都知道X=Math,则 Y 可能是 Yes或者No,H(Y ) = 1 ,Math的可能性是1/2 ,需要的平均传输率是 1/2 * 1 = 0.5
    Math的概率 P(Math) = 1/2 ; History的概率 P(Histroy)= 1/4; History的概率 P(CS)= 1/4;
    则我们定义H(Y | X ) = H(Y | X = Math) * P(Math) + H(Y| X = Histroy) * P(Histroy) + H(Y| X = CS) * P(CS) = 0.5

    Information Gain 信息增益 和 Relative Information Gain

    从上文可知,比起直接传输Y,条件熵则更加划算了。这些划算的部分,我们称为信息增益IG。
    IG(Y|X) = H(Y) - H(Y | X)
    上面的例子,IG(Y|X) = H(Y) - H(Y | X) = 1 - 0.5 = 0.5
    进一步,这样划算的部分,占原来所需部分的比重是多少呢?
    RIG= IG(Y|X) / H(Y) = 0.5 / 1 = 0.5 (节省的部分占了50%)

    信息增益是什么,我们先从它的用处来了解它:
    信息增益是特征选择中的一个重要指标,它定义为一个特征能够为分类系统带来多少信息,带来的信息越多,该特征越重要。

    指标选择

    回到滴滴算法的问题,我们应该挑选哪些指标作为GBDT的参考呢?

    滴滴算法大赛算法解决过程 - 数据分析
    滴滴算法大赛算法解决过程 - 拟合算法
    滴滴算法大赛算法解决过程 - 方案设计
    滴滴算法大赛算法解决过程 - 机器学习

  • 相关阅读:
    [改善Java代码]养成良好习惯,显式声明UID
    [改善Java代码]警惕自增的陷阱
    [改善Java代码]覆写变长方法也循规蹈矩
    [改善Java代码]别让null值和空值威胁到变长方法
    [改善Java代码]避免带有变长参数的方法重载
    [改善Java代码]三元操作符的类型务必一致
    关于Windows下mysql忘记root密码的解决方法
    关于同步VSS服务器上的代码发生Eclipse里面的项目全部不见了
    关于关闭Eclipse的控制台自动跳出
    关于Windows下如何查看端口占用和杀掉进程
  • 原文地址:https://www.cnblogs.com/TextEditor/p/5546397.html
Copyright © 2020-2023  润新知