Decision Tree
决策树非常之robust!
决策边界很有趣!
1.可线性分割吗?
![](https://img.haomeiwen.com/i3382609/8098e4989c59ea04.png)
2. 构建决策树(分割)
![](https://img.haomeiwen.com/i3382609/f3bb5bd949e58aac.png)
3. sklearn decision tree
![](https://img.haomeiwen.com/i3382609/4464b0e85166c908.png)
![](https://img.haomeiwen.com/i3382609/87570ede497b2573.png)
![](https://img.haomeiwen.com/i3382609/d2cd61f44258a896.png)
4. 决策树的准确性
![](https://img.haomeiwen.com/i3382609/485dde40b2f98988.png)
![](https://img.haomeiwen.com/i3382609/7cc867cb020613cc.png)
5. 决策树的参数
![](https://img.haomeiwen.com/i3382609/85f0c8fa8d4bf3d0.png)
最小样本分割
![](https://img.haomeiwen.com/i3382609/6729e6eb0588d97f.png)
决策树的准确性
![](https://img.haomeiwen.com/i3382609/1ad3a3a896a51464.png)
![](https://img.haomeiwen.com/i3382609/e68c998371fc20e7.png)
![](https://img.haomeiwen.com/i3382609/380f48e21d15ebb7.png)
6. 熵Entropy
![](https://img.haomeiwen.com/i3382609/fb3581c992e9dec1.png)
下图中,哪个更纯点?
==>右
![](https://img.haomeiwen.com/i3382609/c5a537ca61645058.png)
熵公式
![](https://img.haomeiwen.com/i3382609/04fe716b1504eae2.png)
Pi是第i类中的样本占总样本数的比例
![](https://img.haomeiwen.com/i3382609/ef71d21cf732d441.png)
7.熵的手工计算
![](https://img.haomeiwen.com/i3382609/951da967b392a0c4.png)
总共有多少node:
![](https://img.haomeiwen.com/i3382609/f598f6e6c4efb19f.png)
slow的Pi是多少:
![](https://img.haomeiwen.com/i3382609/1f2df40f0e80e588.png)
fast也不例外:
![](https://img.haomeiwen.com/i3382609/07db8f430028e7cb.png)
那么这个node的熵是多少呢?
![](https://img.haomeiwen.com/i3382609/e858898b715e40dc.png)
计算出来等于1.
python计算过程:
![](https://img.haomeiwen.com/i3382609/0d9793466609dd8a.png)
![](https://img.haomeiwen.com/i3382609/8b793dcf297f2d52.png)
熵=1
这是最坏的状况,entrophy=1。在这个节点,2个不同类的样本们被均分在这个节点。
8.信息增益Information Gain
![](https://img.haomeiwen.com/i3382609/88525725673df3c7.png)
练习1:信息增益计算
![](https://img.haomeiwen.com/i3382609/0eaf9a3d50af4a1c.png)
计算右侧这里这个节点的熵值:
![](https://img.haomeiwen.com/i3382609/675e4e5df05326d2.png)
===>为0,因为这个节点中的所有样本均属于同一类别。(在这个节点上,所有样本都是快速行驶)
练习2:计算Pi
![](https://img.haomeiwen.com/i3382609/db948779e1a20330.png)
![](https://img.haomeiwen.com/i3382609/86376f97d007cc52.png)
![](https://img.haomeiwen.com/i3382609/12dc7b848a201a22.png)
练习3:计算最终的information gain
![](https://img.haomeiwen.com/i3382609/e2d7f72bbe292c28.png)
![](https://img.haomeiwen.com/i3382609/ce3faff3bf496bae.png)
练习4:计算下一个特征变量bumpiness的信息增益
![](https://img.haomeiwen.com/i3382609/7165071f9ffdbc43.png)
![](https://img.haomeiwen.com/i3382609/9f3e1b1625824679.png)
练习5:如果我们根据颠簸程度来进行拆分,那我们会得到什么样的信息增益?
![](https://img.haomeiwen.com/i3382609/953b26dbf7da8d49.png)
练习6:当我们根据速度限制进行拆分时,会获得什么样的信息增益?
![](https://img.haomeiwen.com/i3382609/16ede4b1844c4ac0.png)
在speed拆分下,slow和fast的纯度达到最纯,所以entropy=0
![](https://img.haomeiwen.com/i3382609/f76913ed1bc5be2b.png)
9.mini project about DT
同样是邮件分类问题,之前用过了NB 和SVM,现在用DT:
![](https://img.haomeiwen.com/i3382609/7fadc33bf026f530.png)
![](https://img.haomeiwen.com/i3382609/3b31e210fb7ce0c7.png)
10. 控制算法复杂度的第2种方法
你从 SVM 迷你项目中了解到,参数调整可以显著加快机器学习算法的训练时间。一般情况下,参数可以调整算法的复杂度,越复杂的算法通常运行起来越慢。
控制算法复杂度的另一种方法是通过你在训练/测试时用到的特征数量。算法可用的特征数越多,越有可能发生复杂拟合。我们将在“特征选择”这节课中详细探讨,但你现在可以提前有所了解。
你数据中的特征数是多少?
(提示:数据被整理成一个 numpy 数组后,行数是数据点数,列数是特征数;要提取这个数字,只需运行代码 len(features_train[0])。)
简单来说,2种方法:调参 or 控制特征数量
![](https://img.haomeiwen.com/i3382609/bdce0bc7bc17cbe0.png)
![](https://img.haomeiwen.com/i3382609/afd67b6a2da6df23.png)
来看看如果把percentile = 10 修改为percentile = 1之后的模型的准确率会怎样,运行速度又如何:
![](https://img.haomeiwen.com/i3382609/0112362cb46444bd.png)
11. 中文版决策树(唐宇迪版)
11.1 决策树算法原理概述
![](https://img.haomeiwen.com/i3382609/ec1733a3efb1091d.png)
![](https://img.haomeiwen.com/i3382609/d48851f4b6696cc1.png)
叶子节点:最终到达的那个不会再分割的结果。
非叶子节点:还能分的节点。比如图中的 "is male",还没分完,最后的性别为Y 、N才是叶子节点
![](https://img.haomeiwen.com/i3382609/8d614c2bf7b5cb24.png)
![](https://img.haomeiwen.com/i3382609/271a0f0118567504.png)
难点:怎么把决策树构造出来呢?
![](https://img.haomeiwen.com/i3382609/443335d8c388e31a.png)
11.2 衡量标准-熵
![](https://img.haomeiwen.com/i3382609/5b462ae40353e432.png)
比如还有个集合c=(1,1,1,1,1)
里面全是1,非常纯。那么它的Log值为0,熵值也为0.最纯状态的熵值为0就是这么计算出来的。
![](https://img.haomeiwen.com/i3382609/9175d30bd677bc7f.png)
![](https://img.haomeiwen.com/i3382609/a7a39d8539890dc8.png)
信息增益: 也就是说熵减少了多少。
11.3决策树构造实例
拿到手的数据:
![](https://img.haomeiwen.com/i3382609/1c36051f0a40b241.png)
![](https://img.haomeiwen.com/i3382609/27d96dd0a88b2114.png)
![](https://img.haomeiwen.com/i3382609/4ed2ab6bd901d932.png)
![](https://img.haomeiwen.com/i3382609/06b9968787aae36a.png)
11.4 信息增益率
![](https://img.haomeiwen.com/i3382609/d06ce51b509b8af1.png)
![](https://img.haomeiwen.com/i3382609/96d3048deda3cc92.png)
ID3的问题就是,它把ID作为分割特征,每一个类都是熵值为0,但是有意义吗?---没有。所以不能再用这个了。
渐渐地又渐进。。。到了GINI系数,跟熵值差不多。
11.5决策树剪枝策略
![](https://img.haomeiwen.com/i3382609/96b50e3786598101.png)
![](https://img.haomeiwen.com/i3382609/81c85c9e360ed5dd.png)
![](https://img.haomeiwen.com/i3382609/05ef492044b9f7a5.png)
现阶段,一般都会选择预剪枝。
12.sklearn实现决策树
12.1 决策树涉及参数
树模型参数:
-
1.criterion gini or entropy
-
2.splitter best or random 前者是在所有特征中找最好的切分点 后者是在部分特征中(数据量大的时候)
-
3.max_features None(所有),log2,sqrt,N 特征小于50的时候一般使用所有的
-
4.max_depth 数据少或者特征少的时候可以不管这个值,如果模型样本量多,特征也多的情况下,可以尝试限制下
-
5.min_samples_split 如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。
-
6.min_samples_leaf 这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝,如果样本量不大,不需要管这个值,大些如10W可是尝试下5
-
7.min_weight_fraction_leaf 这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。
-
8.max_leaf_nodes 通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制具体的值可以通过交叉验证得到。
-
9.class_weight 指定样本各类别的的权重,主要是为了防止训练集某些类别的样本过多导致训练的决策树过于偏向这些类别。这里可以自己指定各个样本的权重如果使用“balanced”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高。
-
10.min_impurity_split 这个值限制了决策树的增长,如果某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值则该节点不再生成子节点。即为叶子节点 。
-
n_estimators:要建立树的个数
交叉验证:
![](https://img.haomeiwen.com/i3382609/597240db77079771.png)
13. 重要知识点
scikit-learn决策树算法类库内部实现是使用了调优过的CART树算法,既可以做分类,又可以做回归。分类决策树的类对应的是DecisionTreeClassifier,而回归决策树的类对应的是DecisionTreeRegressor。两者的参数定义几乎完全相同,但是意义不全相同。下面就对DecisionTreeClassifier和DecisionTreeRegressor的重要参数做一个总结,重点比较两者参数使用的不同点和调参的注意点。
DecisionTreeClassifier和DecisionTreeClassifier 重要参数调参注意点
为了便于比较,这里我们用表格的形式对DecisionTreeClassifier和DecisionTreeRegressor重要参数要点做一个比较。
![](https://img.haomeiwen.com/i3382609/d160a9c932d8eb1b.png)
![](https://img.haomeiwen.com/i3382609/aa5fca89bb700ad2.png)
![](https://img.haomeiwen.com/i3382609/d8370143b00ac912.png)
除了这些参数要注意以外,其他在调参时的注意点有:
1)当样本少数量但是样本特征非常多的时候,决策树很容易过拟合,一般来说,样本数比特征数多一些会比较容易建立健壮的模型
2)如果样本数量少但是样本特征非常多,在拟合决策树模型前,推荐先做维度规约,比如主成分分析(PCA),特征选择(Losso)或者独立成分分析(ICA)。这样特征的维度会大大减小。再来拟合决策树模型效果会好。
3)推荐多用决策树的可视化(下节会讲),同时先限制决策树的深度(比如最多3层),这样可以先观察下生成的决策树里数据的初步拟合情况,然后再决定是否要增加深度。
4)在训练模型先,注意观察样本的类别情况(主要指分类树),如果类别分布非常不均匀,就要考虑用class_weight来限制模型过于偏向样本多的类别。
5)决策树的数组使用的是numpy的float32类型,如果训练数据不是这样的格式,算法会先做copy再运行。
6)如果输入的样本矩阵是稀疏的,推荐在拟合前调用csc_matrix稀疏化,在预测前调用csr_matrix稀疏化。
(摘自:https://www.cnblogs.com/pinard/p/6056319.html)
** code **
![](https://img.haomeiwen.com/i3382609/e9a610adc62b74ad.png)
![](https://img.haomeiwen.com/i3382609/a39d39cfec083a05.png)
![](https://img.haomeiwen.com/i3382609/00107b7880b456ef.png)
![](https://img.haomeiwen.com/i3382609/4493a9c2e7e2adfb.png)
![](https://img.haomeiwen.com/i3382609/bc4ea39d4b625617.png)
![](https://img.haomeiwen.com/i3382609/6722eefee89c002b.png)