graphviz画决策树_决策树算法-实战篇
本节来介绍如何⽤决策树解决实际问题。
决策树是常⽤的机器学习算法之⼀,决策树模型的决策过程⾮常类似⼈类做判断的过程,⽐较好理解。
决策树可⽤于很多场景,⽐如⾦融风险评估,房屋价格评估,医疗辅助诊断等。
要使⽤决策树算法,我们先来介绍⼀下 scikit-learn 。
1,scikit-learn
scikit-learn 是基于Python 的⼀个机器学习库,简称为sklearn,其中实现了很多机器学习算法。我们可以通过sklearn 官⽅⼿册 来学习如何使⽤它。
sklearn ⾃带数据集
要进⾏数据挖掘,⾸先得有数据。sklearn 库的datats 模块中⾃带了⼀些数据集,可以⽅便我们使⽤。
sklearn ⾃带数据集:
蒜黄的种植方法1. 鸢尾花数据集:load_iris()
2. 乳腺癌数据集:load_breast_cancer()
3. ⼿写数字数据集:load_digits()
处女男天蝎女
4. 糖尿病数据集:load_diabetes()
5. 波⼠顿房价数据集:load_boston()
6. 体能训练数据集:load_linnerud()
7. 葡萄酒产地数据集:load_wine()
冒号后边是每个数据集对应的函数,可以使⽤相应的函数来导⼊数据。
⽐如我们⽤如下代码导⼊鸢尾花数据集:
from sklearn.datats import load_irisiris = load_iris()
使⽤dir(iris) 查看iris 中包含哪些属性:
>>> dir(iris)['DESCR', 'data', 'feature_names', 'filename', 'frame', 'target', 'target_names']
2,sklearn 中的决策树
sklearn 库的tree 模块实现了两种决策树:
分类树⽤于预测离散型数值,回归树⽤于预测连续性数值。
sklearn 只实现了预剪枝,没有实现后剪枝。
DecisionTreeClassifier 类的构造函数
def __init__(lf, *, criterion="gini", splitter="best", max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fracti
DecisionTreeClassifier 类的构造函数中的criterion 参数有2 个取值:
entropy:表⽰使⽤ ID3 算法(信息增益)构造决策树。
gini:表⽰使⽤CART 算法(基尼系数)构造决策树,为默认值。早自习
其它参数可使⽤默认值。
sklearn 库中的决策分类树只实现了ID3 算法和CART 算法。
DecisionTreeRegressor 类的构造函数
快三步def __init__(lf, *, criterion="m", splitter="best", max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_ DecisionTreeRegressor 类的构造函数中的criterion 参数有4 个取值:
m:表⽰均⽅误差算法,为默认值。
friedman_m:表⽰费尔德曼均⽅误差算法。
农村垃圾mae:表⽰平均误差算法。
poisson:表⽰泊松偏差算法。
其它参数可使⽤默认值。
3,构造分类树
我们使⽤ sklearn.datats 模块中⾃带的鸢尾花数据集 构造⼀颗决策树。
3.1,鸢尾花数据集
鸢尾花数据集⽬的是通过花瓣的长度和宽度,及花萼的长度和宽度,预测出花的品种。
这个数据集包含150条数据,将鸢尾花分成了三类(每类是50条数据),分别是:
tosa,⽤数字0 表⽰。
versicolor,⽤数字1 表⽰。
virginica,⽤数字2 表⽰。
颓的意思我们抽出3 条数据如下:
5.1,3.5,1.4,0.2,0
6.9,3.1,4.9,1.5,15.9,3.0,5.1,1.8,2
数据的含义:
每条数据包含5 列,列与列之间⽤逗号隔开。
从第1 列到第5 列,每列代表的含义是:花萼长度,花萼宽度,花瓣长度,花瓣宽度,花的品种。
在机器学习中,前4列称为特征值,最后1列称为⽬标值。我们的⽬的就是⽤特征值预测出⽬标值。
将上⾯3 条数据,⽤表格表⽰就是:
花萼长度花萼宽度花瓣长度花瓣宽度花的品种5.13.51.40.206.93.14.91.515.93.05.11.82
3.2,构造分类树
⾸先导⼊必要的类和函数:
import DecisionTreeClassifierfrom sklearn.datats import load_del_lection import train_test_ 其中:
DecisionTreeClassifier 类⽤于构造决策树。
load_iris() 函数⽤于导⼊数据。
train_test_split() 函数⽤于将数据集拆分成训练集与测试集。
accuracy_score() 函数⽤于为模型的准确度进⾏评分。
导⼊数据集:
iris = load_iris() # 准备数据集features = iris.data# 获取特征集labels = iris.target # 获取⽬标集
将数据分成训练集和测试集,训练集⽤于训练模型,测试集⽤于测试模型的准确度。
train_features, test_features, train_labels, test_labels = train_test_split(features, labels, test_size=0.33, random_state=0)
我们向train_test_split() 函数中传递了4 个参数,分别是:
features:特征集。
labels:⽬标集。
test_size=0.33:测试集数据所占百分⽐,剩下的数据分给训练集。
random_state=0:随机数种⼦。
该函数返回4 个值,分别是:
train_features:训练特征集。
test_features:测试特征集。
train_labels:训练⽬标集。
test_labels:测试⽬标集。
接下来构造决策树:
# ⽤CART 算法构建分类树(你也可以使⽤ID3 算法构建)clf = DecisionTreeClassifier(criterion='gini')# ⽤训练集拟合构造CART分类树clf = clf.fit(train_features, train_la 上⾯两句代码已经在注释中说明,最终我们得到了决策树clf(classifier 的缩写)。
⽤clf 预测测试集数据,test_predict 为预测结果:
test_predict = clf.predict(test_features)
计算预测结果的准确率:
score = accuracy_score(test_labels, test_predict)score2 = clf.score(test_features, test_labels)print(score, score2)
最终得出,sorce 和 score2都为 0.96,意思就是我们训练出的模型的准确率为96%。
函数accuracy_score() 和 clf.score() 都可以计算模型的准确率,但注意这两个函数的参数不同。米饭的简笔画
4,打印决策树
孩子们的游戏
为了清楚的知道,我们构造出的这个决策树cfl 到底是什么样⼦,可使⽤ graphviz 模块将决策树画出来。
代码如下:
import export_graphvizimport graphviz# clf 为决策树对象dot_data = export_graphviz(clf)graph = graphviz.Source(dot_data)# ⽣成 Source.gv.pd 为了画出决策树,除了需要安装相应的 Python 模块外,还需要安装Graphviz 软件。
由上⾯的代码,我们得到的决策树图如下:
我们以根节点为例,来解释⼀下每个⽅框⾥的四⾏数据(叶⼦节点是三⾏数据)都是什么意思。
四⾏数据所代表的含义:
第⼀⾏X[3]<=0.75:鸢尾花数据集的特征集有4 个属性,所以对于X[n]中的n的取值范围为0<=n<=3,X[0]表⽰第1个属性,X[3] 表⽰第4 个属性。X[3]<=0.75 的意思就是当X[3] 属性的值⼩于等于0.75 的时候,⾛左⼦树,否则⾛右⼦树。X[0] 表⽰花萼长度。
X[1] 表⽰花萼宽度。X[2] 表⽰花瓣长度。X[3] 表⽰花瓣宽度。
第⼆⾏gini=0.666,表⽰当前的gini 系数值。
第三⾏samples=100,samples 表⽰当前的样本数。我们知道整个数据集有150 条数据,我们选择了0.33 百分⽐作为测试集,那么训练集的数据就占0.67,也就是100 条数据。根节点包含所有样本集,所以根节点的samples 值为100。
第四⾏value:value 表⽰属于该节点的每个类别的样本个数,value 是⼀个数组,数组中的元素之和为samples 值。我们知道该数据集的⽬标集中共有3 个类别,分别为:tosa,versicolor 和 virginica。所以:value[0] 表⽰该节点中tosa 种类的数据量,即34。value[1] 表⽰该节点中versicolor 种类的数据量,即31。value[2] 表⽰该节点中virginica 种类的数据量,即35。
4.1,打印特征重要性
我们构造出来的决策树对象clf 中,有⼀个feature_importances_ 属性,如下: