sklearn库学习----决策树(分类树DecisionTreeClassifier)
Posted iostreamzl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sklearn库学习----决策树(分类树DecisionTreeClassifier)相关的知识,希望对你有一定的参考价值。
概述
决策树是一种非参数的有监督学习方法,他能够从一系列有特征和标签的数据中总结出决策规则,并用树状图的结构呈现出这些规则,以解决分类和回归问题。
决策树算法的核心是解决两个问题
- 如何从数据表中找出最佳节点和最佳分支
- 如何让决策树停止生长,防止过拟合
sklearn中的决策树
sklearn中的决策树都在sklearn.tree模块下
类名 | 作用 |
---|---|
tree.DecisionTreeClassifier | 分类树 |
tree.DecisionTreeRegressor | 回归树 |
tree.export_graphviz | 将生成的决策树导出为DOT格式,画图使用 |
tree.ExtraTreeClassifier | 高随机版本的分类树 |
tree.ExtraTreeRegressor | 高随机版本的回归树 |
基本建模流程
重要参数
参数 | criterion |
---|---|
如何影响模型 | 确定不纯度计算方法,找出最佳节点和最佳分支,不纯度越低,决策树对训练集的拟合度越好 |
可选值 | gini–基尼系数(默认),entropy–信息增益 |
怎样选择 | 通常使用基尼(gini)系数,数据维度很大噪音很大使用基尼系数,维度低,数据比较清晰时gini和entropy没有区别。当决策树拟合度不够时使用entropy。最坏的情况,两个都试试选择好的 |
- random_state :用来设置分支中随机模式的参数,默认为None,高维度时随机性会表现得很明显,低纬度可能不会和明显
- splitter:用来控制决策树中的随机选项,输入为best时,决策树在分支时虽然随机,但是还是会优先选择更重要的特征来进行分支(特征重要性可以通过feature_importances_ 查看);输入random决策树在分支时会更加随机,训练集的拟合很可能会降低
from sklearn.tree import DecisionTreeClassifier
# 使用红酒数据集联系决策树
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
wine = load_wine()
# 数据集分割
X_train, X_test, y_train, y_test = train_test_split(wine['data'], wine['target'], test_size=0.3, random_state=1)
##### 训练模型
dtcf = DecisionTreeClassifier(criterion='entropy',
splitter='best',
random_state=1
)
# criterion 可选gini--基尼系数, 和entropy---信息熵
dtcf.fit(X_train, y_train)
score = dtcf.score(X_test, y_test)
score # 在我这里结果为0.9444444444444444
# 画出决策树
import graphviz
from sklearn.tree import export_graphviz
dot_data = export_graphviz(dtcf,
feature_names=wine['feature_names'],
class_names=wine['target_names'],
filled=True,
rounded=True)
# filled参数设置是否颜色填充
# rounded显示为圆角矩形
graph = graphviz.Source(dot_data)
graph
剪枝参数
在不加限制的情况下,一颗决策树会生长到衡量不纯度的指标最优,或者没有更多的可用特征为止,这样的决策树往往会过拟合,即在训练集上表现很好,在测试集上表现不尽人意。
为了让决策树有更好的泛化性,需要对决策树进行剪枝。剪枝策略对决策树的影响巨大,正确的剪枝策略是优化决策树的核心
-
max_depth(应用最广泛), 跟节点不计算在深度中
限制树的最大深度,超过深度的树枝全部剪掉 -
min_samples_leaf: 子节点最小包含样本数,一般搭配max_depth使用
图中可以看到,分支后其中一个子节点样本数为2 。若设置参数值为5.则该分支将不会出现或者sklearn自动找到一种合理的分支方式 -
min_samples_split:节点最少包含样本数
还是以上图为例,若设置参数值为20.可见samples=2的这个节点不满足条件,则这个节点将不能在继续产生分支 -
max_features & min_impurity_decrease
一般max_depth使用,用作树的“精修”
max_features限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃。和max_depth异曲同工,max_features是用来限制高维度数据的过拟合的剪枝参数,但其方法比较暴力,是直接限制可以使用的特征数量而强行使决策树停下的参数,在不知道决策树中的各个特征的重要性的情况下,强行设定这个参数可能会导致模型学习不足。如果希望通过降维的方式防止过拟合,建议使用PCA,ICA或者特征选择模块中的降维算法。
min_impurity_decrease限制信息增益的大小,信息增益小于设定数值的分枝不会发生。这是在0.19版本种更新的功能,在0.19版本之前时使用min_impurity_split。 -
确认最优的剪枝参数
那具体怎么来确定每个参数填写什么值呢?这时候,我们就要使用确定超参数的曲线来进行判断了,继续使用我们已经训练好的决策树模型。超参数的学习曲线,是一条以超参数的取值为横坐标,模型的度量指标为纵坐标的曲线,它是用来衡量不同超参数取值下模型的表现的线。在我们建好的决策树里,我们的模型度量指标就是score。
eg. 看max_depth参数对决策树的影响
import matplotlib.pyplot as plt
%matplotlib inline
scores = []
for i in range(1,11) :
##### 训练模型
dtcf = DecisionTreeClassifier(criterion='entropy',
splitter='best',
random_state=1,
max_depth=i
)
# criterion 可选gini--基尼系数, 和entropy---信息熵
dtcf.fit(X_train, y_train)
score = dtcf.score(X_test, y_test)
scores.append(score)
plt.plot(range(10), scores)
plt.show()
print(scores)
目标权重参数
- class_weight & min_weight_fraction_leaf
完成样本标签平衡的参数。样本不平衡是指在一组数据集中,标签的一类天生占有很大的比例。比如说,在银行要判断“一个办了信用卡的人是否会违约”,就是是vs否(19: 996)的比例。这种分类状况下,即便模型什么也不做,全把结果预测成“否”,正确率也能有99%。因此我们要使用class—weight参数对样本标签进行一定的均衡,给少量的标签更多的权重,让模型更偏向少数类,向捕获少数类的方向建模。该参数默认None,此模式表示自动给与数据集中的所有标签相同的权重
有了权重之后,样本量就不再是单纯地记录数目,而是受输入的权重影响了,因此这时候剪枝,就需要搭配min_weight_fraction_leaf这个基于权重的剪枝参数来使用。另请注意,基于权重的剪枝参数(例如min_weight_fraction_leaf)将比不知道样本权重的标准(比如min_samples_leaf)更少偏向主导类。如果样本是加权的,则使用基于权重的预修剪标准来更容易优化树结构,这确保叶节点至少包含样本权重的总和的一小部分。
class_weight参数是字典类型,{类别名 : 权值}
参数调优手段-----网格搜索
# 通过网格搜索来调参------缺陷很耗时间
# 能够帮助我们同时调整多个参数,本质是枚举
# 网格搜索的一个缺陷是无法舍弃参数,导致可能最后的结构没有自己手调参数的结果好
# 构建参数字典
# key----参数
# value----参数的取值范围
parameters = {
'random_state' : [1],
"criterion" : ['gini', 'entropy'],
'max_depth' : range(1, 10),
'splitter' : ['random', 'best'],
'min_samples_split' : range(5, 30, 5),
'min_samples_leaf' : range(1, 5)
}
dtc = DecisionTreeClassifier()
GS = GridSearchCV(dtc, param_grid=parameters, cv=10)
GS = GS.fit(X_train, y_train)
GS.best_params_
"""
{'criterion': 'gini',
'max_depth': 4,
'min_samples_leaf': 1,
'min_samples_split': 25,
'random_state': 1,
'splitter': 'random'}
"""
GS.best_score_
# 0.8167202572347267
以上是关于sklearn库学习----决策树(分类树DecisionTreeClassifier)的主要内容,如果未能解决你的问题,请参考以下文章
sklearn库学习------决策树(回归树DecisionTreeRegressor)
机器学习 sklearn 监督学习 分类算法 决策树 DecisionTree