侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Python  /  管理员 发布于 7年前   251

本文实例讲述了Python机器学习算法库scikit-learn学习之决策树实现方法。分享给大家供大家参考,具体如下:

决策树

决策树(DTs)是一种用于分类和回归的非参数监督学习方法。目标是创建一个模型,通过从数据特性中推导出简单的决策规则来预测目标变量的值。

例如,在下面的例子中,决策树通过一组if-then-else决策规则从数据中学习到近似正弦曲线的情况。树越深,决策规则越复杂,模型也越合适。

决策树的一些优势是:

  • 便于说明和理解,树可以可视化表达;
  • 需要很少的数据准备。其他技术通常需要数据标准化,需要创建虚拟变量,并删除空白值。
  • 使用树的成本是用于对树进行训练的数据点的对数。
  • 能够处理数值和分类数据。其他技术通常是专门分析只有一种变量的数据集。
  • 能够处理多输出问题。
  • 使用白盒模型。如果一个给定的情况在模型中可以观察到,那么这个条件的解释很容易用布尔逻辑来解释。相比之下,在黑盒模型中(例如:在人工神经网络中,结果可能更难解释。
  • 可以使用统计测试验证模型。这样就可以解释模型的可靠性。
  • 即使它的假设在某种程度上违反了生成数据的真实模型,也会表现得很好。

决策树的缺点包括:

  • 决策树学习可能会生成过于复杂的树,不能代表普遍的规则,这就称为过拟合。修剪(目前不支持的)机制,设置叶片节点所需的最小样本数目或设置树的最大深度是避免此问题的必要条件。
  • 决策树可能不稳定,因为数据中的小变化可能导致生成完全不同的树。这个问题通过在一个集合中使用多个决策树来减轻。
  • 实际的决策树学习算法是基于启发式算法的,例如在每个节点上进行局部最优决策的贪婪算法。这种算法不能保证返回全局最优决策树。通过在集合学习者中训练多个树,可以减少这种情况,在这里,特征和样本是随机抽取的。
  • 有些概念很难学习,因为决策树无法很容易地表达它们,例如XOR、奇偶性或多路复用问题。

分类

决策树分类器(DecisionTreeClassifier)是一个能够在数据集上执行多类分类的类。

与其他分类器一样,决策树分类器以输入两个数组作为输入:数组X,稀疏或密集,[n_samples,n_features]保存训练样本,以及数组Y的整数值,[n_samples],保存训练样本的类标签:

>>> from sklearn import tree>>> X = [[0, 0], [1, 1]]>>> Y = [0, 1]>>> clf = tree.DecisionTreeClassifier()>>> clf = clf.fit(X, Y)

模型可以用来预测样本的类别:

>>> clf.predict([[2., 2.]])array([1])

或者,可以预测每个类的概率,在叶片上同一类的训练样本的分数

>>> clf.predict_proba([[2., 2.]])array([[ 0., 1.]])

DecisionTreeClassifier可以同时进行二进制(其中标签为[- 1,1])分类和多类(标签为[0],……,k - 1])分类。

使用虹膜数据集,我们可以构建如下的树:

>>> from sklearn.datasets import load_iris>>> from sklearn import tree>>> iris = load_iris()>>> clf = tree.DecisionTreeClassifier()>>> clf = clf.fit(iris.data, iris.target)

训练之后,我们可以使用export_graphviz  将树导出为Graphviz格式。下面是一个在整个iris(虹膜)数据集上输出的树示例:

>>> with open("iris.dot", 'w') as f:...   f = tree.export_graphviz(clf, out_file=f)

然后我们可以使用Graphviz的dot工具来创建一个PDF文件(或者任何其他受支持的文件类型):dot -Tpdf iris.dot -o iris.pdf

>>> import os>>> os.unlink('iris.dot')

或者,如果我们安装了Python模块pydotplus,我们可以在Python中直接生成PDF文件(或任何其他受支持的文件类型):

>>> import pydotplus>>> dot_data = tree.export_graphviz(clf, out_file=None)>>> graph = pydotplus.graph_from_dot_data(dot_data)>>> graph.write_pdf("iris.pdf")

export_graphviz exporter 还支持各种各样的选项,包括根据它们的类(或用于回归的值)着色节点,如果需要的话,还可以使用显式变量和类名IPython还可以使用Image()函数来显示这些情节:

>>> from IPython.display import Image>>> dot_data = tree.export_graphviz(clf, out_file=None, feature_names=iris.feature_names, class_names=iris.target_names, filled=True, rounded=True, special_characters=True)>>> graph = pydotplus.graph_from_dot_data(dot_data)>>> Image(graph.create_png())

模型可以用来预测样本的类别:

>>> clf.predict(iris.data[:1, :])array([0])

或者,可以预测每个类的概率,这是同一类在叶子中的训练样本的分数:

>>> clf.predict_proba(iris.data[:1, :])array([[ 1., 0., 0.]])

Examples:

Plot the decision surface of a decision tree on the iris dataset

回归

使用决策树类回归,决策树也可以应用于回归问题。

在分类设置中,fit方法将数组X和y作为参数,只有在这种情况下,y被期望有浮点值而不是整数值:

>>> from sklearn import tree>>> X = [[0, 0], [2, 2]]>>> y = [0.5, 2.5]>>> clf = tree.DecisionTreeRegressor()>>> clf = clf.fit(X, y)>>> clf.predict([[1, 1]])array([ 0.5])

Examples:

Decision Tree Regression

多输出问题

一个多输出问题是一个受监督的学习问题,有几个输出可以预测,即当Y是一个二维数组[n_samples,n_output]。

当输出之间没有相关性时,解决这类问题的一个非常简单的方法是建立n个独立的模型,即每一个输出,然后使用这些模型独立地预测每一个输出。

然而,因为可能与相同输入相关的输出值本身是相关的,通常更好的方法是构建一个能够同时预测所有n输出的单一模型。首先,它需要较低的培训时间,因为只构建了一个估计值。其次,结果估计量的泛化精度通常会增加。

对于决策树,这种策略可以很容易地用于支持多输出问题。这需要以下更改:

  • 在叶子中存储n个输出值,而不是1;
  • 使用分割标准来计算所有n输出的平均下降。

这个模块提供了支持多输出问题的方法,通过DecisionTreeClassifier 和DecisionTreeRegressor实现这个策略。

如果决策树符合大小(n_samples,n_output)的输出数组Y,那么得到的估计值将是:

  • 预测输出的n_output值;
  • 在predict_proba上输出类概率的n_output数组。

多输出决策树回归中显示了多输出树的回归。在这个例子中,输入X是一个单一的实际值,输出Y是X的正弦和余弦。

Examples:

决策树多输出回归

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python数据结构与算法教程》、《Python加密解密算法与技巧总结》、《Python编码操作技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。


  • 上一条:
    python 中pyqt5 树节点点击实现多窗口切换问题
    下一条:
    Python 中PyQt5 点击主窗口弹出另一个窗口的实现方法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客