机器学习|【学习笔记】西瓜书机器学习之第四章(决策树)

1.什么是决策树?
决策树是一种常见的机器学习方法,以二分类为例,根据一系列的子决策来判断出样本是否为正例。 决策的过程是选择一个属性,来进行判断。以西瓜问题为例,假设已经训练好了一个模型。我们有一个西瓜,先看它的色泽,色泽为青绿色,然后一步一步往下走,最后得到这个西瓜是否为正例(好瓜)
机器学习|【学习笔记】西瓜书机器学习之第四章(决策树)
文章图片

2. 三种选择最优化分属性的方法
现在我们知道了决策树是如何工作的,但是该如何选择每个子决策所对应的属性呢?“纯度”将帮助我们解决这一问题,我们当然希望决策树分支节点所包含的样本尽可能属于同一类别,因此纯度越高越好。
2.1 信息增益(越大越好) 信息增益 = 信息熵-条件熵
条件熵:在已知样本属性a的取值下,度量样本集合纯度的一种指标。j是代表属性a的第j个值。
机器学习|【学习笔记】西瓜书机器学习之第四章(决策树)
文章图片

著名的ID3决策树学习算法就是以信息增益为准则来选择划分属性的。信息增益越大,意味着纯度提升越大。但是信息增益准则对可取数目较多的属性有所偏好。比如说每一个样本都具有编号,将编号加入到学习器中来的时候,毫无疑问在选择最优化分属性的时候编号将被选择,但是这样的模型完全不具备泛化能力。
2.2 信息增益率(越大越好) 为了解决上述问题,ID3的发明者罗斯昆兰提出了著名的C4.5算法,其中使用的核心方法便是信息增益率,信息增益率有效的解决信息增益带来的问题。信息增益率加入了一个惩罚项,来惩罚信息增益准则中对可取数目较多的属性的偏好。但又有一个新问题出现了信息增益率在惩罚可取值数目较多的属性的时候,又奖励哪些可取值数目较少的属性。现在,我们在C4.5的基础上进行两步骤来完善C4.5
step1:先找出信息增益高于平均数的属性
step2:在这些属性中找到信息增益率最好的属性
机器学习|【学习笔记】西瓜书机器学习之第四章(决策树)
文章图片

2.3 基尼系数(越小越好) CART决策树使用“基尼系数”来选择划分属性,基尼系数反映了从数据集D中随机抽取两个样本,其类别标记不一致的概率。因此Gini(D)越小,说明数据集的纯度越高。
3.sklearn中的代码实现

from sklearn.datasets import load_iris from sklearn.tree import DecisionTreeClassifier from sklearn.tree import plot_tree from sklearn.model_selection import train_test_split import matplotlib.pyplot as pltiris = load_iris()# 数据拆分 X = iris.data y = iris.target X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0, test_size=1 / 4)# 训练模型 tree_clf = DecisionTreeClassifier(criterion='entropy',max_depth=4,random_state=0) tree_clf.fit(X_train, y_train) score = tree_clf.score(X_test,y_test) print(score)# 数据可视化 plt.figure(figsize=(15, 9)) plot_tree(tree_clf, filled=True, feature_names=iris.feature_names, class_names=iris.target_names) plt.show()

值得一提的是,信息熵和基尼系数在大多数情况下没有什么不同。基尼不纯度的计算略微快一些,所以他是个不错的默认选项。它们的不同在于,基尼不纯度倾向于丛树枝中分裂出最常见的类别,而信息熵则倾向于产生更平衡的树。
5.剪枝处理
【机器学习|【学习笔记】西瓜书机器学习之第四章(决策树)】剪枝是决策树学习算法对付过拟合的主要手段,防止学习得太好了,从而导致泛化能力差。剪枝的基本策略有二:预剪枝和后剪枝。预剪枝是指在决策树生成过程中,对每个结点在划分前先进行估计,若当前节点的划分不能带来决策泛化能力的提升,则停止,个人觉得预剪枝的方法比较像sklearn中的max_depth,min_samples_split,min_samples_leaf等等。 而后剪枝则是在先从训练集中生成一颗完整的决策树,然后自底从上?对非叶节点进行考察,若该节点对应的子树结点能带来决策树的泛化能力提升,则将该子树替换为叶节点。通俗地将,如果将一个子节点的叶结点都收入子结点上,该子结点的验证集精度如果提高了,我们就可以进行剪枝。

    推荐阅读