决策树

决策树

1.定义:分类决策树模型是一种描述对实例进行分类的树形结构。决策树由节点和有向边组成。节点有两种类型:内部结点和叶结点,内部结点表示一个特征或属性,叶结点表示一个类。用决策树分类,从根节点开始,对实例的某一特征进行测试,根据测试结果,将实例分配到其叶子节点;这时,每一个子结点对应着该特征的一个取值,如此递归地对实例进行测试并分配,知至达到叶结点。最后将实例分配到叶结点的类中。
2.树模型
       决策树:从根节点开始一步步走到叶子节点(决策)
       所有的数据最终都会落到叶子节点,既可以做分类也可以做回归。
决策树
3.树的组成
       根节点:第一个选择点。
       非叶子节点与分支:中间过程。
       叶子节点:最终的决策结果。
决策树
4.决策树的训练与测试
       训练阶段:从给定的训练集构造出一棵树(从根节点开始选择特征,如何进行特征切分)。
       测试阶段:根据构造出来的模型从上到下走一遍就好了。
       一旦构造好了决策树,那么分类或者预测任务就简单多了,只需要走一遍就可以了,那么难点就在于如何构造出来一棵树,这就没那么简单,需要考虑的问题还有很多。
5.如何切分特征(选择节点)
       问题:根节点的选择该用哪些特征呢?接下来如何切分呢?
       想象一下:我们的目标应该是根节点就像一个老大似的能更好地切分数据(分类效果更好),根节点下面的节点自然就是二当家了。
       目标:通过一种衡量标准,来计算通过不同特征进行分支选择后的分类情况,找出来最好的那个当成根节点,以此类推。
6.衡量标准-熵
       熵:熵是表示随机变量不确定性的度量(解释:说白了就是物体内部的混乱程度,比如杂货市场里面什么都有,那肯定混乱,专卖店只卖一个牌子,那肯定稳定多了)。公式如下:H(X)=i=1npilogpiH\left( X \right)=-\sum\limits_{i=1}^{n}{{{p}_{i}}\log {{p}_{i}}}
       一个例子:A集合[1,1,1,1,1,1,1,1,2,2]、B集合[1,2,3,4,5,6,7,8,9,1]
       虽然A集合的熵值要低,因为A里面只有两种类别,相对稳定一些。而B中类别太多,熵值就会大很多。(在分类任务中我们希望通过节点分支后数据类别的熵值大还是小呢?)
       不确定性越大,得到的熵值也就越大。
       当p=0或p=1时,H§=0,随机变量完全没有不确定性;
       当p=0.5时,H§=1,随机变量的不确定性最大。
       如何决定一个节点的选择?信息增益。
       介绍信息增益之前,我介绍一下条件熵$ H\left( Y|X \right)$表示在已知随机变量X的条件下随机变量Y的不确定性,其公式如下:
H(YX)=i=1npiH(YX=xi) H\left( Y|X \right)=\sum\limits_{i=1}^{n}{{{p}_{i}}H\left( Y|X={{x}_{i}} \right)}
       信息增益:表示特征X是的类Y的不确定性减少的程度(分类后的专一性,希望分类后的结果是同类在一起的)。信息增益的公式如下:
g(X)=H(X)H(YX) g\left( X \right)=H\left( X \right)-H\left( Y|X \right)
7.决策树构造实例
       数据:14天打球情况。
       特征:4中环境变化。
       目标:构造决策树。
决策树
       划分方式:4种。
       问题:谁当根节点?
       依据:信息增益。
决策树
       在历史数据中(14天)有9天打球,5天不打球,所以此时的熵应为:
914log2914514log2514=0.940 -\frac{9}{14}{{\log }_{2}}\frac{9}{14}-\frac{5}{14}{{\log }_{2}}\frac{5}{14}=0.940
       4个特征逐一分析,先从outlook特征开始:
       outlook = sunny时,熵值为0.971。
       outlook = overcast时,熵值为0。
       outlook = rainy时,熵值为0.971。
       根据数据统计,outlook取值分别为sunny,overcast,rainy的概率分别为:5/14, 4/14, 5/14。
       条件熵值计算:outlook的条件熵为5/14 * 0.971 + 4/14 * 0 + 5/14 * 0.971 = 0.693
       信息增益:outlook的熵值从原始的0.940下降到0.693,增益为0.247
       同样的方式可以计算出其他特征的信息增益,那么我们选择最大的那个就可以了,相当于遍历了一遍特征,找出来了大当家,然后在其余的特征中继续通过信息增益找二当家。(gain(temperature)=0.029,gain(humidity)=0.152 ,gain(windy)=0.048)
8.决策树算法
       ID3:信息增益(以信息增益作为划分训练数据集的特征,存在偏向于选择取值较多的特征的问题。)
       C4.5:信息增益率(解决ID3问题,考虑自身熵)
特征X对数据集的信息增益比g_R (X)定义为其信息增益g(X)与训练数据集关于特征X的值的熵H(X)之比,即gR(X)=g(X)H(X){{g}_{R}}\left( X \right)=\frac{g\left( X \right)}{H\left( X \right)}
       当特征数量较少时,H(X)相对也会变小,则g_R (X)会变大。偏向于取较小特征。
       CART:使用GINI指数来当衡量标准。
Gini(p)=i=1Kpk(1pk)=1i=1Kpk2Gini\left( p \right)=\sum\limits_{i=1}^{K}{{{p}_{k}}\left( 1-{{p}_{k}} \right)=1-}\sum\limits_{i=1}^{K}{{{p}_{k}}^{2}}
       其中K为样本的标签个数。每个特征X根据GINI指数选取各自的最优切点,然后选取所有特征的GINI指数最小的切分点所对应的特征作为根节点。
9.连续值怎么办?
决策树
       切分成几个类标签,然后进行决策树算法。这里也可以考虑CART的最小二乘回归树。
10.决策树剪枝策略
       剪枝原因:决策树过拟合风险很大,理论上可以完全分开数据的(想象一下,如果数足够庞大,每个叶子节点不就一个数据了嘛)。
       剪枝策略:预剪枝,后剪枝。
       预剪枝:便建立决策树边进行剪枝的操作(更实用)。
       后剪枝:党建立完决策树后再进行剪枝操作。
       预剪枝:限制深度,叶子节点个数,叶子节点样本数,信息增益等
       后剪枝:通过一定的衡量标准:Cα(T)=C(T)+αTleaf{{C}_{\alpha }}\left( T \right)=C\left( T \right)+\alpha \centerdot \left| {{T}_{leaf}} \right|
11.项目实战

import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.datasets.california_housing import fetch_california_housing
#获取sklearn中封装好的加利福尼亚房屋的数据集
housing = fetch_california_housing()
#输出数据集的描述
print(housing.DESCR)

决策树

from sklearn import tree
#设置深度为2,是为了不让决策树的图分页
dtr = tree.DecisionTreeRegressor(max_depth=2)
dtr.fit(housing.data[:,[6,7]],housing.target)
#要可视化显示 首先需要安装 graphviz   http://www.graphviz.org/Download..php
dot_data = tree.export_graphviz(dtr,
				out_file=None,
				feature_names=housing.feature_names[6:8],
				filled=True,
				impurity=False,
				rounded=True)
#pip install pydotplus
import pydotplus
graph = pydotplus.graph_from_dot_data(dot_data)
graph.get_nodes()[7].set_fillcolor('#FFF2DD')
from IPython.display import Image
Image(graph.create_png())

决策树

from sklearn.model_selection import train_test_split
#random_state=42是为了每次产生的随机数为相同的
data_train,data_test,target_train,target_test=train_test_split(housing.data,
								housing.target,
								test_size=0.1,
								random_state=42)
dtr= tree.DecisionTreeRegressor(random_state=42)
dtr.fit(data_train,target_train)
dtr.score(data_test,target_test)

输出结果:0.637355881715626
12.树模型参数:

  • 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”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高。这个参数在sklearn 0.20版本已经移除。
  • 10.min_impurity_split 这个值限制了决策树的增长,如果某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值则该节点不再生成子节点。即为叶子节点 。
    -11. n_estimators:要建立树的个数
    参考文章:
    《统计学习方法》
    https://blog.****.net/woaixuexihhh/article/details/85196760
    https://blog.****.net/tangyudi/article/details/77822212