分析机器学习之决策树Python实现

目录
  • 一、环境准备
  • 二、决策树是什么
  • 三、快速入门分类树
  • 四、详细分析入门案例
  • 五、分类树参数解释
    • 5.1、criterion
    • 5.2、random_state & splitter
    • 5.3、剪枝参数
    • 5.4、目标权重参数:class_weight & min_weight_fraction_leaf

一、环境准备

在开始学习前,需要准备好相应的环境配置。这里我选择了anaconda,创建了一个专门的虚拟环境来学习机器学习。这里关于anaconda的安装等就不赘述了,没有难度。

二、决策树是什么

通俗的说,有督促学习方法就是需要一个标签,即在知道答案的基础上进行模型训练。决策树就是从数据中读取出特定的特征,根据这些特征总结出决策规,然后使用树结构来呈现。

三、快速入门分类树

得益于强大的sklearn库,让我们使用决策树的算法十分简单:

在这里,我们引入红酒数据集,这是一个很小的数据集。

from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
wine = load_wine()

然后我们就可以看看数据集长啥样了:

wine.data.shape
(178, 13)
wine.target
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转换成表格格式:

import pandas as pd
pd.concat([pd.DataFrame(wine.data),pd.DataFrame(wine.target)],axis=1)

可以看到,这个数据集只有178行,14列。数据量还是很小的。最后一列是我们的标签,每个数字对应一个具体的分类。

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']

可以看到,每个列对应一个特征,如0号列对应的就是alcohol,即酒精含量。其他的以此类推。

在看完数据集后,我们直接上手训练模型呗!

x_train,x_test,y_train,y_test = train_test_split(wine.data,wine.target,test_size=0.3)
clf = tree.DecisionTreeClassifier(criterion="entropy")
clf = clf.fit(x_train,y_train)
score = clf.score(x_test,y_test) # 返回预测的准确度accuracy

先分测试集,即第一行代码。然后我们调用函数,使用fit来训练,score来打分。运行这段代码,我们看看得了多少分:

百分之九十的准确率,还是十分高的。

但这么看,似乎不是很直观啊。我们可以把这棵树画出来:

feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青素','颜色强度','色调','od280/od315稀释葡萄酒','脯氨酸']
import graphviz
# filled 颜色 rounded 圆角
dot_data = tree.export_graphviz(clf
                                ,feature_names=feature_name
                                ,class_names=["琴酒","雪莉","贝尔摩德"]
                                ,filled=True
                                ,rounded=True
                               )
graph = graphviz.Source(dot_data)
graph

这里我们引入了graphviz包,画出了我们刚才的决策树:

这里的class是随便写的,你也可以写别的。

四、详细分析入门案例

可以看到,我们这棵树中并没有使用所有的特征,可能只使用了四五个的样子。我们可以使用一个函数来看看每个特征的百分比:

clf.feature_importances_
array([0.        , 0.        , 0.03388406, 0.        , 0.        ,
       0.        , 0.42702463, 0.        , 0.        , 0.24446215,
       0.        , 0.        , 0.29462916])

可以看到,我们只用了4个特征,得出了一颗树。这么看似乎不是很直观,我们用zip函数和对应的特征联一下:

[*zip(feature_name,clf.feature_importances_)]
[('酒精', 0.0),
 ('苹果酸', 0.0),
 ('灰', 0.03388405728736582),
 ('灰的碱性', 0.0),
 ('镁', 0.0),
 ('总酚', 0.0),
 ('类黄酮', 0.42702463433869187),
 ('非黄烷类酚类', 0.0),
 ('花青素', 0.0),
 ('颜色强度', 0.24446214572197708),
 ('色调', 0.0),
 ('od280/od315稀释葡萄酒', 0.0),
 ('脯氨酸', 0.29462916265196526)]

这样我们就会发现,占比最大的就构成了决策树的根节点,然后以此类推。

五、分类树参数解释

5.1、criterion

为了要将表格转化为一棵树,决策树需要找出最佳节点和最佳的分枝方法,对分类树来说,衡量这个“最佳”的指标叫做“不纯度”。通常来说,不纯度越低,决策树对训练集的拟合越好。现在使用的决策树算法在分枝方法上的核心大多是围绕在对某个不纯度相关指标的最优化上。

暂且不去理解所谓不纯度的概念,这个参数我们有两种取值:entropy与gini。那么这两种算法有什么区别呢?

比起基尼系数,信息熵对不纯度更加敏感,对不纯度的惩罚最强。但是在实际使用中,信息熵和基尼系数的效果基本相同。信息熵的计算比基尼系数缓慢一些,因为基尼系数的计算不涉及对数。另外,因为信息熵对不纯度更加敏感,所以信息熵作为指标时,决策树的生长会更加“精细”,因此对于高维数据或者噪音过多的数据,信息熵很容易过拟合,基尼系数在这种情况下效果往往比较好。当模型拟合程度不足的时候,即当模型在训练集和测试集上都表现不太好的时候,使用信息熵。当然,这些不是绝对的。

简单来说,我们在调参时可以两个都试试,默认是gini。因为这两个算法其实并没有绝对说用哪个。

5.2、random_state & splitter

random_state用来设置分枝中的随机模式的参数,默认None,在高维度时随机性会表现更明显,低维度的数据(比如鸢尾花数据集),随机性几乎不会显现。输入任意整数,会一直长出同一棵树,让模型稳定下来。

splitter也是用来控制决策树中的随机选项的,有两种输入值,输入”best",决策树在分枝时虽然随机,但是还是会优先选择更重要的特征进行分枝(重要性可以通过属性feature_importances_查看),输入“random",决策树在分枝时会更加随机,树会因为含有更多的不必要信息而更深更大,并因这些不必要信息而降低对训练集的拟合。这也是防止过拟合的一种方式。

这两个参数可以让树的模型稳定,并且更好的使用模型。

clf = tree.DecisionTreeClassifier(criterion="entropy"
                                  ,random_state=0
                                  ,splitter="random"
                                 )
clf = clf.fit(x_train, y_train)
score = clf.score(x_test, y_test)
score

比如我们添加了一些参数后,再次运行:

可以发现准确率飞到了98%,这说明我们参数的调整还是很有用的。

5.3、剪枝参数

在不加限制的情况下,一棵决策树会生长到衡量不纯度的指标最优,或者没有更多的特征可用为止。这样的决策树往往会过拟合,这就是说,它会在训练集上表现很好,在测试集上却表现糟糕。我们收集的样本数据不可能和整体的状况完全一致,因此当一棵决策树对训练数据有了过于优秀的解释性,它找出的规则必然包含了训练样本中的噪声,并使它对未知数据的拟合程度不足。

简单的说,我们需要对决策树进行限制,不能让他无限制的增长下去,不然只会让模型过拟合。

max_depth:

限制树的最大深度,超过设定深度的树枝全部剪掉。这是使用的最广泛的剪枝参数,实际使用建议从3开始尝试。

min_samples_leaf & min_samples_split:

min_samples_leaf限定,一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分枝就不会发生,或者,分枝会朝着满足每个子节点都包含min_samples_leaf个样本的方向去发生。

min_samples_split限定,一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分枝,否则分枝就不会发生。

这段话看起来很绕口,我们结合代码:

clf = tree.DecisionTreeClassifier(criterion="entropy"
                                 ,random_state=30
                                 ,splitter="random"
                                 ,max_depth=4
                                #,min_samples_leaf=12
                                  #,min_samples_split=10
                                  ,
                                 )
clf = clf.fit(x_train, y_train)
dot_data = tree.export_graphviz(clf
                                ,feature_names= feature_name
                                ,class_names=["琴酒","雪莉","贝尔摩德"]
                                ,filled=True
                                ,rounded=True
                               )
graph = graphviz.Source(dot_data)
graph

可以自己去跑一下理解一下。

max_features & min_impurity_decrease:

max_features限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃。和max_depth异曲同工,max_features是用来限制高维度数据的过拟合的剪枝参数,但其方法比较暴力,是直接限制可以使用的特征数量而强行使决策树停下的参数,在不知道决策树中的各个特征的重要性的情况下,强行设定这个参数可能会导致模型学习不足。如果希望通过降维的方式防止过拟合,建议使用PCA,ICA或者特征选择模块中的降维算法。

但我们怎么确定一个参数是最优的呢?我们可以通过画图的方式来查看:

import matplotlib.pyplot as plt
from matplotlib.pyplot import MultipleLocator
test = []
for i in range(50):
    clf = tree.DecisionTreeClassifier(max_depth=4
                                      ,criterion="entropy"
                                      ,random_state=30
                                      ,splitter="random"
                                      ,min_samples_leaf=i+5
                                     )
    clf = clf.fit(x_train, y_train)
    score = clf.score(x_test, y_test)
    test.append(score)

x_major_locator=MultipleLocator(2)
plt.plot(range(1,51),test,color="green",label="min_samples_leaf")
ax=plt.gca()
ax.xaxis.set_major_locator(x_major_locator)
plt.legend()
plt.show()

我们就可以清晰的看到了最高点出现在什么地方,进而更好的调参。

5.4、目标权重参数:class_weight & min_weight_fraction_leaf

完成样本标签平衡的参数。样本不平衡是指在一组数据集中,标签的一类天生占有很大的比例。比如说,在银行要判断“一个办了信用卡的人是否会违约”,就是是vs否(1%:99%)的比例。这种分类状况下,即便模型什么也不做,全把结果预测成“否”,正确率也能有99%。因此我们要使用class_weight参数对样本标签进行一定的均衡,给少量的标签更多的权重,让模型更偏向少数类,向捕获少数类的方向建模。该参数默认None,此模式表示自动给与数据集中的所有标签相同的权重。

有了权重之后,样本量就不再是单纯地记录数目,而是受输入的权重影响了,因此这时候剪枝,就需要搭配min_weight_fraction_leaf这个基于权重的剪枝参数来使用。另请注意,基于权重的剪枝参数(例如min_weight_fraction_leaf)将比不知道样本权重的标准(比如min_samples_leaf)更少偏向主导类。如果样本是加权的,则使用基于权重的预修剪标准来更容易优化树结构,这确保叶节点至少包含样本权重的总和的一小部分。

以上就是分析机器学习之决策树Python实现的详细内容,更多关于Python实现决策树的资料请关注我们其它相关文章!

(0)

相关推荐

  • python机器学习之决策树分类详解

    决策树分类与上一篇博客k近邻分类的最大的区别就在于,k近邻是没有训练过程的,而决策树是通过对训练数据进行分析,从而构造决策树,通过决策树来对测试数据进行分类,同样是属于监督学习的范畴.决策树的结果类似如下图: 图中方形方框代表叶节点,带圆边的方框代表决策节点,决策节点与叶节点的不同之处就是决策节点还需要通过判断该节点的状态来进一步分类. 那么如何通过训练数据来得到这样的决策树呢? 这里涉及要信息论中一个很重要的信息度量方式,香农熵.通过香农熵可以计算信息增益. 香农熵的计算公式如下: p(xi)

  • Python机器学习之决策树算法实例详解

    本文实例讲述了Python机器学习之决策树算法.分享给大家供大家参考,具体如下: 决策树学习是应用最广泛的归纳推理算法之一,是一种逼近离散值目标函数的方法,在这种方法中学习到的函数被表示为一棵决策树.决策树可以使用不熟悉的数据集合,并从中提取出一系列规则,机器学习算法最终将使用这些从数据集中创造的规则.决策树的优点为:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据.缺点为:可能产生过度匹配的问题.决策树适于处理离散型和连续型的数据. 在决策树中最重要的就是如何选取

  • Python机器学习之决策树

    一.要求 二.原理 决策树是一种类似于流程图的结构,其中每个内部节点代表一个属性上的"测试",每个分支代表测试的结果,每个叶节点代表一个测试结果.类标签(在计算所有属性后做出的决定).从根到叶的路径代表分类规则. 决策树学习的目的是为了产生一棵泛化能力强,即处理未见示例能力强的决策树.因此如何构建决策树,是后续预测的关键!而构建决策树,就需要确定类标签判断的先后,其决定了构建的决策树的性能.决策树的分支节点应该尽可能的属于同一类别,即节点的"纯度"要越来越高,只有这

  • 机器学习python实战之决策树

    决策树原理:从数据集中找出决定性的特征对数据集进行迭代划分,直到某个分支下的数据都属于同一类型,或者已经遍历了所有划分数据集的特征,停止决策树算法. 每次划分数据集的特征都有很多,那么我们怎么来选择到底根据哪一个特征划分数据集呢?这里我们需要引入信息增益和信息熵的概念. 一.信息增益 划分数据集的原则是:将无序的数据变的有序.在划分数据集之前之后信息发生的变化称为信息增益.知道如何计算信息增益,我们就可以计算根据每个特征划分数据集获得的信息增益,选择信息增益最高的特征就是最好的选择.首先我们先来

  • Python机器学习之决策树算法

    一.决策树原理 决策树是用样本的属性作为结点,用属性的取值作为分支的树结构. 决策树的根结点是所有样本中信息量最大的属性.树的中间结点是该结点为根的子树所包含的样本子集中信息量最大的属性.决策树的叶结点是样本的类别值.决策树是一种知识表示形式,它是对所有样本数据的高度概括决策树能准确地识别所有样本的类别,也能有效地识别新样本的类别. 决策树算法ID3的基本思想: 首先找出最有判别力的属性,把样例分成多个子集,每个子集又选择最有判别力的属性进行划分,一直进行到所有子集仅包含同一类型的数据为止.最后

  • Python机器学习算法之决策树算法的实现与优缺点

    1.算法概述 决策树算法是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法. 分类算法是利用训练样本集获得分类函数即分类模型(分类器),从而实现将数据集中的样本划分到各个类中.分类模型通过学习训练样本中属性集与类别之间的潜在关系,并以此为依据对新样本属于哪一类进行预测. 决策树算法是直观运用概率分析的一种图解法,是一种十分常用的分类方法,属于有监督学习. 决策树是一种树形结构,其中每个内部结点表示在一个属性上的测试,每个

  • Python机器学习算法库scikit-learn学习之决策树实现方法详解

    本文实例讲述了Python机器学习算法库scikit-learn学习之决策树实现方法.分享给大家供大家参考,具体如下: 决策树 决策树(DTs)是一种用于分类和回归的非参数监督学习方法.目标是创建一个模型,通过从数据特性中推导出简单的决策规则来预测目标变量的值. 例如,在下面的例子中,决策树通过一组if-then-else决策规则从数据中学习到近似正弦曲线的情况.树越深,决策规则越复杂,模型也越合适. 决策树的一些优势是: 便于说明和理解,树可以可视化表达: 需要很少的数据准备.其他技术通常需要

  • python机器学习实现决策树

    本文实例为大家分享了python机器学习实现决策树的具体代码,供大家参考,具体内容如下 # -*- coding: utf-8 -*- """ Created on Sat Nov 9 10:42:38 2019 @author: asus """ """ 决策树 目的: 1. 使用决策树模型 2. 了解决策树模型的参数 3. 初步了解调参数 要求: 基于乳腺癌数据集完成以下任务: 1.调整参数criterion,使

  • python机器学习理论与实战(二)决策树

    决策树也是有监督机器学习方法. 电影<无耻混蛋>里有一幕游戏,在德军小酒馆里有几个人在玩20问题游戏,游戏规则是一个设迷者在纸牌中抽出一个目标(可以是人,也可以是物),而猜谜者可以提问题,设迷者只能回答是或者不是,在几个问题(最多二十个问题)之后,猜谜者通过逐步缩小范围就准确的找到了答案.这就类似于决策树的工作原理.(图一)是一个判断邮件类别的工作方式,可以看出判别方法很简单,基本都是阈值判断,关键是如何构建决策树,也就是如何训练一个决策树. (图一) 构建决策树的伪代码如下: Check i

  • 分析机器学习之决策树Python实现

    目录 一.环境准备 二.决策树是什么 三.快速入门分类树 四.详细分析入门案例 五.分类树参数解释 5.1.criterion 5.2.random_state & splitter 5.3.剪枝参数 5.4.目标权重参数:class_weight & min_weight_fraction_leaf 一.环境准备 在开始学习前,需要准备好相应的环境配置.这里我选择了anaconda,创建了一个专门的虚拟环境来学习机器学习.这里关于anaconda的安装等就不赘述了,没有难度. 二.决策树

  • Python机器学习之决策树和随机森林

    目录 什么是决策树 决策树组成 节点的确定方法 决策树基本流程 决策树的常用参数 代码实现决策树之分类树 网格搜索在分类树上的应用 分类树在合成数据的表现 什么是随机森林 随机森林的原理 随机森林常用参数 决策树和随机森林效果 实例用随机森林对乳腺癌数据的调参 什么是决策树 决策树属于经典的十大数据挖掘算法之一,是通过类似于流程图的数形结构,其规则就是iIF-THEN-的思想.,可以用于数值型因变量的预测或离散型因变量的分类,该算法简单直观,通俗易懂,不需要研究者掌握任何领域的知识或者复杂的数学

  • python机器学习基础决策树与随机森林概率论

    目录 一.决策树原理概述 1.决策树原理 2.信息论 ①信息熵 ②决策树的分类依据 ③其他决策树使用的算法 ④决策树API 二.决策树算法案例 1.案例概述 2.数据处理 3.特征工程 4.使用决策树进行预测 5.决策树优缺点及改进 三.随机森林 1.集成学习方法 2.单个树建立过程 3.随机森林API 4.随机森林使用案例 5.随机森林的优点 一.决策树原理概述 1.决策树原理 决策树的分类原理,相当于程序中的if-then结构,通过条件判断,来决定结果. 2.信息论 ①信息熵 假设有32支球

  • Python和Java的语法对比分析语法简洁上python的确完美胜出

    Python是一种广泛使用的解释型.高级编程.通用型编程语言,由吉多·范罗苏姆创造,第一版发布于1991年.可以视之为一种改良(加入一些其他编程语言的优点,如面向对象)的LISP.Python的设计哲学强调代码的可读性和简洁的语法(尤其是使用空格缩进划分代码块,而非使用大括号或者关键词).相比于C++或Java,Python让开发者能够用更少的代码表达想法.不管是小型还是大型程序,该语言都试图让程序的结构清晰明了. Java是一种广泛使用的计算机编程语言,拥有跨平台.面向对象.泛型编程的特性,广

  • 分析运行中的 Python 进程详细解析

    在 Java 中打印当前线程的方法栈,可以用 kill -3 命令向 JVM 发送一个 OS 信号,JVM 捕捉以后会自动 dump 出来:当然,也可以直接使用 jstack 工具完成,这些方法好几年前我在这篇性能分析的文章 中介绍过.这样的需求可以说很常见,比如定位死锁,定位一个不工作的线程到底卡在哪里,或者定位为什么 CPU 居高不下等等问题. 现在工作中我用的是 Python,需要线上问题定位的缘故,也有了类似的需求--想要知道当前的 Python 进程"在干什么".但是没有了

  • python实现决策树、随机森林的简单原理

    本文申明:此文为学习记录过程,中间多处引用大师讲义和内容. 一.概念 决策树(Decision Tree)是一种简单但是广泛使用的分类器.通过训练数据构建决策树,可以高效的对未知的数据进行分类.决策数有两大优点:1)决策树模型可以读性好,具有描述性,有助于人工分析:2)效率高,决策树只需要一次构建,反复使用,每一次预测的最大计算次数不超过决策树的深度. 看了一遍概念后,我们先从一个简单的案例开始,如下图我们样本: 对于上面的样本数据,根据不同特征值我们最后是选择是否约会,我们先自定义的一个决策树

  • Python机器学习logistic回归代码解析

    本文主要研究的是Python机器学习logistic回归的相关内容,同时介绍了一些机器学习中的概念,具体如下. Logistic回归的主要目的:寻找一个非线性函数sigmod最佳的拟合参数 拟合.插值和逼近是数值分析的三大工具 回归:对一直公式的位置参数进行估计 拟合:把平面上的一些系列点,用一条光滑曲线连接起来 logistic主要思想:根据现有数据对分类边界线建立回归公式.以此进行分类 sigmoid函数:在神经网络中它是所谓的激励函数.当输入大于0时,输出趋向于1,输入小于0时,输出趋向0

随机推荐