一、回顾

  • 什么是决策树,信息熵

  • 构建决策树的过程

  • ID3、C4.5和CRAT算法

上面三篇,主要介绍了相关的理论知识,其中构建决策树的过程可以很好地帮助我们理解决策树的分裂属性的选择。

本篇所有源代码:Github

二、决策树的Python实现

假设我们有数据集:

dataSet = [[1, 1, 'yes'],[1, 1, 'yes'],[1, 0, 'no'],[0, 1, 'no'],[0, 1, 'no']]
labels = ['第一个特征', '第二个特征']

我们用第二篇中介绍的信息增益的方法,来构造决策树,然后再用python代码实现:

1. 信息熵

P ( 0 ) = 3 / 5 = 0.6 P ( 1 ) = 2 / 5 = 0.4 P(0) = 3/5 = 0.6 \quad\quad P(1) = 2/5 = 0.4 P(0)=3/5=0.6P(1)=2/5=0.4

0 表示’no’,1 表示’yes’,P(0) 表示标签为 ‘no’ 的概率

i n f o ( D ) = − 0.6 l o g 0.6 − 0.4 l o g 0.4 ≈ 0.971 info(D) = -0.6log0.6-0.4log0.4 \approx 0.971 info(D)=−0.6log0.6−0.4log0.4≈0.971

2. 信息增益

i n f o ( D 第 一 个 特 征 为 1 ) = − 2 3 l o g 2 3 − 1 3 l o g 1 3 ≈ 0.918 info(D_{第一个特征为1}) = -\frac{2}{3}log\frac{2}{3}-\frac{1}{3}log\frac{1}{3} \approx 0.918 info(D第一个特征为1​)=−32​log32​−31​log31​≈0.918
i n f o ( D 第 一 个 特 征 为 0 ) = − 1 l o g 1 − 0 l o g 0 = 0 info(D_{第一个特征为0}) = -1log1- 0log0 = 0 info(D第一个特征为0​)=−1log1−0log0=0

G a i n ( 第 一 个 特 征 ) = i n f o ( D ) − 2 5 i n f o ( D 第 一 个 特 征 为 0 ) − 3 5 i n f o ( D 第 一 个 特 征 为 1 ) ≈ 0.42 Gain(第一个特征) = info(D) - \frac{2}{5}info(D_{第一个特征为0}) - \frac{3}{5}info(D_{第一个特征为1}) \approx 0.42 Gain(第一个特征)=info(D)−52​info(D第一个特征为0​)−53​info(D第一个特征为1​)≈0.42

i n f o ( D 第 二 个 特 征 为 1 ) = − 2 4 l o g 2 4 − 2 4 l o g 2 4 = 1 info(D_{第二个特征为1}) = -\frac{2}{4}log\frac{2}{4}-\frac{2}{4}log\frac{2}{4} = 1 info(D第二个特征为1​)=−42​log42​−42​log42​=1
i n f o ( D 第 二 个 特 征 为 0 ) = − 1 l o g 1 − 0 l o g 0 = 0 info(D_{第二个特征为0}) = -1log1- 0log0 = 0 info(D第二个特征为0​)=−1log1−0log0=0

G a i n ( 第 二 个 特 征 ) = i n f o ( D ) − 1 5 i n f o ( D 第 二 个 特 征 为 0 ) − 4 5 i n f o ( D 第 二 个 特 征 为 1 ) ≈ 0.12 Gain(第二个特征) = info(D) - \frac{1}{5}info(D_{第二个特征为0}) - \frac{4}{5}info(D_{第二个特征为1}) \approx 0.12 Gain(第二个特征)=info(D)−51​info(D第二个特征为0​)−54​info(D第二个特征为1​)≈0.12

由于第一个特征的信息增益大于第二个特征的信息增益,选择第一个特征作为根节点

此时就剩一个特征了,可以直接画,使用 多数表决法 决定叶子节点所属类别;如果还有其他特征,可以重复以上操作,直到达到决策树停止条件。

  • 使用 多数表决法 构成分类决策树
  • 如果决策规则不是使用多数表决法,而是使用 均方误差(MSE)或平均绝对误差(MAE) ,就可以构成回归决策树

3. 画出决策树

上图便是最终的决策树结构

4. 代码实现

代码可见:01_决策树的实现.py

运行结果为:
myTree: {'第一个特征': {0: 'no', 1: {'第二个特征': {0: 'no', 1: 'yes'}}}}

可见,运行结果和上图是一样,首先按第一个特征作为分裂属性,然后再按第二个属性

三、分类决策树案例

1. 鸢尾花数据分类

本案例主要看看使用决策树模型的一般步骤。

实现步骤:

  • 读取数据
  • 划分数据(特征数据与标签数据分开)
  • 数据分割(训练集和测试集)
  • 数据预处理(数据归一化、特征选择、降维)
  • 模型构建及训练
  • 模型预测
  • 模型评估
  • 画图

可得到如下结果:
Score: 0.9666666666666667Classes: [0 1 2]获取各个特征的权重:[0.91754496 0.08245504]

由结果可见,正确率达到了96.7%
本案例通过特征选择选择了3个特征,当三维不好画图;
然后通过降维处理,降为二维,得到以上结果

代码可见:02_鸢尾花数据分类.py

2. 鸢尾花数据分类(参数优化)

本案例主要是选择出最优的模型参数(超参数),以使模型达到最优。

实现步骤:

  • 读取数据
  • 划分数据(特征数据与标签数据分开)
  • 数据分割(训练集和测试集):至此和三个案例一样
  • 参数优化(通过管道设置模型及参数)
  • 模型构建及训练
  • 模型评估
  • 应用以上得到的最优参数查看效果
最优参数列表: {'decision__criterion': 'gini', 'decision__max_depth': 4, 'pca__n_components': 0.99, 'skb__k': 3}
score值: 0.95
最优模型:Pipeline(memory=None,steps=[('mms', MinMaxScaler(copy=True, feature_range=(0, 1))),('skb', SelectKBest(k=3, score_func=<function chi2 at 0x0000010FDCA9A0D0>)), ('pca', PCA(copy=True, iterated_power='auto', n_components=0.99, random_state=None, svd_solver='auto', tol=0.0, whiten=False)),('decision', DecisionTreeClass... min_weight_fraction_leaf=0.0, presort=False, random_state=0, splitter='best'))])

代码可见:03_鸢尾花数据分类_参数优化.py

3.鸢尾花数据分类(决策树深度不同)

本案例主要为了测试决策树不同深度给模型带来的效果。

实现步骤:

  • 读取数据
  • 划分数据(特征数据与标签数据分开)
  • 数据分割(训练集和测试集):至此和三个案例一样
  • 模型训练(基于不同深度依次训练,此处省略了数据预处理),并记录每个深度下的正确率
  • 画出正确率变化图

运行结果可能不一样,大体可以看出:

  • 当决策树深度为1时,错误率比较大,此时模型欠拟合;
  • 当决策树深度为2时,错误率达到最低;
  • 之后,错误率基本没变化,说明此时的模型以及开始过拟合了;

代码可见:04_鸢尾花数据分类_决策树深度不同.py

4.鸢尾花数据分类(特征属性比较)

本案例主要是使用2个特征来训练模型,并且这两个特征为任意组合,最后查看每个模型的效果。

实现步骤:

  • 读取数据
  • 划分数据(特征数据与标签数据分开)
  • 数据分割(训练集和测试集):至此和三个案例一样
  • 特征比较(每组特征模型训练,画图)

由图可看出,使用花瓣长度和花瓣宽度特征,模型正确率达到了99.33%,可以推断这两个特征对于分类决策的效果最好。
也就是这三类花在花瓣长度和花瓣宽度有不同的大小

代码可见:05_鸢尾花数据分类_特征比较.py

四、回归决策树案例

1. 波士顿房屋租赁价格预测

本案例使用回归决策树进行房屋租赁价格预测,并与之前在回归算法中使用线性回归、Lasso回归、Ridge回归进行比较。

实现步骤:

  • 读取数据
  • 划分数据(特征数据与标签数据分开)
  • 数据分割(训练集和测试集):这些步骤和前面的案例类似
  • 数据处理(数据归一化)
  • 模型构建,并训练,预测,评估(决策树、线性回归、Lasso回归、Ridge回归)
  • 画图

由图可知,回归决策树的效果其他方法的效果都好

代码可见:06_波士顿房屋租赁价格预测.py

2. 波士顿房屋租赁价格预测(参数优化)

本案例是主要是选择出最佳模型的参数。

实现步骤:

  • 读取数据
  • 划分数据(特征数据与标签数据分开)
  • 数据分割(训练集和测试集)
  • 参数优化(通过管道设置模型及参数)
  • 模型构建及训练
  • 应用以上得到的最优参数查看效果
运行结果为:
0 score值: 0.4001529052721232 最优参数列表: {'decision__max_depth': 7, 'pca__n_components': 0.75}
1 score值: 0.7569661898236847 最优参数列表: {'decision__max_depth': 4}
2 score值: 0.7565404744169743 最优参数列表: {'decision__max_depth': 4}正确率: 0.8435980902870441

此程序每次运行得到的最优模型的参数有些不一样 ,不过最后的正确率都差不多

代码可见:07_波士顿房屋租赁价格预测_参数优化.py

3. 波士顿房屋租赁价格预测(决策树不同深度)

本案例主要为了测试决策树不同深度给模型带来的效果。

实现步骤:

  • 读取数据
  • 划分数据(特征数据与标签数据分开)
  • 数据分割(训练集和测试集):至此和三个案例一样
  • 模型训练(基于不同深度依次训练,此处省略了数据预处理),并记录每个深度下的正确率
  • 画出正确率变化图

由上图可知:

  • 当深度比较小的时候,错误率比较高,模型欠拟合;
  • 当深度为4的时候,错误率达到了最低,模型最佳;
  • 再增加模型深度,错误率一直在波动,说明说明模型开始过拟合了

代码可见:08_波士顿房屋租赁价格预测_决策树深度不同.py

五、回归决策树过欠拟合与过拟合

本案例主要是通过随机数据,看决策树深度对模型拟合程度的影响。

实现步骤:

  • 数据准备(随机构造数据,此处构造的是sin(x),加上随机噪声)
  • 模型构造(构造深度不一样的)
  • 模型训练
  • 模型预测(随机产生测试数据)
  • 画图展示

由上图可知:

  • 当深度为1,2的时候,图中黄色,、绿色的线,明显出现了欠拟合;
  • 当深度为5的时候,模型是和大多数数据吻合,但也把噪声也拟合的很好,出现了过拟合;
  • 当深度为3的时候,模型对数据比较拟合,当然也不一定是最优的。

代码可见:09_决策树欠拟合与过拟合.py

注:

  • 如果使用线性回归算法,那么拟合的线应该是曲线,当用回归决策树来拟合时,会呈一段一段的;
  • 因为,回归决策树和分类决策树的区别就在于决策规则,回归决策树使用的是均方误差之类的,是根据样本求得的,所以只会是一些点,不会连成曲线

总结

  • 决策树过拟合一般情况是由于节点太多导致的,剪枝优化对决策树的正确率影响是比较大的,也是最常用的一种优化方式。可见:剪枝处理

  • 此外,随机森林(Random Forest)也是常用的优化方式,利用训练数据随机产生多个决策树,形成一个森林。然后使用这个森林对数据进行预测,选取最多结果作为预测结果。

【机器学习】分类决策树与回归决策树案例相关推荐

  1. 机器学习之分类决策树与回归决策树—基于python实现

    大家好,我是带我去滑雪! 本期为大家介绍决策树算法,它一种基学习器,广泛应用于集成学习,用于大幅度提高模型的预测准确率.决策树在分区域时,会考虑特征向量对响应变量的影响,且每次仅使用一个分裂变量,这使 ...

  2. 机器学习理论基础 集成学习前期基础--分类决策树与回归决策树

  3. class4 决策树之回归树案例

    part1 案例: 用回归树来拟合一条曲线,添加噪声来观察回归树的表现 # (1)导入库 import numpy as np # 生成正弦曲线上的点 from sklearn.tree import ...

  4. 机器学习-分类算法-逻辑回归13

    逻辑回归是解决二分类问题的利器 数据来源:https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wiscons ...

  5. 机器学习算法 04 —— 决策树(ID3、C4.5、CART,剪枝,特征提取,回归决策树)

    文章目录 系列文章 决策树 1 决策树算法简介 2 决策树分类的原理 2.1 信息熵 2.2 决策树划分依据-信息增益(ID3) 2.3 决策树划分依据-信息增益率(C4.5) 2.4 决策树划分依据 ...

  6. 人工智能--决策树原理与代码实现、特征提取、回归决策树

    决策树:本质就是一个拥有多个判断节点的树 1,熵 系统越有序,集中,熵值越低:系统越混乱,越分散,熵值越高 在这里的计算中,log2记为1,通常以2为底 2,决策树的划分依据 2.1 信息增益 信息增 ...

  7. 15分钟带你入门sklearn与机器学习——分类算法篇

    作者 | 何从庆 本文转载自AI算法之心(ID:AIHeartForYou) [导读]众所周知,Scikit-learn(以前称为scikits.learn)是一个用于Python编程语言的免费软件机 ...

  8. 机器学习十大算法之-CART分类决策树、回归树和模型树

    转载(http://blog.163.com/zhoulili1987619@126/blog/static/35308201201542731455261/) Classification And ...

  9. python机器学习数据建模与分析——决策树详解及可视化案例

    文章目录 前言: 决策树的定义 熵和信息熵的相关概念 信息熵的简单理解 经典的决策树算法 ID3算法 划分选择或划分标准--信息增益 ID3算法的优缺点 C4.5算法 信息增益率 划分选择或划分标准- ...

最新文章

  1. c java 的关系,c#与c、java的关系
  2. Python3中lambda表达式介绍
  3. SpringIOC配置文件「bean」标签的属性id class name scope init-method destroy-method factory-bean factory-method
  4. junit:junit_简而言之,JUnit:Hello World
  5. 回答嵌入式初学者的一些问题
  6. 计算机网络ppt_大学四年,我这样学操作系统和计算机网络,毕业后成为了别人眼中的大神(附书籍推荐)
  7. UITableViewController 滚动引起的cocos2d动画暂停问题的解决
  8. if和else同时执行_为什么大量的if else这么不受待见?怎么“干掉”它?
  9. 单片机交通灯的电路图以及代码_单片机晶振“问答篇”(下),17大单片机晶振问题全解答...
  10. 算法(四)、时间复杂度、排序、查找
  11. OpenDDS的学习和使用
  12. Linux下网络传输(模拟路由器)
  13. MS SQL基本语法及实例操作
  14. java的jsf是什么_什么是 JSF(Java Server Faces)
  15. 如何批量的修改文件后缀名
  16. 达梦数据库迁移数据报错 字符串截断
  17. gwr模型用什么做_如何对好文章做信息处理,用好文章摘录模型
  18. 前端基础——CSS 选择器、网页美化
  19. 小巧轻便的腕上精灵,七夕就送讯飞腕式录音笔R1
  20. vue+springboot+腾讯云人脸核身

热门文章

  1. ClickOnce是什么?如何使用?
  2. python刷红包_程序员小伙使用Python刷短视频自动领红包,好嗨哟
  3. acs cisco 查看log_ACS常用操作(实战)
  4. 【密码加密】【MD5加密】【盐值加密】
  5. java自带的md5加密_JDK自带MD5加密算法
  6. cocos2d-x 获取屏幕大小 实际设计大小 分辨率适配问题
  7. 蓝旭工作室2020后端第三次培训
  8. html调起苹果手机摄像头_html5摄像头 如何调用手机摄像头
  9. 关于我是如何得到凯程书签的-研途微光之写给徐影:致谢拉比
  10. KEGG数据库以及 KAAS 网站注释