决策树算法最主要要解决的问题:
- 怎么在数据表中找到最佳分支和最佳的节点
- 怎么防止过拟合和欠拟
决策树
在sklearn中
sklearn中的决策树都在sklearn.tree中
from sklearn.tree import DecisionTreeClassifier
clf = DecisionTreeClassifier()
clf = clf.fit(X_train, y_train)
result = clf.score(X_test, y_test)
重要参数
1.criterion
衡量最佳指标叫不纯度,不纯度越低,决策树对训练数据的拟合效果越好。
不纯度有两种计算方法:
- 'entropy', 信息熵
- 'gini',基尼系数
在实际使用中这两种计算方式效果差不多。
因为信息熵对不纯度更加敏 感,所以信息熵作为指标时,决策树的生长会更加“精细”,因此对于高维数据或者噪音很多的数据,信息熵很容易 过拟合。
基尼系数在这种情况下效果往往比较好。当模型拟合程度不足的时候,即当模型在训练集和测试集上都表 现不太好的时候,使用信息熵。当然,这些不是绝对的。
当然我们可以两种都试一试。
2.random_state & splitter
random_state用于设置分枝的随机模式的参数,就如随机种子一般
splitter控制决策树中的随机选项,两种输入值
'best'
决策树在分支的时候虽然是随机,但是还是会选择更加重要的特征来进行分支
'random'
决策树在分支时会更加随机,因此树就会在不必要的信息上分支生长深,并且因为这些不必要的信息反而降低了对训练集的拟合。
3.剪枝参数
我们如果不进行任何限制,决策树会生长到不纯度最优,或者用到没有特征可用,这样我们的决策树通常会过拟合。剪枝参数是对决策树过拟合解决的最好调节方法了, 可以说剪枝是决策树的核心
-
max_depth
限制树的最大深度,超过设定深度的树枝全部剪掉 -
min_samples_leaf & min_samples_split
min_samples_leaf限制一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分 枝就不会发生或者分枝会朝着满足每个子节点都包含min_samples_leaf个样本的方向去发生
min_samples_split限定,一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分枝,否则 分枝就不会发生。
这两个参数差不多 -
max_features&min_impurity_decrease
最大使用的特征数max_features,超过限制个数的特征就会被舍弃
最小的信息增益min_impurity_decrease -
class_weight&min_weight_fraction_leaf
完成样本标签平衡的参数。样本不平衡是指在一组数据集中,标签的一类天生占有很大的比例。比如说,在银行要 判断“一个办了信用卡的人是否会违约”,就是是vs否(1%:99%)的比例。这种分类状况下,即便模型什么也不 做,全把结果预测成“否”,正确率也能有99%。因此我们要使用class_weight参数对样本标签进行一定的均衡,给 少量的标签更多的权重,让模型更偏向少数类,向捕获少数类的方向建模。该参数默认None,此模式表示自动给 与数据集中的所有标签相同的权重。
有了权重之后,样本量就不再是单纯地记录数目,而是受输入的权重影响了,因此这时候剪枝,就需要搭配min_ weight_fraction_leaf这个基于权重的剪枝参数来使用。另请注意,基于权重的剪枝参数(例如min_weight_ fraction_leaf)将比不知道样本权重的标准(比如min_samples_leaf)更少偏向主导类。如果样本是加权的,则使 用基于权重的预修剪标准来更容易优化树结构,这确保叶节点至少包含样本权重的总和的一小部分
如何确定最优的剪枝参数呢?
诚然我们可以画超参数的学习曲线。但是我们在实际中是没有什么条件去使用学习曲线的。如果你手中的数据集特别大,那么无论如何是需要剪枝的。
import graphviz
from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
wine = load_wine()
wine.data.shape
wine.target
wine.target_names
# 分割测试集和训练集
Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data,wine.target,test_size=0.3)
Xtrain.shape
Xtest.shape
# 建立模型
clf = tree.DecisionTreeClassifier(criterion="entropy"
,random_state=30
,splitter='best'
,max_depth=3
,min_samples_leaf=10
,min_samples_split=10
)
clf = clf.fit(Xtrain, Ytrain)
score = clf.score(Xtest, Ytest) #返回预测的准确度
score
# 画一棵树
dot_data = tree.export_graphviz(clf
,out_file = None
,feature_names= wine.feature_names
,class_names=wine.class_names
,filled=True
,rounded=True
)
graph = graphviz.Source(dot_data)
graph
# 特征重要性
clf.feature_importances_
[*zip(feature_name,clf.feature_importances_)]
重要属性和接口
对决策树来说,最重要的是feature_importances_,能 够查看各个特征对模型的重要性。
四个接口:fit,score,apply,predict
网友评论