您当前的位置:网站首页>丫丫,小鸡炖蘑菇的做法-冥王号:辛辛苦苦飞过来,小行星的密码

丫丫,小鸡炖蘑菇的做法-冥王号:辛辛苦苦飞过来,小行星的密码

2019-06-09 05:26:41 投稿作者:admin 围观人数:130 评论人数:0次

Python机器学习算法完成


Author:Freemanzxp

Editor:louwill


     

写在前面: 上一年学习GBDT之初,为了加强对算法的了解,整理了一篇笔记方式的文章,发出去之后发现阅览量越来越多,逐渐也有了谈论,谈论中大多指出来了笔者了解或许修改的过错,故从头修改一版文章,内容愈加详尽,并且在GitHub上完成了和本文共同的GBDT简易版(包含回归、二分类、多分类以及可视化),供咱们沟通讨论。感谢各位的点赞和谈论,期望持续指出过错~

本文GitHub地址:

https://github.com/Freemanzxp/GBDT_Simple_Tutorial



  GBDT 的全称是 Gradient Boosting Decision Tree,梯度提高树,在传统机器学习算法中,GBDT算的上TOP3的算法。想要了解GBDT的实在含义,那就有必要了解GBDT中的Gradient Boosting 和Decision Tree别离是什么?

1. Decision Tree:CART回归树

  首要,GBDT运用的决策树是CART回归树,无论是处理回归问题仍是二分类以及多分类,GBDT运用的决策树统统都是都是CART回归树。为什么不必CART分类树呢?因为GBDT每次迭代要拟合的是梯度值,是接连值所以要用回归树。
  关于回归树算法来说最重要的是寻觅最佳的区分点,那么回归树中的可区分点包含了一切特征的一切可取的值。在分类树中最佳区分点的判别标准是熵或许基尼系数,都是用纯度来衡量的,可是在回归树中的样本标签是接连数值,所以再运用熵之类的方针不再适宜,取而代之的是平方差错,它能很好的评判拟合程度。



回归树生成算法

输入:练习数据集:
输出:回归树
.
在练习数据集地点的输入空间中,递归的将每个区域区分为两个子区域并决议每个子区域上的输出值,构建二叉决策树:
(1)挑选最优切分变量
与切分点,求解



遍历变量,对固定的切分变量扫描切分点,挑选使得上式到达最小值的对.
(2)用选定的对
区分区域并决议相应的输出值:


(3)持续对两个子区域调用过程(1)和(2),直至满意中止条件。

(4)将输入空间划第二军医大学分为个区域 ,生成决策树:


2. Gradient Boosting: 拟合负梯度

  梯度提高树(Grandient Boosting)是提高树(Boosting Tree)的一种改善算法,所以在讲梯度提高树之前先来说一下提高树。



  先来个浅显了解:假如有个人30岁,咱们首要用20岁去拟合,发现丢失有10岁,这时咱们用6岁去拟合剩余的丢失,发现距离还有4岁,第三轮咱们用3岁拟合剩余的距离,距离就只要一岁了。假如咱们的迭代轮数还没有完,能够持续迭代下面,每一轮迭代,拟合的岁数差错都会减小。终究将每次拟合的岁数加起来便是模型输出的成果。


提高树算法:
(1)初始化

(2)对
 (a)核算丫丫,小鸡炖蘑菇的做法-冥王号:辛辛苦苦飞过来,小行星的暗码残差

 (b)拟合残差学习一个回归树,得到
 (c)更新
(3)得到回归问题提高树


上面伪代码中的残差是什么?
在提高树算法中,假定咱们前一轮迭代得到的强学习器是

丢失函数是

咱们本轮迭代的方针是找到一个弱学习器

最小化让本轮的丢失

当选用平方丢失函数时


这儿,

是当时模无主之地型拟合数据的残差(residual)所以,关于提高树来说只需求简略地拟合当时模型的残差。
  回到咱们上面讲的那个浅显易懂的比如中,第一次迭代的残差是10岁,第二 次残差4岁……


  当丢失函数是平方丢失和指数丢失函数时,梯度提高树每一步优化是很简略的,可是关于一般丢失函数而言,往往每一步优化起来不那么简略,针对这一问题,Friedman提出了梯度提高树算法,这是使用最速下降的近似办法,其关键是使用丢失函数的负梯度作为提高树算法中的残差的近似值。
那么负梯度长什么样呢?
第t轮的第i个样本的丢失函数的负梯度为:

此刻不同的丢失函数将会得到不同的负梯度,假如挑选平方丢失

负梯度为

  此刻咱们发现GBDT的负梯度便是残差,所以说关于回归问题,咱们要拟合的便是朝鲜族网站残差。
  那么关于分类问题呢?二分类和多分类的丢失函数都是
,本文以回归问题为例进行解说。



3. GBDT算法原理

  上面两节别离将Decision Tree和Gradient Boosting介绍完了,下面将这两部分组合在一起便是咱们的GBDT了。



GBDT算法:
(1)初始化弱学习器

(2)对有:
 (a)对每个样本
,核算负梯度,即残差


 (b)将上步得到的残差作为样本新的实在值,并将数据作为下棵树的练习数据,得到一颗新的回归树其对应的叶子节点区域为。其间为回归树t的叶子节点的个数。
 (珠江台c)对叶子区域
核算最佳拟合值

 (d)更新强学习器

(3)得到终究学习器


4. 实例详解

自己用python丫丫,小鸡炖蘑菇的做法-冥王号:辛辛苦苦飞过来,小行星的暗码以及pandas库完成GBDT的简易版别,鄙人面的比如中用到的数据都在github能够找到,咱们能够结合代码和下面的比如进行了解,欢迎star~

https://github.com/Freemanzxp/GBDT_Simple_Tutorial



数据介绍:

  如下表所示:一组数据,特征为年纪、体重,身高为标签值。共有5条数据,前四条为练习样本,终究一条为要猜测的样本。


         编号年纪(岁)体重(kg)身高(m)(标签值)

0

5

20

1.1

1

7

30

1.3

2

21

70

1.7

3

30

60

1.8

4(要猜测的)

25

65

练习阶段:


参数设置:

  • 学习率:learning_rate=0.1

  • 迭代次数:n_trees=5

  • 树的深度:max_depth=3


1.初始化弱学习器:

  丢失函数为平方丢失,因为平方丢失函数是一个凸函数,直接求导,倒数等于零,得到

令导数等狮虎兽于0


所以初始化时,取值为一切练习样本标签值的均值。,此刻得到初始学习器


2.对迭代轮数m=1,2,...,M:
  因为咱们设置了迭代次数:n_trees=5,这儿的

  核算负梯度,依据上文丢失函数为平方丢失时,负梯度便是残差残差,再直白一点便是 
与上一轮得到的学习器的差值
  


残差鄙人表列出:


   丫丫,小鸡炖蘑菇的做法-冥王号:辛辛苦苦飞过来,小行星的暗码;       编号     实在值           残差

0

1.1

1.475

-0.375

1

1.3

1.475

-0.175

2

1.7

1.475

0.225

3

1.8

1.475

0.325

此刻将残差作为样本的实在值来练习弱学习器,即下表数据


编号     年纪(岁)       体重(kg)       标签值

0

5

20

-0.375

1

7

30

-0.175

2

21

70

0.225

3

30

60

0.325

  接着,寻觅回归树的最佳区分节点,遍历每个特征的每个或许取值右胸口疼是怎么回事。从年纪特征的5开端,到体重特征的70完毕,别离核算割裂后两组数据的平方丢失(Square Error),左节点平方丢失,右节点平方丢失,找到使平方丢失和最小的那个区分节点公司祝福语,即为最佳区分节点。
  例如:以年纪7为区分节点,将小于7的样本区分为到左节点,大于等于7的样本区分为右节点。左节点包含
,右节点包含样本,一切或许区分状况如下表所示:


区分点小于区分点的样本大于等于区分点的样本

年纪5

/

0,1,2,3

0

0.327

0.327

年纪7

0

1,2,3

0

0.140

0.1沪40

年纪21

0,1

2,3

0.020

0.005

0.025

年纪30

0,1,2

3

0.187

0

0.187

体重20

/

0,1,2,3

0

0.327

0.327

体重30

0

1,2,3

0

0.140

0.140

体重60

0,1

2,3

0.020

0.005

0.025

体重70

0,1,3

2

0.260

0

0.260

  以上区分点是的总平方丢失最小为0.025有两个区分点:年纪21和体重60,所以随机选一个作为区分点,这儿咱们选&n福州管家婆软件bsp;年纪21
  现在咱们的第一棵树长这个姿态:



  咱们设置的参数中树的深度max_depth=3,现在树的深度只要2,需求再进行一次区分,这次区分要对左右两个节点别离进行区分:



  关于左节点刘涛肩带滑落,只含有0,1两个样本,依据下表咱们挑选年纪7区分


区分点小于区分点的样本大于等于区分点的样本

年纪5

/

0,1

0

0.020

0.02蒋传锟0

年纪7

0

1

0

0

0

体重20

/

0,1

0

0.020

0.020

体重30

0

1

0

0

0

  关于右节点,只含有2,3两个样本,依据下表咱们挑选年纪30划张境原分(也能够选体重70)

区分点小于区分点的样本大于等于区分点的样本

年纪21

/

2,3

0

0.005

0.005

年纪30

2

3

0

0

0

体重60

/

2,3

0

0.005

0.005

体重70

3

2

0

0

0

  现在咱们的第一棵树长这个姿态:




  此刻咱们的树深度满意了设置,还需求做一件工作,给这每个叶子节点别离赋一个参数,来拟合残差。


  这儿其实和上面初始化学习器是一个道理,平方炸酥肉的做法丢失,求导,令导数等于零,化简之后得到每个叶子节点的参数,其实便是标签值的均值。这个当地的标签值不是原始的 ,而是本轮要拟合的标残差 .

  依据上述区分成果,为了便利表明,规则从左到右为第个叶子结点


  此刻的树长这个姿态:





  此刻可更新强学习器,需求用到参数学习率:lea银耳莲子羹rning_rate=0.1,用表明。


为什么要用学习率呢?这是Shrinkage的思维,假如每次都悉数加上(学习率为1)很简略一步学到位导致过拟合。


重复此过程,直到  完毕,终究生成5棵树。
下面将展现每庶女阏氏棵树终究的结构,这丫丫,小鸡炖蘑菇的做法-冥王号:辛辛苦苦飞过来,小行星的暗码些图都是GitHub上的代码生成的,感兴趣的同学能够去一探终究
https://github.com/Freemanzxp/GBDT_Simple_Tutorial
第一棵树:




第二棵树:




第三棵树:




第四棵树:




第五棵树:





4.得到终究的强学习器:


5.猜测样本5:
  

  在中,样本4的年纪上海景点为25,大于区分节点21岁,又小于30岁,所以被猜测为0.2250。
  在
中,样本4的...此处省掉...所以被猜测为0.2025
    为什么是0.2025?这是依据第二颗树得到的,能够GitHub简略运转一下代码
  在
中,样本4的...此处省掉...所以被猜测为0.1823
  在
中,样本4的...此处省掉...所以被猜测为0.1640
  在
中,样本4的飞机上不能带什么...此处省掉...所以被猜测为0.1476
终究猜测成果:


4. 总结

   &n掉头发是什么原因bsp; 本文从GBDT算法的原理到实例详解进行了详细描述,可是现在只写了回归问题,GitHub上的代码也是完成了回归、二分类、多分类以及树的可视化,期望咱们持续批评指正,感谢各位的重视。本文GitHub地址:

https://github.com/Freemanzxp/GBDT_Simple_Tutorial



【注】:本文系原作者授权投稿在本大众号文章,概况可点击阅览原文链接。



 


参考资料:

李航 《计算学习办法》

Friedman J H . Greedy Function Approximation: A Gradient Boosting Machine[J]. The Annals of Statistics, 2001, 29(5):1189-1232.



往期精彩:

数学推导+纯Python完成机器学习算法9:线性支撑向量机

数学推导+纯Python完成机器学习算法8:线性可分支撑向量机

数学推导+纯Python丫丫,小鸡炖蘑菇的做法-冥王号:辛辛苦苦飞过来,小行星的暗码完成机器学习算法7:神经网络

数学推导+纯Python完成机器学习算法6:感知机

数学推导+纯Python完成机器学习算法5:决策树之CART算法

数学推导+纯Python完成机器学习算法4:丫丫,小鸡炖蘑菇的做法-冥王号:辛辛苦苦飞过来,小行星的暗码决策树之ID3算法

数学推导+纯Python完成机器学习算法3:k近邻

数学推导+纯P丫丫,小鸡炖蘑菇的做法-冥王号:辛辛苦苦飞过来,小行星的暗码ython完成机器学习算法2:逻辑回归

数学推导兰州宏刚美术+纯Python完成机器学习算法1:线性回归

一个计算数据人的职业生涯第一年

深度学习第60讲:深度学习笔记系列总结与感悟

谈谈过拟合







一个数据科学从业者的学习进程

长按二维码.重视机器学习实验室


the end
冥王号:辛辛苦苦飞过来,小行星的密码