决策树是一种十分常用的分类方法,需要监督学习。
决策树是一种树形结构,其中每个内部节点表示基于一个特征的一次判断,每个分支代表一个判断结果的输出,最后每个叶节点代表一种分类结果。
比较常用的决策树有ID3,C4.5和CART(Classification And Regression Tree),CART的分类效果一般优于其他决策树。
ID3:根据信息增益来决定结点
在信息论里面,信息熵衡量信息量的大小,也就是对随机变量不确定度的一个衡量。熵越大,不确定性越大。
条件熵
当熵和条件熵中的概率由数据估计(特别是极大似然估计)得到时,所对应的熵与条件熵分别称为经验熵和经验条件熵。经验条件熵就是在某一条件约束下的经验熵。
信息增益表示得知特征X的信息而使得类Y的信息的不确定性减少的程度。
一般地,熵H(Y)与条件熵H(Y|X)之差称为互信息(mutual information)。决策树学习中的信息增益等价于训练数据集中类与特征的互信息。
决策树学习应用信息增益准则选择特征。不同的特征往往具有不同的信息增益,信息增益大的特征具有更强的分类能力。
计算信息增益实例
希望通过所给的训练数据学习一个贷款申请的决策树,用以对未来的贷款申请进行分类,即当新的客户提出贷款申请时,根据申请人的特征利用决策树决定是否批准贷款申请。
二分问题。经验熵算“是”和“不是”这两个。
特征分的越细越准确,也导致过拟合。
https://zhuanlan.zhihu.com/p/41134986
C4.5 根据信息增益比来决定结点
ID3中使用了信息增益选择特征,增益大优先选择。C4.5中,采用信息增益比选择特征,减少因特征值多导致信息增益大的问题。CART分类树算法使用基尼系数来代替信息增益比,基尼系数代表了模型的不纯度,基尼系数越小,不纯度越低,特征越好。这和信息增益(比)相反。
CART分类回归树
根据基尼指数来进行特征选择
对于决策树来说,每一个结点都代表了一个对于当前集合来说基尼指数最小的特征及特征值,因此我们需要计算对于当前集合来说基尼指数最小的特征及特征值
为了计算基尼指数,我们要把当前的数据集进行划分(CART算法生成的是二叉树,只需把数据集划分为两个子集即可)
递归停止的条件也即是决策树不再生成的条件:
- 当前生成的决策树高度过高
- 当前结点的样本集合为空或当前结点的样本集合过小
https://blog.youkuaiyun.com/eye_water/article/details/80277439
调用sklearn实现
https://www.cnblogs.com/zhoukui/p/8883409.html
# 导入需要的算法库和模块
from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
import graphviz
划分训练集和测试集
# test_size 参数表示:测试集在数据集中的比例
wine = load_wine()
Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data,wine.target,test_size=0.3)
训练模型
clf = tree.DecisionTreeClassifier(criterion="entropy",splitter="random")
clf = clf.fit(Xtrain,Ytrain)
参数 criterion 表示选择特征的准则,默认是 ‘gini’,也就是基尼系数了,sklearn 库是使用的改良后的 CART 算法。当然你也可以设置成 ‘entropy’,即信息增益,具体使用哪个,需要实验看看模型效果。
参数splitter设置划分点的选择标准。默认是 ‘best’,表示在所有特征中找最好的切分点。也可以选择 ‘random’,表示随机地在部分特征中选择最好的切分点(数据量大的时候),所以默认的 ‘best’ 适合样本量不大的时候,而如果样本数据量非常大,可尝试使用 ‘random’ 。
max_depth 参数设置决策树的最大层数,默认值是 None. 如果树形比较简单的话一般选择默认就行了,如果树形太过于复杂,可以设置一下最大层数。
min_samples_split
该参数表示分裂所要求的最少样本,默认值为 2