Python机器学习算法库scikit-learn学习之决策树实现方法详解
作者:Yeoman92 发布时间:2023-07-26 20:44:28
本文实例讲述了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程序设计有所帮助。
来源:https://blog.csdn.net/Yeoman92/article/details/73436632
猜你喜欢
- 我们需要开始思考如何将文本集合转化为可量化的东西。最简单的方法是考虑词频。我将尽量尝试不使用NLTK和Scikits-Learn包。我们首先
- 一、简化前馈网络LeNetimport torch as tclass LeNet(t.nn.Module): def __init__(s
- 前言使用 Python 的时候,我们知道 list 是一个长度可变对的数组, 可以通过 insert,append 和 extend 轻易的
- 前言上机实践课程开始了,嗯,老师来了之后念了下PPT,然后说:开始做吧.........然后就开始了Python的GUI之路,以前没接触过P
- 在今天的设计中,排版常常被忽视,特别是被网页设计师忽视。这真是件遗憾的事情因为CSS可以做很多事情来控制我们的排版。也就是说,我们被局限于某
- 因为使用python+selenium有时候需要获取当前文件的上一级目录,找了一段时间找到了,在此记录下来;os.path.dirname(
- 本文实现用python编写一个带界面的计算器小程序,当然这个计算器功能很简单,只能进行一些简单的数学运算,很适合初学者,希望能给大家带来一些
- 1. 引言之前已经有博客专门介绍了Python中的列表生成式,可能大家还不太擅长。这里推荐九个Python列表生成式的面试题(从简单到困难排
- 整理了一下python 中文件的输入输出及主要介绍一些os模块中对文件系统的操作。文件输入输出1、内建函数open(file_name,文件
- 一):视图的定义视图是由基于一个或多个表的一个查询所定义的虚拟表,它将查询的具体定义保存起来,视图不包含任何数据。视图在操作上和数据表没有什
- 具体代码如下所示:import sysimport osclass Logger(object): def __init__(s
- 最简单的数组合并我们只要使用array_merge即可array_merge()将两个或多个数组的单元合并起来,一个数组中的值附加在前一个数
- 本文实例讲述了django框架创建应用操作。分享给大家供大家参考,具体如下:18.1.5 安装Django安装Djangonod
- 相信很朋友因为PyCharm最新激活码或激活补丁的安装参数每月都会失效而烦恼PyCharm最新激活码先分享个PyCharm最新激活码大家可以
- 本文实例讲述了Python实现删除列表中满足一定条件的元素。分享给大家供大家参考,具体如下:从列表中删除满足一定条件的元素。如:删除一个列表
- 先给一个例子:假设在一个表单中有一个按钮id="save"$(document).ready(function(){&n
- 由于新版站长资讯即将发布,我每天都在想如何防止采集,目前想到的几种办法:1、多做几个列表和内容模板,随机使用,对目前大多数cms来说,这种方
- Git合并分支后,需要将子分支提交到git仓库,这个时候就需要单独提交子分支,其步骤如下:1.先创建子分支,并包含最新当前分支下的修改数据g
- 如何制作一个小巧的购物车?主程序如下:cartkit.aspClass CartKitSub CreateCart()&
- 1.使用render方法return render(request,'index.html') 返回的页面内容是index.