决策树 - 分类树
关键概念:节点
根节点:没有进边,有出边。包含最初的,针对特征的提问。
中间节点:既有进边也有出边,进边只有一条,出边可以有很多条。都是针对特征的提问。
叶子节点:有进边,没有出边,每个叶子节点都是一个类别标签。
子节点和父节点:在两个相连的节点中,更接近根节点的是父节点,另一个是子节点。
DecisionTreeClassifier 与红酒数据集
建立一棵树
导入需要的算法库和模块
了解数据
分割训练集和数据集
建立模型
tree.score 可以对测试集,同样的,也可以对训练集
score_train = clf.score(Xtrain, Ytrain) # 注意这里是在训练集上计算score score_train --- 1.0
画出一棵树
逗号写在参数前面,方便注释,尤其是最后一行注释掉,不需要增删逗号
很遗憾图片并不能显示中文
保存 png 格式的 graphviz 输出的 dot 文件
dot_data = tree.export_graphviz(clf ,feature_names=feature_name ,class_names=['琴酒','雪莉','贝尔摩德'] ,filled=True ,rounded=True ,out_file="./tree.dot" )
注意这里要加
,out_file="./tree.dot"
,然后在与笔记同一目录下会生成一个tree.dot
文件找目录的方法import os print(os.path.abspath('.'))
看返回结果 cmd 到该目录下,执行
dot -Tpng tree.dot -o tree.png
继续探索决策树
重要参数
criterion 分枝指标
为了通过表格生成一棵决策树,我们需要找到最佳的节点和最佳的分枝方法,对分类树来说,衡量这个最佳的指标可以使用基尼系数,输入"gini",这也是 criterion 默认的值;使用信息熵,输入"entropy"二者的数学表示
代表给定的节点,代表标签的任一分类
这里我们尽量少提数学相关的内容,可以到统计学习方法中看决策树相关知识
基尼系数缺点:对不纯度相对不敏感。信息熵缺点:涉及对数计算,速度相对慢一点;对不纯度更敏感,尤其对于高维数据或者噪声很多的数据,容易过拟合
通常使用基尼系数数据维度很大,噪声很大的时候使用基尼系数维度低,数据比较清晰的时候,信息熵和基尼系数没区别当决策树拟合程度不够好的时候,使用信息熵
random_state 随机生成参数
实际上,无论决策树模型如何进化,在分枝上的本质都是追求某个不纯度相关的指标的优化,也就是说,决策树在建树时,是考优化节点来追求一棵优化的树,但即使我们在每个节点都选择最优分类结点,我们并不能保证整体数最优。集成算法被用来解决这个问题。sklearn 表示,既然一棵树不能保证最优,那就建更多的不同的树,然后从中取最好的。怎样从一组数据集中建不同的树?在每次分枝时,不从使用全部特征,而是随机选取一部分特征,从中选取不纯度相关指标最优的作为分枝用的节点。这样,每次生成的树也就不同了。
即使我们固定了 random_state=0 或者其他数字,由于训练集和数据集的划分是随机的。当我们重启 jupyter 的时候,数据集将不同。因此,即使固定 random_state,树仍有可能是不同的
splitter 随机生成参数
当我们预测到模型有可能过拟合,可以考虑调节 splitter 来降低过拟合的可能性。实际上,当书建成以后,我们也可以通过剪枝来防止过拟合
max_depth 剪枝参数
限制树的最大深度,超过设定深度的树枝会被全部剪掉对于一棵决策树,每多生长一层,对样本的需求量就会增加一倍,所以限制树的深度能够有效的限制过拟合默认五 None。如果为 None,决策树会持续生长直到虽有叶节点不纯度为 0,或者直到每个叶节点所含的样本量都小于参数 min_samples_split 中输入的数字
实际使用时,建议从=3 开始尝试,看看拟合的效果决定是否增加设定深度
生成决策树后我们需要用 score 评判决策树的好坏,如果 score 没有变化或者变化很小,说明剪枝后效果也很好,且计算更少(奥卡姆剃刀原理),所以选择剪枝
min_sample_leaf & min_samples_split 剪枝参数
min_samples_leaf 限定,一个节点在分枝后的每个子节点都必须包含至少 min_samples_leaf 个训练样本,否则分枝就不会发生,或者,分枝会朝着满足每个子节点都包含 min_samples_leaf 个样本的方向去发生如果输入整数,则认为输入的数字是叶节点存在所需的最小样本量;如果输入浮点数,则认为输入的浮点数是比例,即叶节点存在所需的最小样本量为输入模型的样本量浮点数
min_samples_split 就是对于中间结点而言的,同 min_sample_leaf
这里我们可以看到,如果我们限定的 min_sample_leaf 不合适,决策树可能被迫生成与数据集少部分数据相违背的决策树分枝,即
score_train = clf.score(Xtrain, Ytrain) score_train
结果不为 1.0
这个参数设置的太小会引起过拟合,设置的太大会阻止模型学习数据,一般来说,建议从=5 开始使用
max_features 剪枝参数
分枝时考虑的最大特征个数,超过限制个数的特征会被舍弃不建议使用该参数,因为其舍弃特征并不考虑特征的重要性。如果数据维度过多可以考虑 PCA 等方式降维来防止过拟合默认 None
允许参数详情查询 api
min_impurity_decrease 剪枝参数
限制不纯度降低的最小大小,不纯度下降小于设定数值,分枝不会发生
在前面说到,不纯度可以是基尼指数,也可以是信息增益
带权重的不纯度下降可以表示为
默认=0,接收浮点数
信息增益小也就意味着,该分枝对于区分该中间节点所对应的数据集作用并不大
class_weight & min_weight_fraction_leaf 目标权重参数
常用于样本不平衡的数据集中。样本不平衡是指在一组数据集中,标签的一类天生占有很大的比例。比如说,在银行要判断“一个办了信用卡的人是否会违约”,就是是 vs 否(1%:99%)的比例。这种分类状况下,即便模型什么也不做,全把结果预测成“否”,正确率也能有 99%。
建议查询官方 API,暂时用不到,用到回来补(其实现在我还不会用,也说不明白)
确认最优剪枝参数
一般我们可以结合 matplotlib 来绘制超参数学习曲线来进行判断超参数学习曲线,是一条以超参数的取值为横坐标,模型的度量指标为纵坐标的曲线,它是用来衡量不同超参数取值下模型的表现的线在我们建好的决策树里,我们的模型度量指标就是 score
重要接口和属性
之前提到过
feature_importances_,查看各个特征推模型的重要性
fit 用于生成决策树
score 用于评估决策树准确性
视频作者:菜菜TsaiTsai
版权声明: 本文为 InfoQ 作者【烧灯续昼2002】的原创文章。
原文链接:【http://xie.infoq.cn/article/c2500be4237a027b2f9f71876】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论