决策树常用参数调优
sklearn-决策树
sklearn基本建模流程
1、实例化,建立评估模型对象—>2、通过模型接口训练模型—>3、通过模型接口提取需要的信息
决策树一种非参数的有监督学习方法,能从一系列有特征和标签的数据中总结出决策规则,并用树状图的结构来呈现这些规则,以解决分类和回归问题。
1、数据集导入
#导包
from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
#使用红酒数据集
wine = load_wine()
wine
可见数据集里面的数据多且杂乱无序,下一步将数据写入到DataFrame中
#红酒数据集形状
wine.data.shape
#红酒数据集标签
wine.target
import pandas as pd
pd.concat([pd.DataFrame(wine.data),pd.DataFrame(wine.target)],axis=1)
2、查看数据信息
#红酒数据集特征名称
wine.feature_names
#红酒数据集标签名称
wine.target_names
3、划分数据集
#划分测试集和训练集
Xtrain,Xtest,Ytrain,Ytest=train_test_split(wine.data,wine.target,test_size=0.3)
#查看Xtrain数据
Xtrain
#查看X测试集数据形状
Xtest.shape
4、初步绘制出一棵树
1)决策树基本流程可以简单概括了:
2)参数解释
criterion :确定不纯度的计算方法,找出最佳节点和最佳分枝,不纯度越低,决策树的训练集的拟合越好
可以填写gini使用基尼系数(默认),填写entropy使用信息增益
如何选取:一般使用基尼系数,数据维度大,噪音大时使用基尼系数,维度低,数据清洗时,使用信息熵,也可以两个进行测试,哪个效果好使用哪个。
3)开始建立一棵树:
#实例化
clf =tree.DecisionTreeClassifier(criterion='entropy')
#数据代入训练
clf = clf.fit(Xtrain,Ytrain)
#使用接口导入测试集
score = clf.score(Xtest,Ytest)#返回预测的准确度
score
结果每次是不一样的,随机数选取每运行一次结果都不同
feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青素','颜色强度','色调','od280/od315稀释葡萄酒','脯氨酸']
#画树用到的库
import graphviz
dot_data = tree.export_graphviz(clf
,feature_names=feature_name
,class_names=['琴酒','雪莉','贝尔摩德']
,filled = True #颜色
,rounded=True) #形状
graph = graphviz.Source(dot_data)
graph
#特征重要性系数
clf.feature_importances_
#特征重要性系数及名称
[*zip(feature_name,clf.feature_importances_)]
4)引入新的参数
random_state:用来设置分支中的随机模式的参数,默认为None,在高维度时,随机性会表现更明显,输入任意整数
会一直长出同一棵树,让模型稳定下来。
#实例化
clf =tree.DecisionTreeClassifier(criterion='entropy',random_state=30)
#数据代入训练
clf = clf.fit(Xtrain,Ytrain)
#使用接口导入测试集
score = clf.score(Xtest,Ytest)#返回预测的准确度
score
这样每次返回的结果都会相同,一直都是0.98148148…
splitter:也是用来控制决策树中的随机选项的,有两种输入值,输入’best’,决策树在分支时虽然随机,但是优先
选择更重要的特征进行分枝,输入‘random’分枝时会更加随机。
clf =tree.DecisionTreeClassifier(criterion='entropy',random_state=30,splitter='random')
clf = clf.fit(Xtrain,Ytrain)
score = clf.score(Xtest,Ytest)#返回预测的准确度
score
import graphviz
dot_data = tree.export_graphviz(clf
,feature_names=feature_name
,class_names=['琴酒','雪莉','贝尔摩德']
,filled = True #颜色
,rounded=True) #形状
graph = graphviz.Source(dot_data)
print(type(graph))
print(graph)
graph
可见准确性降低,但是决策树深度增加,其实就是随机性增加了,为了更好的随机性可将该参数注释掉
5)查看此时的拟合程度(未对剪枝参数进行调优时)
#拟合程度
score_train = clf.score(Xtrain,Ytrain)
score_train
这个模型还不错训练集拟合程度为1,测试集也超过了0.95,但是轻微过拟合在训练集上比测试集上要好
5、决策树和心调优
剪枝参数
max_depth:树的最大深度,超过最大深度的数值都会被剪掉
min_samples_leaf:一个节点在之后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分支不会发生
min_samples_split:一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分支,否则分枝就不会发生
max_features:max_features限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃,默认值为总特征个数开平方取值
min_impurity_decrease:限制信息增益的大小,信息增益小于设定数值的分枝不会发生
clf =tree.DecisionTreeClassifier(criterion='entropy'
,random_state=0
,splitter='random'
,max_depth=3
# ,min_samples_leaf=10
# ,min_samples_split=10
)
#训练
clf = clf.fit(Xtrain,Ytrain)
dot_data = tree.export_graphviz(clf
,feature_names=feature_name
,class_names=['琴酒','雪莉','贝尔摩德']
,filled = True #颜色
,rounded=True) #形状
graph = graphviz.Source(dot_data)
graph
score = clf.score(Xtest,Ytest)#返回预测的准确度
score
可见剪枝参数进行调优后准确度下降了,所以该模型并没有达到最优状态,等到调到最优时候可查看分节点。
# apply返回每个测试样本所在的叶子节点的索引
clf.apply(Xtest)
# predict返回每个测试样本的分类返回的结果
clf.predict(Xtest)
6、学习曲线绘制
当然剪枝参数不是盲目调的,可以根据学习曲线看从几开始达到最优状态,因此进行最优参数调整
#绘制学习曲线,确定最优剪枝参数
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)
print(type(test))
plt.plot(range(1,11),test,color='red',label='max_depth')
plt.legend()
plt.show()
上图即为展示树的最大深度的最优参数,可见从3之后,该曲线趋于平稳状态,所以我可以设置max_depth=3,其它叶子节点的一些前剪枝和后剪枝参数也可以用用学习曲线进行绘制,这样进行调优效率更高