sklearn是一个功能非常强大的工具,可以用几行代码实现丰富的机器学习算法。

本文介绍使用sklearn实现决策树

决策树是经典的机器学习算法,很多复杂的机器学习算法都是由决策时演变而来.它是一种使用if-then-else的决策规则的监督学习方法.很容易理解,掌握.

决策树的优点:

便于理解和解释。树的结构可以可视化出来。

训练需要的数据少。其他机器学习模型通常需要数据规范化,比如构建虚拟变量和移除缺失值,不过请注意,这种模型不支持缺失值。

由于训练决策树的数据点的数量导致了决策树的使用开销呈指数分布(训练树模型的时间复杂度是参与训练数据点的对数值)。

能够处理数值型数据和分类数据。其他的技术通常只能用来专门分析某一种变量类型的数据集。详情请参阅算法。

能够处理多路输出的问题。

使用白盒模型。如果某种给定的情况在该模型中是可以观察的,那么就可以轻易的通过布尔逻辑来解释这种情况。相比之下,在黑盒模型中的结果就是很难说明清 楚地。

可以通过数值统计测试来验证该模型。这对事解释验证该模型的可靠性成为可能。

即使该模型假设的结果与真实模型所提供的数据有些违反,其表现依旧良好。

决策树的缺点:

决策树模型容易产生一个过于复杂的模型,这样的模型对数据的泛化性能会很差。这就是所谓的过拟合.一些策略像剪枝、设置叶节点所需的最小样本数或设置数的最大深度是避免出现 该问题最为有效地方法

决策树可能是不稳定的,因为数据中的微小变化可能会导致完全不同的树生成。这个问题可以通过决策树的集成来得到缓解

在多方面性能最优和简单化概念的要求下,学习一棵最优决策树通常是一个NP难问题。因此,实际的决策树学习算法是基于启发式算法,例如在每个节点进 行局部最优决策的贪心算法。这样的算法不能保证返回全局最优决策树。这个问题可以通过集成学习来训练多棵决策树来缓解,这多棵决策树一般通过对特征和样本有放回的随机采样来生成

有些概念很难被决策树学习到,因为决策树很难清楚的表述这些概念。例如XOR,奇偶或者复用器的问题

如果某些类在问题中占主导地位会使得创建的决策树有偏差。因此,我们建议在拟合前先对数据集进行平衡

以下代码描述了用sklearn实现决策树分类预测

from sklearn import tree

X = [[0, 0], [1, 1]]

Y = [0, 1]

clf = tree.DecisionTreeClassifier()

clf = clf.fit(X, Y)

我们将clf打印出来,看一下clf是个什么东西

可以看出来,clf里面包含了很多的决策树参数,这里不详细展开阐述,我们输入一个样本进行简单的预测

基于上面的分类方法,我们使用sklearn使用更多的参数实现完整的决策树。

对于决策树而言,常见的决策树分支方式一共有三种,前两种是基于信息熵的,ID3(信息增益),C4.5(信息增益比),以及基于基尼系数的CART决策树

但是因为到目前为止,sklearn中只实现了ID3与CART决策树,所以我们暂时只能使用这两种决策树,分支方式由超参数criterion决定:

gini:默认参数,基于基尼系数

entropy: 基于信息熵,也就是我们的ID3

我们使用鸢尾花数据集来实现决策树,我们这里选择的是gini系数来构建决策树

# 加载数据

from sklearn import datasets,model_selection

def load_data():

iris=datasets.load_iris() # scikit-learn 自带的 iris 数据集

X_train=iris.data

y_train=iris.target

return model_selection.train_test_split(X_train, y_train,test_size=0.25,random_state=0,stratify=y_train)

这里我们对鸢尾花数据集进行可视化,图片中已经使用逻辑回归对数据集进行分类(注意:鸢尾花数据集有4个特征,这里只使用了前两个特征)

maxdepth = 40

X_train,X_test,y_train,y_test=load_data()

depths=np.arange(1,maxdepth)

training_scores=[]

testing_scores=[]

for depth in depths:

clf = DecisionTreeClassifier(max_depth=depth)

clf.fit(X_train, y_train)

training_scores.append(clf.score(X_train,y_train))

testing_scores.append(clf.score(X_test,y_test))

将结果画出来

## 绘图

fig=plt.figure()

ax=fig.add_subplot(1,1,1)

ax.plot(depths,training_scores,label="traing score",marker='o')

ax.plot(depths,testing_scores,label="testing score",marker='*')

ax.set_xlabel("maxdepth")

ax.set_ylabel("score")

ax.set_title("Decision Tree Classification")

ax.legend(framealpha=0.5,loc='best')

plt.show()

通过上图可以看到,训练集的误差大约在决策树达到5层的时候就达到了0,随着决策树的层数增加,训练集的误差一直不变,但测试集的误差却一直在震荡。这是因为决策树层数过多,导致模型过拟合了.

因此我们需要减掉过多的分支,从而提高决策树的泛化能力.其中的方法虽然很多,但是整体而言都是围绕着枝节点与叶节点展开的

我们还可以将决策树画出来,这里推荐绘制流程图的神器graphviz,这里为了方便画图,重新使用了一段程序.

from sklearn.datasets import load_iris

from sklearn import tree

import graphviz

iris = load_iris()

clf = tree.DecisionTreeClassifier()

clf = clf.fit(iris.data, iris.target)

dot_data = tree.export_graphviz(clf, out_file=None)

graph = graphviz.Source(dot_data)

graph.render("iris")

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 = graphviz.Source(dot_data)

使用gini系数描绘出来的决策树

在sklearn中我们可以用来提高决策树泛化能力的超参数主要有:

max_depth:树的最大深度,也就是说当树的深度到达max_depth的时候无论还有多少可以分支的特征,决策树都会停止运算.

min_samples_split: 分裂所需的最小数量的节点数.当叶节点的样本数量小于该参数后,则不再生成分支.该分支的标签分类以该分支下标签最多的类别为准

min_samples_leaf; 一个分支所需要的最少样本数,如果在分支之后,某一个新增叶节点的特征样本数小于该超参数,则退回,不再进行剪枝.退回后的叶节点的标签以该叶节点中最多的标签你为准

min_weight_fraction_leaf: 最小的权重系数

max_leaf_nodes:最大叶节点数,None时无限制,取整数时,忽略max_depth

参考资料:

python中sklearn实现决策树及模型评估_sklearn实现决策树相关推荐

  1. Python中sklearn中HistGradientBoostingRegressor回归器配置单调约束参数monotonic_cst提高回归模型的抗噪声以及局部扰动的能力

    Python中sklearn中HistGradientBoostingRegressor回归器配置单调约束参数monotonic_cst提高回归模型的抗噪声以及局部扰动的能力 目录

  2. 分类决策树考虑了经验风险吗_数据挖掘导论 第4章 分类:基本概念、决策树与模型评估...

    第4章 分类:基本概念.决策树与模型评估 分类(classification):分类任务就是通过学习得到一个目标函数(target function)f,把每个属性集x映射到一个余弦定义的类标号y.目 ...

  3. Python使用sklearn构建lasso回归模型并指定样本权重:即构建带样本权重(sample_weight)的回归模型

    Python使用sklearn构建lasso回归模型并指定样本权重:即构建带样本权重(sample_weight)的回归模型 目录

  4. Python使用sklearn构建ElasticNet回归模型并指定样本权重:即构建带样本权重(sample_weight)的回归模型

    Python使用sklearn构建ElasticNet回归模型并指定样本权重:即构建带样本权重(sample_weight)的回归模型 目录

  5. python中sklearn实现决策树及模型评估_Python sklearn决策树算法实践

    scikit-learn简称sklearn,支持包括分类.回归.降维和聚类四大机器学习算法.还包含了特征提取.数据处理和模型评估三大模块.sklearn是Scipy科学计算库的扩展,建立在NumPy和 ...

  6. python 两点曲线_python机器学习分类模型评估

    python机器学习分类模型评估 1.混淆矩阵 在分类任务下,预测结果(Predicted Condition)与正确标记(True Condition)之间存在四种不同的组合,构成混淆矩阵(适用于多 ...

  7. m2cgen库:将Python(sklearn)训练的模型转化为C/C++代码

    m2cgen库:将机器学习模型转换为零依赖的本机代码(Java,C,Python,Go,JavaScript).本文演示将其转换为C/C++代码,使用sklearn机器学习库中的随机森林回归,训练波士 ...

  8. python中sklearn实现交叉验证

    质量要比数量重要,就像一个本垒打胜过两个双打.--<蚂蚁金服> 1.概述 在实验数据分析中,有些算法需要用现有的数据构建模型,如卷积神经网络(CNN),这类算法称为监督学习(Supervi ...

  9. python中的多态和鸭子模型

    多态性 是允许将父对象设置成为和一个或多个它的子对象相等的技术,比如Parent:=Child: 多态性使得能够利用同一类(基类)类型的指针来引用不同类的对象,以及根据所引用对象的不同,以不同的方式执 ...

最新文章

  1. Linux内核链表 内存屏障,为什么需要内存屏障
  2. 打破重重阻碍,Flutter 和 Web 生态如何对接?
  3. Android——用Activity和Service实现简单的音乐播放器
  4. Vue:触发视图更新的hack
  5. chrome remote desktop_无损音乐下载神器!洛雪音乐助手lx-music-desktop
  6. VC6启用运行时类型识别 (RTTI)
  7. Xshell连接Ubuntu时提示SSH服务器拒绝了密码
  8. 查询表达式和LINQ to Objects
  9. python编程100例-python100例,python经典例题
  10. 数学分析- 复旦 陈纪修 第一章(集合、映射与函数)
  11. 考虑实时安全优化的自学习自适应交通信号控制
  12. 离职前一定要做好这7件事情,少一件都很麻烦。
  13. 配置线在计算机端 使用什么端口,交换机怎么配置?这几种方式供你使用!
  14. 【180622】VC++ 超经典坦克大战双人版
  15. 可视化IDE | 快速高效制作可视化大屏~
  16. android文档来电广播,Android系统广播(来电示例)系统广播大全
  17. 三面阿里,offer到手定级P7,过程很艰辛结果很满意
  18. 在vue中获取input上传图片的宽和高
  19. python电子书: django
  20. 如何在Hi3559A上运行自己的YOLOv3模型(五)

热门文章

  1. 喜马拉雅主播工具软件:图片OCR文字识别自动转成mp3高品质语音文件
  2. 泪滴(teardrop)
  3. 高等数学(预备知识之对数函数)
  4. 时间序列分析预测未来 Ⅰ
  5. 抖音硬控控机房网络还可以这样搭建(抖音硬控控系统机房搭建)
  6. NoSQL 一致性[详解]更新一致性
  7. 实现抖音闪烁效果---OpenCV-Python开发指南(54)
  8. talib实现与通达信、同花顺一致的MACD、KDJ指标
  9. java定时从数据库抓取数据库,java查询数据库java如何实现定时从数据库查询新增的数据?...
  10. 7-6 王牌特工3 (15 分)