决策树是机器学习中一种简单而又经典的算法。本实验将带领大家学习决策树的基本原理,并学习使用 scikit-learn 来构建一个决策树分类模型,最后使用此模型预测鸢尾花的种类
实验时长:45分钟
主要步骤:
Python基础
决策树
构建分类器模型
6.1决策树
6.1.1决策树是一种特殊的树形结构,一般由节点和有向边组成。其中,节点表示特征、属性或者一个类。而有向边包含有判断条件。如上图所示,决策树从根节点开始延伸,经过不同的判断条件后,到达不同的子节点。而上层子节点又可以作为父节点被进一步划分出下层子节点。一般情况下,我们从根节点输入数据,经过多次判断后,这些数据就会被分为不同的类别。这就构成了一棵简单的分类决策树
6.1.2将决策树的思想引入到机器学习中,就有了简单而又经典的预测方法 —— 决策树学习(Decision Tree Learning),亦简称为决策树。决策树可以用来解决分类或回归问题,分别称之为分类树或回归树。其中,分类树的输出是一个标量,而回归树的一般输出为一个实数。
6.1.3通常情况下,决策树利用损失函数最小的原则建立模型,然后再利用该模型进行预测。决策树学习通常包含三个阶段:特征选择、树的生成,树的修剪
6.2实验数据集
6.2.1鸢尾花数据集( Iris Data Set)是机器学习领域一个非常经典的分类数据集,总共包含 150 行数据。每一行数据由 4 个特征值及一个目标值组成。其中 4 个特征值分别为:萼片长度、萼片宽度、花瓣长度、花瓣宽度。而目标值为三种不同类别的鸢尾花,分别为:Iris Setosa,Iris Versicolour,Iris Virginica。sklearn提供了导入鸢尾花数据集的方法,无需读取外部数据源
6.3环境准备
6.3.1进入anaconda建立好的虚拟环境zkbc中
[zkpk@master ~]$ source activate zkbc
(zkbc)[zkpk@master ~]$
6.3.2使用决策树需要 `scikit-learn`模块,利用conda命令安装numpy;安装scikit-learn,代码中使用时的名称为sklearn是其调用写法;安装过程中,询问是否继续,输入y再回车即可。
(zkbc)[zkpk@master ~]$ conda install numpy=1.11.3
(zkbc)[zkpk@master ~]$ conda install scipy
(zkbc)[zkpk@master ~]$ conda install scikit-learn
6.3.3利用可视化组件将决策树绘制出来,决策树的绘制需要graphviz模块,所以利用conda命令安装依赖模块pydot,再利用pip命令安装graphviz模块
(zkbc)[zkpk@master ~]$ conda install pydot
(zkbc)[zkpk@master ~]$ conda install graphviz
(zkbc)[zkpk@master ~]$ pip install graphviz
6.4代码编写
6.4.1环境安装完成后重新进入python命令行,开始决策树编码
(zkbc)[zkpk@master ~]$ python
6.4.1.1导入鸢尾花数据集相关包、决策树依赖包
>>>from sklearn.datasets import load_iris
>>>from sklearn.model_selection import train_test_split
>>>from sklearn.metrics import accuracy_score
>>>from sklearn import tree
6.4.1.2导入鸢尾花数据,我们直接实验 scikit-learn 提供的方法导入该数据集即可;scikit-learn已经将花的原名称进行了转换,其中 0,1, 2 分别代表 Iris Setosa, Iris Versicolour 和 Iris Virginica
>>>iris = load_iris()
6.4.1.3我们打印查看下特征值和目标值
>>>print(iris.data)
>>>print(iris.target)
6.4.1.4对数据集进行切分,feature表示特征值,target表示标签值,将整个训练集划分为 67% 训练集和 33% 测试集。最后的 random_state 参数表示乱序程度(随机数种子)
>>>iris_feature = iris.data
>>>iris_target = iris.target
>>>feature_train,feature_test,target_train,target_test=train_test_split(iris_feature, iris_target, test_size=0.33, random_state=42)
6.4.1.5构建决策树模型;DecisionTreeClassifier() 模型方法中部分参数如下:
criterion = gini/entropy 可以用来选择用基尼系数或者熵来做损失函数。
splitter = best/random 用来确定每个节点的分裂策略。支持“最佳”或者“随机”。
max_depth = int 用来控制决策树的最大深度,防止模型出现过拟合。
min_samples_leaf = int 用来设置叶节点上的最少样本数量,用于对树进行修剪
6.4.1.6此处我们使用参数默认值即可
>>>model = tree.DecisionTreeClassifier()
6.4.1.7利用特征值和目标值对模型进行训练
>>>clf=model.fit(feature_train,target_train)
6.4.1.8利用模型对测试集进行预测
>>>predict_results = clf.predict(feature_test)
6.4.1.9通过 scikit-learn 中提供的评估方法,查看预测结果的准确度(由于将原始数据按照特定比例随机切分成训练集、测试集,所以每次结果稍有区别)
>>>print(accuracy_score(predict_results, target_test))
6.4.1.10可以看到预测的准确率约为96%(每次预测的结果可能略微不同)
6.4.1.11我们接着绘制出决策树模型看一看,默认保存为pdf格式,文件路径在进入python命令行时的所在目录下
>>>import graphviz
>>>dot_data = tree.export_graphviz(clf, out_file=None)
>>>graph = graphviz.Source(dot_data)
>>>graph.render("iris")
6.4.1.13浏览器打开该文件查看决策树模型;地址栏输入内容如下:
file:///home/zkpk/iris.pdf
本实验介绍决策树的原理,加深机器学习中决策树算法的理解。并采用 scikit-learn 中提供的决策树分类器构建预测模型,实现对鸢尾花进行分类。通过本节实验的学习,我们应当掌握了scikit-learn中自带鸢尾花数据集的数据结构、如何利用决策树对鸢尾花数据集进行分类预测、利用graphviz模块对决策树模型进行绘制等知识点。