sklearn实现决策树

sklearn实现决策树


sklearn中的决策树

模块:sklearn.tree

tree.DecisionTreeClassifier 分类树
tree.DecisionTreeRegressor 回归树
tree.export_graphviz 将生成的决策树导出为DOT模式,画图专用
tree.ExtraTreeClassifier 高随机版本的分类树
tree.ExtraTreeRegressor 高随机版本的回归树

基本的建模流程:

  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 & min_impurity_decreases

一般配合max_depth使用,用作树的“精修“
max_features限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃,和max_depth异曲同工。

如果希望通过降维的方式防止过拟合,建议使用PCA,ICA或者特征选择模块中的降维算法。

min_impurity_decrease 限制信息增益的大小,信息增益小于设定数值的分枝不会发生。

  • 确认最优的剪枝参数

那怎么具体来确定每个参数来填写什么值呢?这时候,我们就要使用确定超参数的曲线来进行判断了,继续使用我们已经训练好的决策树模型clf。
超参数的学习曲线,是一条以超参数的取值为横坐标,模型的度量指标作为纵坐标的曲线,它是用来衡量不同超参数取值下模型的表现的线,我们的模型度量指标就是score。

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)
plt.plot(range(1,11),test,color="red",label="max_depth")
plt.legend()
plt.show()

2、建立一棵树

1、导入需要的算法库和模块

from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split

2、探索数据

  1. 导入数据并查看数据类型
wine = load_wine()
wine.data
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]])
wine.target
# 可以看出三分类的 为0,1,2
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2])

为了更加直观的查看数据集,导入pandas库

pd.concat([pd.DataFrame(wine.data),pd.DataFrame(wine.target)],axis=1)
	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

查看特征的名字

wine.feature_names
['alcohol',
 'malic_acid',
 'ash',
 'alcalinity_of_ash',
 'magnesium',
 'total_phenols',
 'flavanoids',
 'nonflavanoid_phenols',
 'proanthocyanins',
 'color_intensity',
 'hue',
 'od280/od315_of_diluted_wines',
 'proline']

查看目标分类

wine.target_names
array(['class_0', 'class_1', 'class_2'], dtype='<U7')
  1. 分离数据,选取训练集和测试集

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

X_train,X_test,y_train,y_test = train_test_split(wine.data,wine.target,test_size=0.3)

3、建模

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

clf = tree.DecisionTreeClassifier(criterion = 'entropy')

训练模型

clf = clf.fit(X_train,y_train)

查看精准度

score = clf.score(X_test,y_test)
# 0.9259259259259259

4、画树

首先需要安装graphviz库,并要去官网下载应用,否则不会显示树。
并且在环境变量中添加应用的路径。

“我的电脑>属性>环境变量>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实现决策树
查看不同特征的重要性

[*zip(feature_name,clf.feature_importances_)]
[('酒精', 0.0),
 ('苹果酸', 0.0),
 ('灰', 0.036209954705410934),
 ('灰的碱性', 0.0),
 ('镁', 0.0),
 ('总酚', 0.0),
 ('类黄酮', 0.37359968306232505),
 ('非黄烷类酚类', 0.0),
 ('花青素', 0.0),
 ('颜色强度', 0.45986979793750715),
 ('色调', 0.034247526308054214),
 ('稀释葡萄酒', 0.0),
 ('脯氨酸', 0.09607303798670264)]

5、对测试集进行测试

score_test = clf.score(X_test,y_test)
score_test# 表现良好

以上就完成了用sklearn实现决策树的生成,大家可以考虑使用更多的参数来去训练模型,观察不同参数对的影响。
以上资料主要来源于菜菜的机器学习Sklearn课堂。

上一篇:shell习题-判断函数


下一篇:学习机器学习一定要懂的分类模型评估指标都有哪些?【附Python代码实现】