Class 1 决策树
决策树介绍
概述
决策树是如何工作的
决策树(Decision Tree)是一种非参数的有监督学习方法,它能够从一系列有特征和标签的数据中总结出决策规则,并用树状图的结构来呈现这些规则,以解决分类和回归问题
节点:
最初的问题所在的地方叫做根节点,在得到结论前的每一个问题都是中间节点,而得到的每一个结论(动物的类别)都叫做叶子节点
决策树算法的核心是要解决两个问题:
1)如何从数据表中找出最佳节点和最佳分枝?
2)如何让决策树停止生长,防止过拟合?
Skleran中的决策树
模块 sklearn.tree
sklearn模型建立流程
分类树对应的代码
from sklearn import tree #导入需要的模块
clf = tree.DecisionTreeClassifier() #实例化
clf = clf.fit(X_train,y_train) #用训练集数据训练模型
result = clf.score(X_test,y_test) #导入测试集,从接口中调用需要的信息
分类树 DecisionTreeClassifier与红酒数据集
重要参数
criterion(规定不纯度的计算)
这个参数是确定计算不纯度的方法
对分类树来说,衡量最佳节点和最佳的分枝方法这个“最佳”的指标叫做“不纯度”
通常来说,不纯度越低,决策树对训练集的拟合越好。现在使用的决策树算法在分枝方法上的核心大多是围绕在对某个不纯度相关指标的最优化上
Criterion这个参数正是用来决定不纯度的计算方法的。sklearn提供了两种选择:
1)输入”entropy“,使用信息熵(Entropy)
2)输入”gini“,使用基尼系数(Gini Impurity)
比起基尼系数,信息熵对不纯度更加敏感,对不纯度的惩罚最强。但是在实际使用中,信息熵和基尼系数的效果基本相同
决策树的计算流程
random_state & splitter(控制决策树的随机模式)
random_state用来设置分枝中的随机模式的参数,默认None,确定了random_state后,模式就固定下来了,低维度的数据(比如鸢尾花数据集),随机性几乎不会显现
splitter也是用来控制决策树中的随机选项的有两种输入值,
输入”best",决策树在分枝时虽然随机,但是还是会优先选择更重要的特征进行分枝
输入“random",决策树在分枝时会更加随机,树会因为含有更多的不必要信息而更深更大,并因这些不必要信息而降低对训练集的拟合。
class_weight & min_weight_fraction_leaf (目标权重参数)
在样本不平衡的时候使用,完成样本标签平衡的参数。样本不平衡是指在一组数据集中,标签的一类天生占有很大的比例,比如说一个人信用是否良好,99%都是良好,但是不代表那1%我们不在乎。
因此我们要使用class_weight参数对样本标签进行一定的均衡,给少量的标签更多的权重,让模型更偏向少数类,向捕获少数类的方向建模。该参数默认None,此模式表示自动给与数据集中的所有标签相同的权重
min_weight_fraction_leaf这个基于权重的剪枝参数来使用(基于权重的剪枝)
剪枝参数
为什么要进行剪枝
max_depth (树的深度)
限制树的最大深度,超过设定深度的树枝全部剪掉,这是用得最广泛的剪枝参数,在高维度低样本量时非常有效。决策树多生长一层,对样本量的需求会增加一倍,所
以限制树深度能够有效地限制过拟合。在集成算法中也非常实用。实际使用时,建议从=3开始尝试,看看拟合的效果再决定是否增加设定深度
min_samples_leaf & min_samples_split
min_samples_leaf :叶子节点最小包含的样本数
一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分枝就不会发生,或者,分枝会朝着满足每个子节点都包含min_samples_leaf个样本的方向去发,一般搭配max_depth使用,在回归树中有神奇的效果,可以让模型变得更加平滑
min_samples_split:中间节点最小包含的样本数
一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分枝,否则分枝就不会发生
max_features & min_impurity_decrease
max_features
max_features限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃
min_impurity_decrease
min_impurity_decrease限制信息增益的大小,信息增益小于设定数值的分枝不会发生
确定最优的剪枝参数
使用确定超参数的曲线来进行判断,
**超参数的学习曲线:**一条以超参数的取值为横坐标,模型的度量指标为纵坐标的曲线,它是用来衡量不同超参数取值下模型的表现的线
import matplotlib.pyplot as plt
test = []
for i in range(10):
clf = tree.DecisionTreeClassifier(max_depth=i+1
,criterion="entropy"
,random_state=30
,splitter="random"
)
clf = clf.fit(Xtrain, Ytrain)
score = clf.score(Xtest, Ytest)
test.append(score)
plt.plot(range(1,11),test,color="red",label="max_depth")
plt.legend()
plt.show()
重要属性和接口
feature_importances_
特征对这个决策树的特征
>>>
clf.feature_importances_
>>>
array([0. , 0.04084697, 0. , 0. , 0. ,
0. , 0.298995 , 0. , 0. , 0.14117746,
0. , 0.03251792, 0.48646265])
更直观的展示
>>>
# 更直观的观察特征的重要性
[*zip(feature_names,clf.feature_importances_)]
>>>
[('酒精', 0.0),
('苹果酸', 0.040846969416378096),
('灰', 0.0),
('灰的碱性', 0.0),
('镁', 0.0),
('总酚', 0.0),
('类黄酮', 0.2989950010851191)