sklearn实现决策树
sklearn实现决策树
- sklearn中的决策树
- 一、DecisionTreeClassifier
- 1、重要参数
- 1.1 criterion
- 1.2 random_state & splitter
- 1.3剪枝参数
- 2、建立一棵树
sklearn中的决策树
模块:sklearn.tree
tree.DecisionTreeClassifier | 分类树 |
---|---|
tree.DecisionTreeRegressor | 回归树 |
tree.export_graphviz | 将生成的决策树导出为DOT模式,画图专用 |
tree.ExtraTreeClassifier | 高随机版本的分类树 |
tree.ExtraTreeRegressor | 高随机版本的回归树 |
基本的建模流程:
- 实例化,建立评估模型对象
- 通过模型接口训练模型
- 通过模型接口提取需要的信息
以分类树为例:
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、探索数据
- 导入数据并查看数据类型
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')
- 分离数据,选取训练集和测试集
训练集比例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>新建>添加路径”
安装库,采用清华镜像
!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)
查看不同特征的重要性
[*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课堂。
sklearn实现决策树相关推荐
- 【机器学习入门】(5) 决策树算法实战:sklearn实现决策树,实例应用(沉船幸存者预测)附python完整代码及数据集
各位同学好,今天和大家分享一下python机器学习中的决策树算法,在上一节中我介绍了决策树算法的基本原理,这一节,我将通过实例应用带大家进一步认识这个算法.文末有完整代码和数据集,需要的自取.那我们开 ...
- python中sklearn实现决策树及模型评估_sklearn实现决策树
sklearn是一个功能非常强大的工具,可以用几行代码实现丰富的机器学习算法. 本文介绍使用sklearn实现决策树 决策树是经典的机器学习算法,很多复杂的机器学习算法都是由决策时演变而来.它是一种使 ...
- ID3决策树 Python实现 + sklearn库决策树模型的应用
本文介绍机器学习中决策树算法的python实现过程 共介绍两类方法: (1)亲手实习Python ID3决策树经典算法 (2)利用sklearn库实现决策树算法 关于决策树的原理,指路:机器学习 第四 ...
- 【Python-ML】SKlearn库决策树(DecisionRegression) 使用
# -*- coding: utf-8 -*- ''' Created on 2018年1月15日 @author: Jason.F @summary: Scikit-Learn库决策树算法 '''f ...
- python sklearn 绘制决策树模型的节点图
绘制决策树的图片可以使用sklearn.tree.plot_tree这个方法 详情可以参考官方文档:https://scikit-learn.org/stable/modules/generated/ ...
- sklearn 决策树例子_使用 sklearn 构建决策树并使用 Graphviz 绘制树结构
决策树最大的优点是我们可以查看最终的树结构,上一篇日志中,我们通过 matplotlib 展示了我们自己的树结构 但是 matplotlib 绘制树结构较为复杂,我们这里来了解一个更为易用的绘图工具 ...
- Python 机器学习 利用sklearn构建决策树的实现 2
决策树 import numpy as npimport os%matplotlib inlineimport matplotlibimport matplotlib.pyplot as pltplt ...
- 机器学习之使用sklearn构造决策树模型
一.任务基础 导入所需要的库 import matplotlib.pyplot as plt import pandas as pd%matplotlib inline 加载sklearn内置数据集 ...
- python中sklearn实现决策树及模型评估_Python sklearn决策树算法实践
scikit-learn简称sklearn,支持包括分类.回归.降维和聚类四大机器学习算法.还包含了特征提取.数据处理和模型评估三大模块.sklearn是Scipy科学计算库的扩展,建立在NumPy和 ...
- sklearn实现决策树,随机森林,逻辑回归,KNN,贝叶斯,SVM,以葡萄干数据集为例
数据集介绍 本次使用的数据集为葡萄干数据集,来源于UCI中: https://archive.ics.uci.edu/ml/datasets/Raisin+Dataset 介绍为: Images of ...
最新文章
- 人字拖藏SIM卡、戴微型蓝牙耳机!为考教师岗,多人作弊被抓
- 2021机器智能研究方向
- 开启Thread线程只执行一次
- 【开发管理类软件必备知识视频教程之二】登录窗体后台注意事项
- wxWidgets:wxCheckBox类用法
- 机器学习(十八)——关联规则挖掘
- [vue] 如果让你教一个2-3年经验前端经验的同事使用vue,你该怎么教?
- php 控制器 模板,php学习笔记(一)php模板与控制器
- 1.10.返回四舍五入后的值.round()
- 【LeetCode】剑指 Offer 11. 旋转数组的最小数字
- TensorFlow 学习(一)—— tf.get_variable() vs tf.Variable(),tf.name_scope() vs tf.variable_scope()
- 深度学习笔记(十一)--读李宏毅《1天搞懂深度学习》
- DAY1——sql 建表/插入数据
- MATLAB实现三边定位
- 【论文阅读】【二维目标检测】Revisiting Feature Alignment for One-stage Object Detection
- TypeScript 导出 Excel 表格(带斑马纹样式)
- 自然语言处理NLPIR-ICTCLAS 授权文件过期问题
- laravel8 邮件发送 以qq邮箱来举例
- 网页布局——盒子模型
- synchronized的偏向锁、轻量级锁和重量级锁