首页 > 编程知识 正文

sklearn鸢尾花数据集,基于决策树的鸢尾花数据分类

时间:2023-05-06 17:39:15 阅读:59253 作者:1811

决策树项目-鸢尾分类1、实验介绍1.1实验内容决策树是机器学习中简单经典的算法。 这次实验了解决策树的基本原理,用scikit-learn建立决策树分类模型,最后学习用该模型预测鸢尾的种类。

1.2实验知识点决策树的基本原理。 用于决策树生成和修剪的ID3、C4.5和CART算法。 使用scikit-learn提供的决策树分类器进行实例验证。 1.3实验环境Python2.7Xfce终端ipython 1.4本课程难度一般,属于初级课程,适用于具有python基础、对机器学习决策树算法感兴趣的用户。

1.5代码获取可以通过以下命令将代码下载到实验楼环境中,作为参考比较进行学习。

$ wget http://lab file.OSS.aliyuncs.com/courses/863/decision tree.py2,决策树基本原理2.1决策树概要决策树是一种特殊的树结构,一般由节点和有向边组成。 其中,节点表示特征、属性或类。 有向边包含判断条件。 如图所示,决策树从根节点开始延伸,经过不同的判断条件,到达不同的子节点。 另外,上位的子节点可以作为父节点分割为更下位的子节点。 通常,在从根节点输入数据并多次确定之后,这些数据被分为不同的类别。 这构成简单的分类决策树。

2.2决策树学习我们将决策数的思想引入机器学习的结果,产生了简单而经典的预测方法——决策树学习(Decision Tree Learning ),也简称决策树。 决策树可以用来解决分类和回归的问题,分别被称为分类树和回归树。 在此,分类树的输出是标量,回归树的一般输出是实数。

通常,决策树使用损失函数最小的原则建立模型,并使用该模型进行预测。 决策树学习通常包括特征选择、树的生成、树的修剪三个阶段。

2.3特征选择特征选择是生成决策树前非常重要的一步。 随机选择特征会大大降低生成的决策树的学习效率。 例如,银行采用决策树解决信用卡审批问题,判断是否向某人发行信用卡,可以根据年龄、工作地点、有无房产、历史信用状况等特点来决定。 选择不同的特征导致随后生成的决策树不匹配,这种不匹配最终影响决策树的分类效率。

通常,在选择特征时,考虑两个不同的指标:信息增益和信息增益比。 为了阐明这两个概念,必须提到信息论中的另一个常见名词——熵。

熵(Entropy )是表示随机变量不确定性的尺度。 简而言之,熵越大,随机变量的不确定性越大。 另一方面,特征a对给定训练集d的信息增益 g(D, A) 定义是集合d的熵h(d )与特征a在给定条件下的d的熵h (d/a )之间的差。

上面的定义很难阅读,不是特别容易理解。 那么,让我们用更一般的语言来概述一下吧。 简而言之,每个特征对训练数据集前后信息变化的影响不同,信息增益越大,表示其影响越大。 影响越大,说明这一特征越重要。

2.4了解生成算法信息增益的概念后,可以学习决策树的生成算法。 其中,最典型的是John Ross Quinlan提出的ID3算法,该算法的核心理论来源于上述信息增益。

ID3算法递归地建立决策树。 创建时,根据根节点,按每个节点计算独立的每个特征的信息增益,选择信息增益最大的特征作为节点特征。 接着,对该特征赋予判定条件,形成子节点。 然后,在所有特征的信息增益小或者没有特征的情况下结束之前,对子节点进一步使用信息增益进行判断,生成完整的决策树。

除了从信息增益进化而来的ID3算法外,还有一种常见的算法C4.5。 C4.5算法也由John Ross Quinlan发明,但采用信息增益比选择特征,这被认为是对ID3算法的改进。

ID3和C4.5算法简单高效,但他们俩都有“用完美制造另一个不完美”的缺点。 这两种算法从信息增益比和信息增益比入手,对整个训练集进行了分类,拟合出的模型相对于该训练集确实是完美的。 但是,这种完美性会增加整个模型的复杂性,降低对其他数据集的预测能力。 也就是说,常见的拟合会削弱模型的泛化能力。

当然,拟合问题也可以解决。 那就是修剪决策树。

2.5决策树修剪决策树的修剪是通过优化损失函数去除不必要的分类特征,降低整个模型的复杂度。 修剪的方法是从树叶节点出发,向上缩,逐步判断。 去除某一特征后,如果决策树整体对应的损失函数更小,则切掉该特征及其附带的分支。

ID3和C4.5只能生成决策树,因此修剪需要单独进行,过程更加复杂。 1984年,Breiman

CART 算法,使这个过程变得可以一步到位。CART 算法本身就包含了决策树的生成和修剪,并且可以同时被运用到分类树和回归树。这就是和 ID3 及 C4.5 之间的最大区别。

CART 算法在生成树的过程中,分类树采用了基尼指数(Gini Index)最小化原则,而回归树选择了平方损失函数最小化原则。基尼指数其实和前面提到的熵的概念是很相似的。简单概述区别的话,就是数值相近但不同,而基尼指数在运算过程中的速度会更快一些。

CART 算法也包含了树的修剪。CART 算法从完全生长的决策树底端剪去一些子树,使得模型更加简单。而修剪这些子树时,是每次去除一颗,逐步修剪直到根节点,从而形成一个子树序列。最后,对该子树序列进行交叉验证,再选出最优的子树作为最终决策树。

三、鸢尾花分类实验

如果你感觉理论看起来比较费劲,不用担心。接下来就带领你用非常少的代码量来构建一个决策树分类模型,实现对鸢尾花分类。

3.1 数据集简介

鸢尾花数据集是机器学习领域一个非常经典的分类数据集。接下来,我们就用这个训练集为基础,一步一步地训练一个机器学习模型。首先,我们来看一下该数据集的基本构成。数据集名称的准确名称为 Iris Data Set,总共包含 150 行数据。每一行数据由 4 个特征值及一个目标值组成。其中 4 个特征值分别为:萼片长度、萼片宽度、花瓣长度、花瓣宽度。而目标值及为三种不同类别的鸢尾花,分别为:Iris Setosa,Iris Versicolour,Iris Virginica。

3.2 数据获取及划分

你可以通过著名的 UCI 机器学习数据集网站下载该数据集。本实验中,为了更加便捷地实验。我们直接实验 scikit-learn 提供的方法导入该数据集即可。打开实验环境右下角的菜单 > 附件 > ipython,依次键入代码。

# -*- coding: utf-8 -*-from sklearn import datasets #导入方法类iris = datasets.load_iris() #加载 iris 数据集iris_feature = iris.data #特征数据iris_target = iris.target #分类数据

接下来,你可以直接通过 print iris_target 查看一下花的分类数据。这里,scikit-learn 已经将花的原名称进行了转换,其中 0, 1, 2 分别代表 Iris Setosa, Iris Versicolour 和 Iris Virginica。

你会发现,这些数据是按照鸢尾花类别的顺序排列的。所以,如果我们将其直接划分为训练集和数据集的话,就会造成数据的分布不均。详细来讲,直接划分容易造成某种类型的花在训练集中一次都未出现,训练的模型就永远不可能预测出这种花来。你可能会想到,我们将这些数据大乱后再划分训练集和数据集。当然,更方便地,scikit-learn 为我们提供了训练集和数据集的方法。

from sklearn.cross_validation import train_test_splitfeature_train, feature_test, target_train, target_test = train_test_split(iris_feature, iris_target, test_size=0.33, random_state=42)

其中,feature_train, feature_test, target_train, target_test 分别代表训练集特征、测试集特征、训练集目标值、验证集特征。test_size 参数代表划分到测试集数据占全部数据的百分比,你也可以用 train_size 来指定训练集所占全部数据的百分比。一般情况下,我们会将整个训练集划分为 70% 训练集和 30% 测试集。最后的 random_state 参数表示乱序程度。

数据集划分之后,我们可以再次执行 print iris_target 看一下结果。

现在,你会发现花的种类已经变成了乱序状态,并且只包含有整个训练集的 70% 数据。

3.2 模型训练及预测

划分完训练集和测试集之后,我们就可以开始预测了。首先是从 scikit-learn 中导入决策树分类器。然后实验 fit 方法和 predict 方法对模型进行训练和预测。

# -*- coding: utf-8 -*-from sklearn.tree import DecisionTreeClassifierdt_model = DecisionTreeClassifier() # 所以参数均置为默认状态dt_model.fit(feature_train,target_train) # 使用训练集训练模型predict_results = dt_model.predict(feature_test) # 使用模型对测试集进行预测

DecisionTreeClassifier() 模型方法中也包含非常多的参数值。例如:

criterion = gini/entropy 可以用来选择用基尼指数或者熵来做损失函数。splitter = best/random 用来确定每个节点的分裂策略。支持“最佳”或者“随机”。max_depth = int 用来控制决策树的最大深度,防止模型出现过拟合。min_samples_leaf = int 用来设置叶节点上的最少样本数量,用于对树进行修剪。

我们可以将预测结果和测试集的真实值分别输出,对照比较。

当然,我们可以通过 scikit-learn 中提供的评估计算方法查看预测结果的准确度。

from sklearn.metrics import accuracy_scoreprint accuracy_score(predict_results, target_test)

其实,在 scikit-learn 中的分类决策树模型就带有 score 方法,只是传入的参数和 accuracy_score() 不太一致。

scores = dt_model.score(feature_test, target_test)

你可以看出两种准确度方法输入参数的区别。一般情况下,模型预测的准确度会和多方面因素相关。首先是数据集质量,本实验中,我们使用的数据集非常规范,几乎不包含噪声,所以预测准确度非常高。其次,模型的参数也会对预测结果的准确度造成影响。

六、实验总结

首先通过决策树的原理,加深了对介绍机器学习中决策树算法的理解。并采用 scikit-learn 中提供的决策树分类器构建预测模型,实现对鸢尾花进行分类。

七、课后习题 尝试通过修改 DecisionTreeClassifier() 方法里面的值,查看模型参数对实验结果带来的影响。尝试载入 scikit-learn 中提供的另一个著名的 digits 数据集,同样实验决策树分类器实现手写字体识别实验。 八、参考链接 《统计学习方法》,动听的飞机,清华大学出版社鸢尾花数据集,维基百科标致的店员《机器学习》习题解答:Ch4.4 - 编程实现CART算法与剪枝操作

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。