决策树算法学习笔记

0 声明

本文主要内容来自视频 '【2020机器学习全集】菜菜的sklearn完整版,价值4999元的最全机器学习sklearn全集,赶紧收藏_哔哩哔哩_bilibili' 以及视频课件“https://pan.baidu.com/s/1Xl4o0PMA5ysUILeCKvm_2w,提取码:a967”。

本文是一个学习笔记,不是一篇帮助新人入门的文章,其内容主要针对本人的薄弱环节,没有面面俱到,不一定适用所有人。

本文主要介绍了决策树的一些重要概念,比如节点不纯度、误差率、信息熵、基尼系数、信息增益、分支度以及增益率的数学计算原理;总结了使用sklearn工具包实现决策树的一些重要参数、接口及属性;还列举了两个sklearn实现回归以及分类树的例子;最后也是最重要的,对回归树的实现过程做了十分详细地介绍,并给出了代码对比。如果你想了解上述内容,本文将会适合你。

1 重要概念

决策树(Decision Tree)是一种非参数的有监督学习方法,它能够从一系列有特征和标签的数据中总结出决策规则,并用树状图的结构来呈现这些规则,以解决分类和回归问题。

(1)节点不纯度

决策树的每个叶子节点中都会包含一组数据,在这组数据中,如果有某一类标签占有较大的比例,就说叶子节点纯”,分枝分得好。某一类标签占的比例越大,叶子就越纯,不纯度就越低,分枝就越好;如果没有哪一类标签的比例很大,各类标签都相对平均,则说叶子节点"不纯",分枝不好,不纯度高。
(2)误差率(error)

衡量节点不纯度的指标之一。计算公式如下:

\operatorname{error}(t)=1-\max _{i=1}[p(i \mid t)]

(3)信息熵(entropy)

ID3采用的节点不纯度衡量指标。计算公式如下:

I(t)=-\sum_{i=0}^{c-1} p(i \mid t) \log _{2} p(i \mid t)

(4)基尼系数(gini impurity)

CART采用的节点不纯度的衡量指标。计算公式如下:

\operatorname{Gin} i=1-\sum_{i=0}^{c-1}[p(i \mid t)]^{2}

(5)信息增益(information gain)

父节点信息熵和子节点信息熵之差。计算公式如下:


Information\text{ }Gain =I(\text { parent })-I(\text { child })

特别地,有可能一个父节点之下会有多个子节点,此时的信息增益应该是父节点的信息熵 - 所有子节点信息熵的加权平均,其中的权重由单个叶子节点上所占的样本量与父节点上的总样本量的比值确定:

I(\text { child })=\sum_{j=1}^{k} \frac{N\left(v_{j}\right)}{N} I\left(v_{j}\right)

(5)分支度(information value)

一个对信息增益计算的修正方法。分支度简言之就是一个控制分类水平的惩罚项,计算方法如下:
Information\text{ }Value =-\sum_{i=1}^{k} P\left(v_{i}\right) \log _{2} P\left(v_{i}\right)

(6)增益率(gain ratio)

C4.5采用的节点不纯度衡量指标,该指标通过修正原有增益率的计算公式得到,其计算方法为:

\text { Gain Ratio }=\frac{\text { Information Gain }}{\text { Information Value }}

增益率的本质是同时考虑了信息增益以及分支度,分支倾向于选择信息增益大而分支度小的分类方法(也就是纯度提升很快,但也会避免把类别分特别细)。

2 基于 sci-kit learn 的分类树实现

2.0 重要类

tree.DecisionTreeClassifier分类树
tree.DecisionTreeRegressor回归树
tree.export_graphviz将生成的决策树导出为DOT格式,画图专用
tree.ExtraTreeClassifier高随机版本的分类树
tree.ExtraTreeRegressor高随机版本的回归树

2.1 重要参数

(0)criterion

criterion这个参数是用来决定不纯度的计算方法的,分为基尼系数(geni)与信息(entropy)。信息熵对不纯度更加敏感,维度大时使用信息熵容易过拟合,因此,对于高维度数据,使用基尼系数;低维度是两者都可以;欠拟合时使用信息熵。默认使用的是基尼系数。使用方法如下:

clf = tree.DecisionTreeClassifier(criterion="entropy")

(1)random_state

对于高维度的数据。每次执行决策树的结果很可能不一样,设置random_state可以使得结果重现。使用方法为:

clf = tree.DecisionTreeClassifier(criterion="entropy",random_state=30)

(2)splitter

splitter决定分支的随机状态。best:随机,但是会优先选择重要特征进行分类;random:比best更加随机,树会因为含有更多的不必要信息而更深更大,并因这些不必要信息而降低对训练集的拟合,是防止过拟合手段之一。使用方法为:

# 默认就是best,可以不写
clf = tree.DecisionTreeClassifier(criterion="entropy",random_state=30,splitter="best" )

(3)减枝操作

max_depth设置最大深度,最好从三开始
min_samples_leaf限定一个节点分支后的每个子节点必须要包含至少min_samples_leaf个训练样本,一般搭配max_depth使用,使得模型更加平滑,太小过拟合,太大欠拟合,5开始,分枝会朝着满足每个子节点都包含min_samples_leaf个样本的方向去发生
min_samples_split限定一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分枝
min_impurity_decrease限制信息增益的大小,信息增益小于设定数值的分枝不会发生
max_features设定允许使用的特征个数

使用方法如下:

clf = tree.DecisionTreeClassifier(criterion="entropy"
                                    ,random_state=30
                                    ,splitter="random"
                                    ,max_depth=3 # 设置最大深度为3,只有三层子节点,减少计算量
                                    ,min_samples_leaf=10 # 限制样本数目,分枝会朝着满足每个子节点都包含min_samples_leaf个样本的方向去发生
                                    ,min_samples_split=20 # 限定是否产生分支
                                    ,min_impurity_decrease=0.001 # 父子节点信息增益为0.001以下不再产生新的分支
                                    ,max_features=4 # 只允许使用4个特征
                                    )

2.2 重要接口

(0)fit

训练接口,实现决策树训练。使用方法:

clf = clf.fit(Xtrain, Ytrain)

(1)score

测试接口,计算训练准确度。使用方法:

score = clf.score(Xtest, Ytest)  # 返回预测的准确度accuracy

(2)apply

返回每个测试样本所在的叶子节点的索引。使用方法如下:

clf.apply(Xtest)

(3)predict

返回每个测试样本的分类/回归结果。使用方法如下:

clf.predict(Xtest)

2.3 分类树的重要属性

feature_importances_属性用于查看各个特征的重要性,使用方法如下:

clf.feature_importances_

2.4 分类树的代码实现

导入有关的包(这里只给出与决策树有关的包,其他可能会用的包,比如pandas、matplotlib等不写出,根据实际需要import):

from sklearn import tree  # 导入决策树
from sklearn.model_selection import train_test_split  # 用于划分测试集和训练集
import graphviz # 用于绘制树状图
from sklearn.datasets import load_wine  # 导入sklearn中的数据(实际应用中根据需要选择自己的数据)

加载数据:

wine = load_wine()  # 导入数据

划分训练集和测试集:

# 划分数据为测试集与训练集,0.3表示0.3的数据为测试集,其余为训练集,4个变量的顺序一定不能乱
Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data, wine.target, test_size=0.3)

实例化:

clf = tree.DecisionTreeClassifier(criterion="entropy")  # 实例化

训练接口:

clf = clf.fit(Xtrain, Ytrain)  # 开始训练

查看预测准确度:

score = clf.score(Xtest, Ytest)  # 返回预测的准确度accuracy

绘制分类树:

# 设定特征名称,会根据特征名称进行分类,否则就是数字
feature_name = ['酒精', '苹果酸', '灰', '灰的碱性', '镁', '总酚', '类黄酮',
                '非黄烷类酚类', '花青素', '颜色强度', '色调', 'od280/od315稀释葡萄酒', '脯氨酸']
# 绘制分类树
dot_data = tree.export_graphviz(clf, feature_names=feature_name, class_names=["琴酒", "雪莉", "贝尔摩德"], filled=True, rounded=True
                                ) # filled表示填充颜色,rounded加圆角,颜色越深纯度越高
graph = graphviz.Source(dot_data)

graph

3 回归树原理

3.1 算法步骤

分类树的原理浅显易懂,不言自明。回归树的原理却不那么显然,下面专门花一个章节讨论一下Regression Tree的实现过程。

步骤1:对每一个变量j,选择不同的切分点s进行切分,每一个变量j及其对应的每一个切分方式,都对应一个数值对(j,s),按照这个(j,s)划分区域并按照以下公式计算输出值:

\begin{gathered} R_{1}(j, s)=\left\{x \mid x^{(j)} \leqslant s\right\}, \quad R_{2}(j, s)=\left\{x \mid x^{(j)}>s\right\} \\ {c}_{m}=\frac{1}{N_{m}} \sum_{x \in R_{n}(j, s)} y_{i}, \quad x \in R_{m}, m=1,2 \end{gathered}

步骤2:计算出每一个特征变量j对应的最优的一种切分方式,计算公式如下:

\min _{c1} \sum_{x, R_{1}(j, s)}\left(y_{i}-c_{1}\right)^{2}+\min _{c_{2}} \sum_{x \in R_{2}(j, x)}\left(y_{i}-c_{2}\right)^{2}

重复执行步骤2操作直到选择出所有特征变量最优的切分方式。 

步骤3:按照以下公式选择出最优的特征变量及其对应的切分方式:

\min _{j, x}\left[\min _{c1} \sum_{x, R_{1}(j, s)}\left(y_{i}-c_{1}\right)^{2}+\min _{c_{2}} \sum_{x \in R_{2}(j, x)}\left(y_{i}-c_{2}\right)^{2}\right]

步骤4:对获取的两个子区域中的每一个执行步骤1到步骤3过程;

步骤5:重复步骤1到步骤4,直到满足结束条件;

步骤6:将所有空间区域划分为M个区域,生成决策树,输出结果。

3.2 实例讲解

算法步骤属实有点晦涩难懂,下面结合一个简单实例手动实现一个回归树计算过程。

x1234
y1234

步骤1:对每一个特征变量j,选择不同的划分方式对其进行划分,这里以1.5, 2.5, 3.5作为划分点。若s=1.5,这R1={1},R2={2,3,4},因此c1=1/1*(1)=1;c2=1/3*(2+3+4)=3;s=2.5,这R1={1,2},R2={3,4},因此c1=1/2*(1+2)=1.5;c2=1/2*(3+4)=3.5;s=3.5,这R1={1,2,3},R2={4},因此c1=1/3*(1+2+3)=2;c2=1/1*(4)=4。

s1.52.53.5
c111.52
c233.54

步骤2:计算每一个特征变量最优的一种切分方式:   

Loss_{1.5}=[(1-1)^2]+(2-3)^2+(3-3)^2+(4-3)^2=\\0+1+1=2

Loss_{2.5}=[(1-1.5)^2+(2-1.5)^2]+[(3-3.5)^2+(4-3.5)^2]\\=0.25+0.25+0.25+0.25=1

Loss_{3.5}=[(1-2)^2+(2-2)^2+(3-2)^2]+[(4-4)^2]\\=1+0+1+0=2

s1.52.53.5
Loss2  12

根据loss计算结果,对于特征变量x,其最优的划分应该是x=2.5。

步骤3:选择最优的特征变量,本例就一个变量x,故不用选择,这步直接跳过。

步骤4:按照前三步得到的划分方式,得到两个新的子区间R1={1,2};R2={3,4},对这两个区间执行步骤1到步骤3的所有过程。

对于R1,可以得到以下表格:

s1.5
c11
c22

对于R2,可以得到以下表格:

s3.5
c13
c24

此时已经达到结束条件,总共划分出4个区间:

 以上就是回归树的整个计算过程。

下面以代码为证:

from sklearn.tree import DecisionTreeRegressor
from sklearn import tree
import numpy as np
import graphviz
import matplotlib.pyplot as plt

X = np.array([1, 2, 3, 4])[:, np.newaxis]
x = np.linspace(1, 4, 10)[:, np.newaxis]
Y = np.array([1, 2, 3, 4])[:, np.newaxis]
regr = DecisionTreeRegressor(max_depth=2)
regr.fit(X, Y)
y = regr.predict(x)
plt.figure()
plt.scatter(X, Y, s=20, edgecolor="black", c="darkorange")
plt.plot(x, y, color="yellowgreen", linewidth=2)
plt.show()
dot_data = tree.export_graphviz(regr, filled=True, rounded=True)
graph = graphviz.Source(dot_data)
graph

执行上述代码后的结果为:

树状图为:

 这与我们的上述推导过程完全一致。

4 基于 sci-kit learn 的回归树实现

回归树几乎所有的参数,属性及接口都和分类树一模一样。下面只提出一些专用于回归树的参数

4.0 criterion

回归树衡量分枝质量的指标,支持的标准有三种:

msemean squared error,父节点和叶子节点之间的均方误差的差额被用来作为特征选择的标准,这种方法通过使用叶子节点的均值来最小化L2损失

mae
mean absolute error,这种指标使用叶节点的中值来最小化L1损失
friedman_mse
 
这种指标使用弗里德曼针对潜在分枝中的问题改进后的均方误差

mse采用一下公式计算:

M S E=\frac{1}{N} \sum_{i=1}^{N}\left(f_{i}-y_{i}\right)^{2}

其中,fi是模型回归出的数值,yi是样本点i实际的数值标签。MSE的本质其实是样本真实数据与回归结果的差异。在回归树中,MSE不只是分枝质量衡量指标,也是最常用的衡量回归树回归质量的指标。

需要注意的是回归树的score返回的不是mse,而是R^2R^2的计算公式如下:

R^{2}=1-\frac{u}{v}

其中,u是残差平方和,v是总平方和,其计算公式为:

u=\sum_{i=1}^{N}\left(f_{i}-y_{i}\right)^{2} \quad v=\sum_{i=1}^{N}\left(y_{i}-\hat{y}\right)^{2}

其中,fi是模型回归出的数值,yi是样本点i实际的数值标签,\widehat{y}是真实数据标签的平均数。由R^2的表达式可以看出。当模型的残差平方和远远大于模型的总平方和,模型非常糟糕,R平方就会为负。

需要注意的还有一点,虽然均方误差永远为正,但是sklearn当中使用均方误差作为评判标准时,却是计算”负均方误差“(neg_mean_squared_error)。这是因为sklearn在计算模型评估指标的时候,会考虑指标本身的性质,均方误差本身是一种误差,所以被sklearn划分为模型的一种损失(loss),因此在sklearn当中,都以负数表示。真正的均方误差MSE的数值,其实就是neg_mean_squared_error去掉负号的数字。

4.1 cross_val_score()

cross_val_score()表示交叉验证,交叉验证是用来观察模型稳定性的一种方法,将数据划分为n份,依次使用其中一份作为测试集,其他n-1份作为训练集,多次计算模型的精确性来评估模型的平均准确程度。因为训练集和测试集的划分会干扰模型的结果,采用交叉验证n次的结果求出的平均值,是对模型效果的一个更好的度量。使用方法为:

regressor = DecisionTreeRegressor(random_state=0) # 实例化
cross_val_score(regressor, 
                boston.data,
                boston.target,
                cv=10,
                scoring="neg_mean_squared_error") # 划分为10份交叉验证,采用neg_mean_squared_error计算误差

4.2 回归树的代码实现

 导入必要的包:

import numpy as np
from sklearn.tree import DecisionTreeRegressor

 生成训练数据并加噪声:

rng = np.random.RandomState(1) # 随机数种子
X = np.sort(5 * rng.rand(500,1), axis=0) # 生成0~5之间随机的x的取值
y = np.sin(X).ravel() # 生成正弦曲线,打平称为1维
y[::50] +=  0.5*(0.5 - rng.rand(500//50)) #在正弦曲线上加噪声,每五十个加噪声

生成测试数据:

X_test = np.arange(0.0, 5.0, 0.001)[:, np.newaxis] # 升维

实例化回归树:

regr_2 = DecisionTreeRegressor(max_depth=10) # 深度为10

训练模型:

regr_2.fit(X, y)

获取预测值:

y_2 = regr_2.predict(X_test)

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 《机器学习学习笔记.pdf》是一本关于机器学习学习笔记的电子书,其内容涵盖了机器学习的基本概念、算法原理和实践应用等方面。 该电子书的主要内容包括但不限于以下几个方面: 1. 机器学习基础:介绍了机器学习的基本概念、发展历史和核心原理,帮助读者建立起对机器学习的整体认识和理解。 2. 机器学习算法:详细介绍了常见的机器学习算法,包括监督学习算法(如线性回归、逻辑回归、决策树、支持向量机等)、无监督学习算法(如聚类算法、降维算法等)和强化学习算法等,使读者能够了解和掌握不同类型的机器学习算法及其应用场景。 3. 机器学习实践:讲解了机器学习的实践方法和流程,涵盖了数据预处理、特征工程、模型选择和评估等方面的内容,帮助读者掌握如何在实际问题中应用机器学习技术。 4. 应用案例:通过实际案例的介绍和分析,展示了机器学习在自然语言处理、计算机视觉、推荐系统等领域的应用,激发读者对机器学习在实际问题中的应用的兴趣和思考能力。 通过阅读《机器学习学习笔记.pdf》,读者可以系统地学习机器学习的基础知识和算法原理,了解机器学习的应用场景和实践方法,并通过实际案例的分析加深对机器学习技术的理解。这本电子书可以作为机器学习初学者的入门学习资料,也适合有一定机器学习基础的读者作为参考和进一步学习的资料。希望通过这本电子书的阅读,读者能够理解和掌握机器学习的相关知识,为未来在机器学习领域的学习和研究打下坚实的基础。 ### 回答2: 《机器学习学习笔记.pdf》是一本介绍机器学习学习资料。机器学习是一种通过利用数据来训练计算机算法的方法,使其能够自动地从数据学习和提高性能。这本学习笔记涵盖了机器学习的基本概念、原理和方法,适合初学者和对机器学习感兴趣的读者。 首先,学习笔记机器学习的基本概念入手,包括机器学习的定义、应用领域以及机器学习的三个主要任务:监督学习、无监督学习和强化学习。然后,详细介绍了机器学习的基本原理,如训练集、测试集、特征选择和模型评估等。此外,学习笔记还介绍了几种常见的机器学习算法,如决策树、支持向量机和深度学习等。 除了理论知识,学习笔记还提供了实践案例和代码示例,帮助读者更好地理解和应用机器学习算法。读者可以通过实践案例来掌握机器学习算法的具体应用,并且可以利用代码示例进行实际编程实践。同时,学习笔记还讨论了机器学习的一些挑战和未来的发展方向,如数据质量、模型解释性和自动化机器学习等。 总的来说,《机器学习学习笔记.pdf》是一本全面介绍机器学习学习资料。它结合理论和实践,旨在帮助读者建立对机器学习的基本理解,并具备在实际问题中应用机器学习算法的能力。无论是初学者还是有一定机器学习基础的读者,都可以从中获得有益的知识和经验。 ### 回答3: 《机器学习学习笔记.pdf》是一本关于机器学习学习笔记文档。机器学习是人工智能领域的重要分支,它研究如何使计算机系统自动从数据学习和改进,以完成特定任务。这本学习笔记以简洁明了的方式介绍了机器学习的基本概念、算法和实践应用。 笔记中首先介绍了机器学习的基础知识,包括监督学习、无监督学习和强化学习等不同的学习类型。然后详细讲解了常用的机器学习算法,如线性回归、逻辑回归、决策树、支持向量机等。每种算法都给出了清晰的定义和示例,并详细解释了算法的原理和应用场景。 此外,《机器学习学习笔记.pdf》还包括了机器学习的实践应用和案例分析。它介绍了如何通过Python等编程语言和机器学习库进行实际的机器学习项目开发,包括数据预处理、特征工程、模型训练和评估等环节。对于初学者来说,这部分内容非常有价值,可以帮助他们快速进入实际应用的阶段。 总结来说,《机器学习学习笔记.pdf》是一本很好的机器学习入门教材,它详细介绍了机器学习的基本概念和常用算法,并提供了实际项目的实践指导。无论是对于想要了解机器学习基础知识的初学者,还是对于已经有一定机器学习经验的开发者来说,这本学习笔记都是一本值得阅读和参考的资料。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

syphomn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值