sklearn中的决策树
模块:sklearn.tree
基本的建模流程:
- 实例化,建立评估模型对象
- 通过模型接口训练模型
- 通过模型接口提取需要的信息
以分类树为例:
from skleran import tree #导入需要的模块 clf = tree.DecisionTreeClassifier() #实例化 clf = clf.fit(X_train,y_train)#用训练集数据训练模型 result = clf,score(x_test,y_test)#导入测试集,从接口中调用需要的信息
当然在建模前,首先需要获取数据集,对数据进行可视化,数据处理等
一、DecisionTreeClassifier
1、重要参数
1.1 criterion
为了要将表格转化为一棵树,决策树需要找出最佳节点和最佳的分支方法,对于分类树来说,衡量这个“最佳”的指标叫做“不纯度”。
Criterion这个参数正是用来决定不纯度的计算方法的。skleran提供了两种选择。
- 输入"entropy",使用信息熵。
- 输入“gini”,使用基尼系数。
比起基尼系数,信息熵对不纯度更加敏感,对不纯度的惩罚最强。但在实际使用中,信息熵和基尼系数的效果基本相同。
同时,因为信息熵对不纯度更加敏感,所以信息熵作为指标时,决策树的生长会更加“精细”,因此对于高维数据或者噪音很多的数据,信息熵很容易过拟合,基尼系数在这种情况下效果往往会更好。
1.2 random_state & splitter
random_state用来设置分支中的随机模式的参数,默认为None,在高维度时随机性会表示的更加明显。
splitter也是用来控制决策树中的随机选项的,用两种输入值,输入“best”,决策树在分支时虽然随机,但是还是会优先选择更加重要的特征进行分支,输入"random",决策树会在分支时更加随机,树会因为含有更多的不必信息而更深更大,可能会导致过拟合问题。当你预测到你的模型可能会过拟合,用这两个参数可以帮助你降低树建成之后过拟合的可能性。当然,树一旦建成,我们依然是使用剪枝参数来防止过拟合。
clf = tree.DecisionTreeClassifier(criterion='entropy',random_state = 30,splitter='random')
1.3剪枝参数
在不加任何限制的情况下,一颗决策树会生长到衡量不纯度的指标最优,或者没有更多的特征为止。这样的决策树往往会过拟合。
为了让决策树有更好的泛化性,sklearn提供了不同的剪枝策略:
- max_depth
限制树的最大深度,超过设定深度的树枝全部剪掉
最广泛的剪枝参数,在高维度低样本量时非常有效。实际使用时,建议从=3开始尝试,看看拟合的效果再决定是否增加设定深度。
min_samples_leaf & min_samples_split
min_samples_leaf 限定,一个节点在分支后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分支就不会发生,或者,分支会朝着满足每个子节点都包含min_samples_leaf个样本的方向去发生。
一般搭配max_depth使用,在回归树中会有神奇的效果,可以让模型变得更加平滑,这个参数的数量设置的大小会引起过拟合,设置的太大会阻止模型学习数据。一般来说,建立从=5开始使用。如果叶节点中含有的样本量变化很大,建立输入浮点数作为样本量的百分比来使用。同时,这个参数可以保证每个叶子的最小尺寸,可以在回归问题中避免低方差,过拟合的叶子节点出现。对于类别不多的分类问题,=1通常就是最佳选择。
min_samples_split限定:一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分支,否则分支就不会发生。
max_features限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃,和max_depth异曲同工。
如果希望通过降维的方式防止过拟合,建议使用PCA,ICA或者特征选择模块中的降维算法。
2、建立一棵树
1、导入需要的算法库和模块
from sklearn import tree from sklearn.datasets import load_wine from sklearn.model_selection import train_test_split
2、探索数据
- 导入数据并查看数据类型
array([[1.423e+01, 1.710e+00, 2.430e+00, ..., 1.040e+00, 3.920e+00, 1.065e+03], [1.320e+01, 1.780e+00, 2.140e+00, ..., 1.050e+00, 3.400e+00, 1.050e+03], [1.316e+01, 2.360e+00, 2.670e+00, ..., 1.030e+00, 3.170e+00, 1.185e+03], ..., [1.327e+01, 4.280e+00, 2.260e+00, ..., 5.900e-01, 1.560e+00, 8.350e+02], [1.317e+01, 2.590e+00, 2.370e+00, ..., 6.000e-01, 1.620e+00, 8.400e+02], [1.413e+01, 4.100e+00, 2.740e+00, ..., 6.100e-01, 1.600e+00, 5.600e+02]])
为了更加直观的查看数据集,导入pandas库
0 1 2 3 4 5 6 7 8 9 10 11 12 0 0 14.23 1.71 2.43 15.6 127.0 2.80 3.06 0.28 2.29 5.64 1.04 3.92 1065.0 0 1 13.20 1.78 2.14 11.2 100.0 2.65 2.76 0.26 1.28 4.38 1.05 3.40 1050.0 0 2 13.16 2.36 2.67 18.6 101.0 2.80 3.24 0.30 2.81 5.68 1.03 3.17 1185.0 0 3 14.37 1.95 2.50 16.8 113.0 3.85 3.49 0.24 2.18 7.80 0.86 3.45 1480.0 0 4 13.24 2.59 2.87 21.0 118.0 2.80 2.69 0.39 1.82 4.32 1.04 2.93 735.0 0 ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 173 13.71 5.65 2.45 20.5 95.0 1.68 0.61 0.52 1.06 7.70 0.64 1.74 740.0 2 174 13.40 3.91 2.48 23.0 102.0 1.80 0.75 0.43 1.41 7.30 0.70 1.56 750.0 2 175 13.27 4.28 2.26 20.0 120.0 1.59 0.69 0.43 1.35 10.20 0.59 1.56 835.0 2 176 13.17 2.59 2.37 20.0 120.0 1.65 0.68 0.53 1.46 9.30 0.60 1.62 840.0 2 177 14.13 4.10 2.74 24.5 96.0 2.05 0.76 0.56 1.35 9.20 0.61 1.60 560.0 2
- 分离数据,选取训练集和测试集
训练集比例0.7,测试集比例0.3
3、建模
选取信息熵作为计算不纯度的方法
“我的电脑>属性>环境变量>path>新建>添加路径”
安装库,采用清华镜像
!pip install graphviz -i https://pypi.tuna.tsinghua.edu.cn/simple
上述操作都完成后,开始使用这个库进行画树
tree.export_graphviz中要提供一个决策树,特征值的名称,分类结果的名称等。
import graphviz feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青素','颜色强度','色调','稀释葡萄酒','脯氨酸'] dot_data = tree.export_graphviz(clf ,feature_names=feature_name ,class_names=['琴酒','雪莉','贝尔摩德'] ,filled=True ,rounded=True)# 圆角 graph = graphviz.Source(dot_data)
查看不同特征的重要性