Criterion这个参数正是用来决定不纯度的计算方法的。sklearn提供了两种选择:
1)输入”entropy“,使用信息熵(Entropy)
2)输入”gini“,使用基尼系数(Gini Impurity)
不填默认基尼系数,填写entropy使用信息增益通常就使用基尼系数,数据维度很大,噪音很大时使用基尼系数。维度低,数据比较清晰的时候,信息熵和基尼系数没区别。当决策树的拟合程度不够的时候,使用信息熵
random_state用来设置分枝中的随机模式的参数,默认None,在高维度时随机性会表现更明显,低维度的数据随机性几乎不会显现。输入任意整数,会一直长出同一棵树,让模型稳定下来。
splitter是用来控制决策树中的随机选项的,有两种输入值。
输入”best",会优先选择更重要的特征进行分枝。
输入“random",树会因为含有更多的不必要信息而更深更大,并因这些不必要信息而降低对训练集的拟合。可防止过拟合。
限制树的最大深度,超过设定深度的树枝全部剪掉。这是用得最广泛的剪枝参数,在高维度低样本量时非常有效。建议从max_depth = 3开始尝试,看看拟合的效果再决定是否增加设定深度,可以有效限制过拟合。
min_samples_leaf 限制一个子节点的分支至少包含多少个样本。
建议从min_samples_leaf = 5 开始检测拟合度进行调参。
max_features限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃,在不知道决策树中的各个特征的重要性时,可能会导致模型学习不足。
min_impurity_decrease限制信息增益的大小,信息增益小于设定数值的分枝不会发生
from sklearn import tree # 导入树
from sklearn.datasets import load_wine # 生成数据集的模块
from sklearn.model_selection import train_test_split # 训练集测试集分类
import pandas as pd
import matplotlib.pyplot as plt
import graphviz # 用于画出决策树
# 实例化数据
wine = load_wine()
# 使用pandas转化为表的形式
table = pd.concat([pd.DataFrame(wine.data),pd.DataFrame(wine.target)],axis=1)
# print(table)
# print(wine.feature_names) #特征名称
# print(wine.target_names) #标签名
# 测试集与训练集的分类
# wine.data 数据集
# wine.target 标签集
# test_size=0.3表示30%作为测试集,70%作为训练集
Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data,wine.target,test_size=0.3)
# print(Xtrain.shape) #查看数据结构
# 实例化分类树
clf = tree.DecisionTreeClassifier(criterion = "entropy"
,random_state = 30
,splitter = "random"
#,max_depth =
,min_samples_leaf = 5
,min_samples_split = 5
)
clf = clf.fit(Xtrain, Ytrain) # 将数据带入训练,fit()是用于训练的接口
score = clf.score(Xtest, Ytest) # 返回预测的准确度
print("测试集的准确度:",score)
# apply返回每个测试样本所在的叶子节点的索引
print(clf.apply(Xtest))
# predict返回每个测试样本的分类/回归结果
print(clf.predict(Xtest))
# feature_name 特征名
# class_name 标签名
# filled 是否使用颜色,不纯度越高颜色越浅
# rounded 是否使用圆角边框
feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青素','颜色强度','色调','od280/od315稀释葡萄酒','脯氨酸']
dot_data = tree.export_graphviz(clf
,out_file = None
,feature_names= feature_name
,class_names=["琴酒","雪莉","贝尔摩德"]
,filled=True
,rounded=True
)
# 画出决策树
graph = graphviz.Source(dot_data.replace('helvetica','"Microsoft YaHei"'), encoding='utf-8')
graph.render('wine')
# 将特征名称与特征的重要性做表查看
print([*zip(feature_name,clf.feature_importances_)])
超参数的学习曲线,是一条以超参数的取值为横坐标,模型的度量指标为纵坐标的曲线,它是用来衡量不同超参数取值下模型的表现的线。在我们建好的决策树里,我们的模型度量指标就是score。
from sklearn import tree # 导入树
from sklearn.datasets import load_wine # 生成数据集的模块
from sklearn.model_selection import train_test_split # 训练集测试集分类
import pandas as pd
import matplotlib.pyplot as plt
import graphviz # 用于画出决策树
# 实例化数据
wine = load_wine()
# 使用pandas转化为表的形式
table = pd.concat([pd.DataFrame(wine.data),pd.DataFrame(wine.target)],axis=1)
# print(table)
# 测试集与训练集的分类
# wine.data 数据集
# wine.target 标签集
# test_size=0.3表示30%作为测试集,70%作为训练集
Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data,wine.target,test_size=0.3)
# print(Xtrain.shape) #查看数据结构
# 绘制调参曲线
test = [] # 用于存储每次参数设置的score结果
for i in range(10):
clf = tree.DecisionTreeClassifier(criterion = "entropy"
,random_state = 30
,splitter = "random"
,max_depth = i+1
,min_samples_leaf = 5
,min_samples_split = 5
)
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()