简易理解:决策树在机器学习中的应用
文章目录
- 一. 决策树算法简介
- 二. 决策树构建步骤
- 三. 特征说明
- 3.1 信息增益(Information Gain, IG)
- 3.2 基尼不纯度(Gini Impurity)
- 四. 剪枝策略
- 五. 决策树的评估
- 六. 代码实践
- 例1:决策树分类
- 例2:决策树回归
- 补充:可视化
- 例3:剪枝策略
一. 决策树算法简介
决策树(Decision Tree)用于分类和回归任务。它通过构建树状模型来进行决策。
决策树算法的基本思想是基于数据特征进行递归分裂。每个内部节点代表一个特征上的测试,每个分支代表测试的结果,而每个叶节点代表一个类别(在分类树中)或一个具体的数值(在回归树中)。
决策树算法的优点包括:模型易于理解和解释,不需要对数据进行太多预处理,可以处理数值型和类别型数据。
不过,决策树也有限制,比如容易过拟合,尤其是当树变得很复杂时。为了解决这个问题,通常需要剪枝或者通过集成方法(如随机森林)来提高模型的泛化能力。
二. 决策树构建步骤
- 选择最佳分裂特征:通过计算每个特征的信息增益(IG)或基尼不纯度(Gini Impurity),选择最能提高决策树准确度的特征。
- 决定分裂点:根据选定的特征确定最佳分裂点。
- 构建节点:创建决策树的节点,将数据集分裂为子集。
- 递归构建树:对每个子集重复步骤1到3,直到满足停止条件(如达到最大深度、节点中的样本数小于最小分裂样本数等)。
三. 特征说明
3.1 信息增益(Information Gain, IG)
信息增益是决策树算法中用于选择数据集分裂特征的一种方法。它基于熵(entropy),熵是度量数据集纯净度的一个指标,用于度量数据集中的混乱程度。信息增益则是指在知道某特征之后带来的熵的减少(即纯净度的增加)。
在构建决策树时,算法会计算每个特征的信息增益,并选择信息增益最大的特征作为节点分裂的特征。具体来说,信息增益定义为父节点的熵与加权平均后子节点熵的差值。
给定一个数据集(D),其熵可以表示为:
E n t r o p y ( D ) = − ∑ k = 1 K p k log 2 ( p k ) Entropy(D) = -\sum_{k=1}^{K} p_k \log_2(p_k) Entropy(D)=−k=1∑Kpklog2(pk)
其中,(K)是类别的数量,(p_k)是属于第(k)类的样本所占的比例。信息增益则计算为:
I G ( D , A ) = E n t r o p y ( D ) − ∑ v ∈ V a l u e s ( A ) ∣ D v ∣ ∣ D ∣ E n t r o p y ( D v ) IG(D, A) = Entropy(D) - \sum_{v \in Values(A)} \frac{|D_v|}{|D|} Entropy(D_v) IG(D,A)=Entropy(D)−v∈Values(A)∑∣D∣∣Dv∣Entropy(Dv)
这里,(A)表示一个特征,(Values(A))是该特征所有可能的值,(D_v)是在特征(A)的值为(v)时的子集,而(|D_v|/|D|)则是权重。
3.2 基尼不纯度(Gini Impurity)
基尼不纯度是另一种度量数据集纯净度的方法,常用于CART(Classification and Regression Trees)算法。与熵类似,基尼不纯度衡量的是一个随机选中的样本被错误标记的概率。
基尼不纯度越小,数据集的纯净度越高。对于给定的数据集(D),其基尼不纯度可以表示为:
G i n i ( D ) = 1 − ∑ k = 1 K p k 2 Gini(D) = 1 - \sum_{k=1}^{K} p_k^2 Gini(D)=1−k=1∑Kpk2
同样地,在构建决策树时,算法会寻找可以最大程度降低基尼不纯度的特征。
在选择最佳分裂特征时,不同的算法可能会偏好信息增益或基尼不纯度。信息增益倾向于选择拥有更多值的特征,而基尼不纯度则是一种更加平衡的选择标准,因为它不倾向于选择那些拥有大量唯一值的特征(如ID或唯一标识符)。
通过使用信息增益或基尼不纯度,决策树算法可以有效地选择出最合适的特征进行分裂,以构建出既能反映数据特征又具有较好泛化能力的模型。
关于更多基尼不纯度的介绍,也可以参考博客园的这篇基尼不纯度简介。
四. 剪枝策略
为了避免过拟合,决策树算法中引入了剪枝策略,包括预剪枝和后剪枝。预剪枝通过提前停止树的构建来防止过拟合;后剪枝则是先构建树,然后删除那些提升模型泛化能力的子树。
Scikit-learn的决策树模型提供了多个参数来控制树的生长,以此来实现预剪枝,但它不直接支持后剪枝操作。
五. 决策树的评估
决策树模型的评估可以通过多种方式进行,如准确率、召回率、F1分数、以及通过交叉验证来评估模型的泛化能力。
六. 代码实践
例1:决策树分类
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
# 加载iris数据集
iris = load_iris()
X = iris.data
y = iris.target
# 拆分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建决策树分类器实例
dtree = DecisionTreeClassifier(max_depth=3, random_state=42)
# 在训练集上训练决策树分类器
dtree.fit(X_train, y_train)
# 对测试集进行预测
predictions = dtree.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, predictions)
print(f'决策树分类器的准确率: {accuracy}')
例2:决策树回归
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error
"""
使用加利福尼亚州房价数据集来代替经典的Boston房价数据集.
load_boston函数已经从scikit-learn 1.2版本开始被移除了,原因是Boston房价数据集存在道德问题。
该数据集的创建者在变量"B"的设计中假设种族自我隔离对房价有正面影响,这一假设及其研究目的受到了质疑。
"""
# 加载加利福尼亚州房价数据集
housing = fetch_california_housing()
X = housing.data
y = housing.target
# 拆分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建决策树回归器实例
dtree_reg = DecisionTreeRegressor(max_depth=3, random_state=42)
# 在训练集上训练决策树回归器
dtree_reg.fit(X_train, y_train)
# 对测试集进行预测
predictions = dtree_reg.predict(X_test)
# 计算均方误差
mse = mean_squared_error(y_test, predictions)
print(f'决策树回归器的均方误差: {mse}')
通过调整决策树的参数(如max_depth
)和应用剪枝策略,可以有效地控制模型的复杂度,从而改善模型的性能和泛化能力。
补充:可视化
当然,我们还可以进一步对结果进行可视化:
- 通过
matplotlib
绘制实际值和预测价格的偏差; - 通过
plot_tree
进行决策树的可视化、
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree
# 可视化预测结果与实际值
plt.figure(figsize=(10, 6))
plt.scatter(y_test, predictions, alpha=0.5, label='Predictions')
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], 'k--', lw=2, label='Perfect Prediction')
plt.xlabel('Actual')
plt.ylabel('Predicted')
plt.title('Decision Tree Regressor Predictions vs Actual')
plt.legend()
plt.show()
# 使用plot_tree进行决策树可视化
plt.figure(figsize=(20,10))
plot_tree(dtree_reg,
feature_names=housing.feature_names,
filled=True,
rounded=True,
max_depth=3) # 限制树的深度为3,使图更简洁
plt.show()
运行后第一幅图的效果如下,其中黑色虚线表示预测值和实际值相等的完美预测线。
我们使用plot_tree可视化的决策树如下:
在这个决策树上,我们可以看到:
- 每个节点的决策条件(例如,某个特征的值是否小于某个阈值)。
- 每个节点的不纯度(对于回归树,通常是MSE;对于分类树,可能是基尼不纯度或熵)。
- 每个节点包含的样本数。
- 每个节点的值(对于回归树,是节点中所有样本目标值的平均值;对于分类树,是每个类别的样本数)。
- 叶节点的输出值。
我们解释一下其中一个节点(第二行左侧):
- MedInc <= 3.074: 这是一个分裂条件,表示特征“MedInc”(中位收入)小于等于3.074的样本将被分配到左侧的子节点。
- squared_error = 0.834: 这是节点内样本的均方误差,一个评估模型在该节点上表现的指标。它衡量的是模型的预测值与实际值之间差异的平方的平均值。
- samples = 13101: 表示在该节点处有13101个样本。
- value = 1.74: 对于回归决策树,这通常表示该节点样本目标值的平均值。
通过这种方式可以了解模型的决策过程,包括哪些特征对模型的预测结果有显著影响,以及这些特征是如何影响模型做出最终决策的。
例3:剪枝策略
我们只需要调整sklearn的DecisionTreeRegressor
的参数即可进行一个预剪枝的操作。
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree
# 加载加利福尼亚州房价数据集
housing = fetch_california_housing()
X = housing.data
y = housing.target
# 拆分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建决策树回归器实例,应用预剪枝策略
# 限制树的最大深度为3
# 设置节点在分裂前必须拥有的最小样本数为10
# 设置分裂节点时所需的最小增益为0.01
dtree_reg = DecisionTreeRegressor(max_depth=3, min_samples_split=10, min_impurity_decrease=0.01, random_state=42)
# 在训练集上训练决策树回归器
dtree_reg.fit(X_train, y_train)
# 对测试集进行预测
predictions = dtree_reg.predict(X_test)
# 计算均方误差
mse = mean_squared_error(y_test, predictions)
print(f'决策树回归器的均方误差: {mse}')
# 可视化决策树
plt.figure(figsize=(20, 10))
plot_tree(dtree_reg, feature_names=housing.feature_names, filled=True, rounded=True, max_depth=3)
plt.show()
可视化结果如下:
通常在预剪枝中,可能是因为该节点不满足分裂条件(例如,它的信息增益小于设定的阈值,或者样本数量少于最小分裂样本数等),我们可以发现,在相比原本的实现,这时候的右下角的决策树少了两个节点。
推荐阅读
-
手绘 | 深入分析机器学习在 8 个风控场景中的应用
-
NeurIPS 2022 | 最强斗地主AI!网易互娱AI Lab提出基于完美信息蒸馏的方法-完美信息蒸馏(PTIE) 在斗地主游戏中,非完美信息的引入主要是由于三位玩家均不能看到别人的手牌,对于任意一位玩家而言,仅可知道其余两位玩家当前手牌的并集,而难于精准判断每位玩家当前手牌。完美信息蒸馏的思路是针对这种非完美问题,构建一个第三方角色,该角色可以看到三位玩家的手牌,该角色在不告知每位玩家完美信息的情况下通过信息蒸馏的方式引导玩家打出当前情况下合理的出牌。 以强化学习常用的 Actor-Critic 算法为例,PTIE 在 Actor-Critic 算法的应用中可以利用 Critic 的 Value 输出作为蒸馏手段来提升 Actor 的表现。具体而言即在训练中 Critic 的输入为完美信息(包含所有玩家的手牌信息),Actor 的输入为非完美信息(仅包含自己手牌信息),此种情况下 Critic 给予的 Value 值包含了完美信息,可以更好地帮助 Actor 学习到更好的策略。 从更新公式上来看,正常的 Actor-Critic 算法 Actor 更新的方式如下: 在 PTIE 模式下,对于每个非完美信息状态 h,我们可以在 Critic 中构建对应的完美信息状态 D(h),并用 Critic 的输出来更新 Actor 的策略梯度,从而达到完美信息蒸馏的效果。 PTIE 框架的整体结构如下图所示: 无论是训练还是执行过程中智能体都不会直接使用完美信息,在训练中通过蒸馏将完美信息用于提升策略,从而帮助智能体达到一个更高的强度。 PTIE 的另一种蒸馏方式是将完美信息奖励引入到奖励值函数的训练中,PerfectDou 提出了基于阵营设计的完美信息奖励 node reward,以引导智能体学习到斗地主游戏中的合作策略,其定义如下: 如上所示,完美信息部分 代表 t 时刻地主手牌最少几步可以出完,在斗地主游戏中可以近似理解为是距游戏获胜的距离, 代表 t 时刻地主阵营和农民阵营距游戏获胜的距离之差, 为调节系数。通过此种奖励设计,在训练时既可以一定程度地引入各玩家的手牌信息(出完的步数需要知道具体手牌才能计算),同时也鼓励农民以阵营的角度做出决策,提升农民的合作性。 特征构建: PerfectDou 针对牌类游戏的特点主要构建了两部分特征:牌局状态特征和动作特征。其中牌局状态特征主要包括当前玩家手牌牌型特征、当前玩家打出的卡牌牌型特征、玩家角色、玩家手牌数目等常用特征,动作特征主要用于刻画当前状态下玩家的所有可能出牌,包括了每种出牌动作的牌型特征、动作的卡牌数目、是否为最大动作等特征。 牌型特征为 12 * 15 的矩阵,如下图所示: 该矩阵前 4 行代表对应每种卡牌的张数,5-12 行代表该种卡牌的种类和对应位置。 网络结构和动作空间设计 针对斗地主游戏出牌组合数较多的问题,PerfectDou 基于 RLCard 的工作上对动作空间进行了简化,对占比最大的两个出牌牌型:飞机带翅膀和四带二进行了动作压缩,将整体动作空间由 27472 种缩减到 621 种。 PerfectDou 策略网络结构如下图所示: 策略网络结构同样分为两部分:状态特征部分和动作特征部分。 在状态特征部分,LSTM 网络用于提取玩家的历史行为特征,当前牌局状态特征和提取后的行为特征会再通过多层的 MLP 网络输出当前的状态信息 embedding。 在动作特征部分,每个可行动作同样会经过多层 MLP 网络进行编码,编码后的动作特征会与其对应的状态信息 embedding 经过一层 MLP 网络计算两者间的相似度,并经由 softmax 函数输出对应的动作概率。 实验结果
-
[机器学习] 贝叶斯算法在机器学习中的应用及实例分析
-
中国人工智能学会通讯 - 最佳传输理论在机器学习中的应用 1.1 最佳传输理论与 WGAN 模型
-
openEuler郑州用户组成立!openEuler与hyperfusion携手共建河南地区用户生态 - 开幕致辞 超融合操作系统业务总经理、openEuler委员会成员蒋振华先生为本次活动致辞。 在本次活动的致辞中,他提到,作为openEuler社区早期的成员,超融合见证了openEuler从成立到在各行业商业落地,再到跨越生态拐点的过程,感谢openEuler提供了一个全产业链共同创新的平台,共同推动创新技术的商业落地。 同时,本次活动得到了郑州市郑东新区大数据管理局、郑州中原科技城投资服务局的大力支持。 郑东新区大数据管理局曹光远 在活动致辞中表示,openEuler的应用和*应用设施的深度优化,为郑东新区数字化转型提供了安全、可靠、高性能的技术基础;郑州中原科技城招商服务局王林表示,郑东新区欢迎所有openEuler生态相关企业扎根当地,围绕openEuler社区共同发展,形成合力。 openEuler社区及运维功能介绍 openEuler技术委员会委员胡峰 openEuler技术委员会委员胡峰先生在本次活动中介绍了openEuler社区目前发展的整体情况,并重点从技术层面介绍了openEuler的运维功能。 openEuler 晚会 胡峰先生介绍智能运维工具 A-Ops 和 openEuler gala、 阿波罗 Apollo、智能漏洞管理解决方案等新功能,以及涵盖各种运维场景的精品运维组件。在*交流环节,许多用户就目前使用的 openEuler 在*交流环节,许多用户就自己在使用openEuler过程中遇到的一些问题与胡峰先生进行了进一步的交流。 软硬结合,构建多样化算力操作系统 Hyperfusion 基于 openEuler 的基础上,结合自身软硬件技术积累,推出了富讯服务器操作系统 FusionOS FusionOS. FusionOS 首席架构师张海亮 分享了 FusionOS FusionOS首席架构师张海亮分享了FusionOS的软硬件协同优势、卓越的性能和可靠性,以及FusionOS在金融、运营商、*、互联网等行业的实践案例,引起了众多用户的兴趣,分享结束后,不少参会者就FusionOS的特点向讲师提问并进行了交流。
-
npj | ESA-ECMWF:地球系统观测和预测中机器学习应用的最新进展和研究方向
-
以图形方式理解机器学习中的正则化和范式
-
深度学习原理与实践:深度学习在图像分割中的应用
-
iCloud 切换区域,中国区保留 appStore(更新)--自 2018 年 2 月 28 日起,中国区 iCloud 由云上贵州管理 苹果公司发布的公告 https://support.apple.com/zh-cn/HT208352 关键词 关键部分 受影响的 iCloud 账户:国家或地区设置为 "中国 "的 Apple ID。 iCloud 包含的服务照片、邮件、通讯录、日历、提醒事项、备忘、书签、钱包、钥匙串、云备份、云驱动器、应用程序数据 新条款和条件: 同意仅出于本协议允许的目的并在中国法律允许的范围内使用服务。 云桂洲在提供服务时应使用合理的技能并尽职尽责,但在适用法律允许的最大范围内,我们不保证或担保您通过本服务存储或访问的任何内容不会意外损坏、崩溃、丢失或根据本协议的条款被删除,如果发生此类损坏、崩溃、丢失或删除,我们不承担任何责任。您应自行负责维护您的信息和数据的适当备份。 Apple 和云上贵州有权访问您存储在服务中的所有数据,包括有权根据适用法律相互之间共享、交换和披露所有用户数据(包括内容)。 本协议的解释、效力和履行应适用*法律。对于因本协议引起的或与本协议有关的任何争议,云桂洲和您同意提交中国国际经济贸易仲裁委员会(CIETAC)根据提交仲裁时有效的法律在北京进行具有约束力的仲裁。 由云桂洲管理,用户选择: 停用; ID 到地区; 受 iCloud(由云桂洲运营)条款和条件约束 首先,我想说说我对数据安全的看法。 当我在朋友圈发布通知时,有些朋友回复说国外的操作并没有多安全,或者国外的安全只是相对于国外而言的等等。首先,我非常感谢这些朋友,这让我反思什么是数据安全。以下观点均属个人观点: 国外的月亮一定比国内圆? 这是一个根深蒂固的问题,只要有人说国外的东西比国内好,就会有人嘲笑崇洋媚外。我觉得我们在某些方面应该向国外学习,比如搜索引擎和版权问题。打开百度搜索 "数据安全",第一行肯定是广告。打开谷歌搜索 "数据安全",第一条就是 "数据安全_百度百科" .....各种版权问题大家都明白,支持正版,但不仅客户一心想找免费破解,就连作者也往往没有保护自己劳动成果或产品的想法。但从另一个层面来说,国内的发展和安全,甩国外几条街。没有说哪里好,哪里不好,辩证地去学习更好。 国外也有别有用心的数据泄露,谈何安全? 从加密解密的角度看,自古以来就没有绝对安全的加密,只有相对安全的做法。苹果的棱镜门、微软的 cpu 漏洞,各种参差不齐的被破解案例 ....是的,这的确是一个很好的论据,但凡事都不能只看一面,当年苹果面对FBI破解手机的要求,几经论证,苹果还是拒绝破解。这点拿到国内,只要上面的文件传达下去,还有企业敢说不吗?还敢说不吗? 关于这次iCloud数据迁移个人看法? 把数据迁移到贵州的云端,相当于把手机的所有数据都存储在贵州的云端服务器上。也许访问数据的速度会快很多,但我会把我的iCloud区放到美国,因为我不想数据存在云上贵州后经常接到莫名其妙的电话或短信,更不想因为乱用国外服务器而被请去喝茶。iCloud一个ID,即从中国账号转到美国区,主要用于数据存在美国服务器上。appStore一个ID,除了注册一个中国ID外,专门用来下载应用用,因为国外ID不支持酷狗和网易云等应用。麻烦的是,用了新的 appStore ID 后,当前的应用还得重新下载安装,因为旧的应用 ID 与新的应用 ID 不兼容,安装不了。最后,iCloud迁移后,国内用户使用美国服务器,估计要 "扶墙 "了。 专业步骤: 首先,进行appleID设置,这是前提条件,否则无法选择转移区域! 取消 appleID 的双重认证 取消家庭共享选项 二、窗口下载并安装 icloud 3.0 版
-
机器视觉在工业中的应用有哪些?