sklearn实现决策树

sklearn中的决策树

模块:sklearn.tree

sklearn实现决策树

基本的建模流程:

  1. 实例化,建立评估模型对象
  2. 通过模型接口训练模型
  3. 通过模型接口提取需要的信息

以分类树为例:

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、探索数据

  1. 导入数据并查看数据类型
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
  1. 分离数据,选取训练集和测试集

训练集比例0.7,测试集比例0.3

3、建模

选取信息熵作为计算不纯度的方法

“我的电脑>属性>环境变量>path>新建>添加路径”

sklearn实现决策树

安装库,采用清华镜像

!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)

sklearn实现决策树
查看不同特征的重要性

 

上一篇:【动手学数据分析】 Task05 - 模型建立和评估


下一篇:Sklearn库,一个神奇的瑞士军刀0