机器学习 - 决策树

1. 决策树基础

定义与概念

决策树是一种监督学习算法,主要用于分类和回归任务。它通过学习从数据特征到输出标签的映射规则,构建一个树形结构。在分类问题中,决策树的每个叶节点代表一个类别。

案例分析

假设我们有一个关于天气和是否进行户外活动的数据集,其中特征包括“温度”、“风速”和“天气类型”,目标变量是“是否进行户外活动”。决策树将从这些特征中学习规则,以预测任何给定天气条件下的活动决定。

公式推导

最简单的决策树使用信息增益来选择每个节点的分裂特征。信息增益计算如下:

I G ( T , a ) = H ( T ) − ∑ v ∈ V a l u e s ( a ) ∣ T v ∣ ∣ T ∣ H ( T v ) IG(T, a) = H(T) - \sum_{v \in Values(a)} \frac{|T_v|}{|T|} H(T_v) IG(T,a)=H(T)vValues(a)TTvH(Tv)

常见问题及解决方案
  1. 问题:如何处理连续特征?

    • 解决方案:将连续特征通过阈值划分为两个子集,选择最优阈值使信息增益最大化。
  2. 问题:决策树容易过拟合吗?

    • 解决方案:是的,可以通过设置树的最大深度或使用剪枝技术来防止过拟合。
  3. 问题:如果数据集中有缺失值怎么办?

    • 解决方案:可以用数据集中同一特征的非缺失值的平均值或众数替代缺失值。
  4. 问题:决策树在何种情况下表现不好?

    • 解决方案:在特征间复杂的相互作用或分类边界非线性时,单一决策树效果不佳,此时可考虑使用随机森林等集成方法。
  5. 问题:如何选择最佳的分裂特征?

    • 解决方案:通过计算每个特征的信息增益或基尼不纯度,并选择增益最大或不纯度降低最多的特征。

2. 关键概念

属性选择度量

在决策树构造中,选择正确的属性对于分裂每个节点至关重要。以下是几种常见的属性选择度量方法:

  1. 信息增益:如之前所述,信息增益衡量在给定属性的条件下,数据不确定性的减少。
  2. 增益比率:解决信息增益偏好选择取值较多的属性的问题,通过标准化信息增益来减少这种偏差。
  3. 基尼指数:常用于CART(分类与回归树)算法中,测量一个随机选择的样本被错误标记的概率。
案例分析:基尼指数

考虑一个数据集,我们需要根据“年龄”、“收入”和“学历”预测一个人是否会购买豪车。使用基尼指数,我们可以决定哪个特征在根节点分裂时使用。

计算方法如下:

G i n i ( T ) = 1 − ∑ i = 1 k p i 2 Gini(T) = 1 - \sum_{i=1}^k p_i^2 Gini(T)=1i=1kpi2

其中 pi 是第 i 类的比例。

假设我们有100个样本,60个样本不买豪车,40个买豪车,则:

G i n i ( T ) = 1 − ( ( 0.6 ) 2 + ( 0.4 ) 2 ) = 0.48 Gini(T) = 1 - ((0.6)^2 + (0.4)^2) = 0.48 Gini(T)=1((0.6)2+(0.4)2)=0.48

树的构造

构造决策树时,我们从根节点开始,使用所选的属性选择度量来递归地分裂每个节点,直到满足某些停止条件,如节点达到最小样本数、达到最大深度或纯度达到一定水平。

常见问题及解决方案
  1. 问题:如何处理非数值特征?

    • 解决方案:将类别型特征进行独热编码或使用基于标签的编码方法。
  2. 问题:节点最优分裂点如何确定?

    • 解决方案:对于每个属性,尝试所有可能的分裂点,选择使信息增益、增益比率或基尼指数最优的分裂点。
  3. 问题:如何处理训练数据中的噪声?

    • 解决方案:使用预剪枝或后剪枝减少噪声带来的影响,或者使用交叉验证来确定最佳的剪枝策略。
  4. 问题:决策树构造算法运行时间过长怎么办?

    • 解决方案:可以通过限制树的最大深度或节点最小样本数来减少构造时间,或使用更高效的数据结构如KD树。
  5. 问题:如果一个属性在训练集中重要但在验证集中无效怎么办?

    • 解决方案:进行特征选择和特征重要性评估,以避免过度依赖训练数据中的特定特征。

3. 决策树算法

ID3算法

定义与概念
ID3(Iterative Dichotomiser 3)算法是最早的决策树算法之一,主要用于处理分类问题。它使用信息增益作为属性选择的度量标准,从而选择最能提供最大信息增益的属性来进行节点的分裂。

案例应用
考虑一个邮件系统需要根据邮件内容判断是否为垃圾邮件。特征可能包括关键词的出现频率、发件人信誉等。ID3算法会选择最能区分垃圾邮件和非垃圾邮件的特征来分裂节点。

公式推导
信息增益的计算已在前文中详细介绍。

C4.5算法

定义与概念
C4.5算法是ID3算法的改进版本,能够处理连续属性和具有缺失值的数据。此外,C4.5使用增益比率来选择属性,减少了对多值属性的偏见。

案例应用
在一个在线零售数据集中,我们可能需要根据客户的年龄、购买历史和页面浏览行为来预测他们是否会购买某个产品。C4.5算法能够有效地处理这些连续和离散的数据特征。

公式推导
G a i n R a t i o ( S , A ) = I n f o r m a t i o n G a i n ( S , A ) S p l i t I n f o r m a t i o n ( S , A ) GainRatio(S, A) = \frac{InformationGain(S, A)}{SplitInformation(S, A)} GainRatio(S,A)=SplitInformation(S,A)InformationGain(S,A)
其中:
S p l i t I n f o r m a t i o n ( S , A ) = − ∑ i = 1 n ( ∣ S i ∣ ∣ S ∣ ) log ⁡ 2 ( ∣ S i ∣ ∣ S ∣ ) SplitInformation(S, A) = -\sum_{i=1}^n \left(\frac{|S_i|}{|S|}\right) \log_2 \left(\frac{|S_i|}{|S|}\right) SplitInformation(S,A)=i=1n(SSi)log2(SSi)

CART算法

定义与概念
CART(Classification and Regression Trees)算法既可以用于分类问题也可以用于回归问题。这种算法使用基尼指数作为分类问题的度量,而对于回归问题,则使用最小二乘偏差。

案例应用
在房价预测模型中,CART算法可以通过房屋的年龄、面积、地理位置等连续特征来预测房屋价格。

公式推导
基尼指数计算已在前文介绍。对于回归问题,最小二乘偏差定义为:
L ( T ) = ∑ i ∈ T ( y i − y ^ T ) 2 L(T) = \sum_{i \in T} (y_i - \hat{y}_T)^2 L(T)=iT(yiy^T)2
其中 y ^ T \hat{y}_T y^T 是节点 T 中所有样本 y 值的平均数。

常见问题及解决方案
  1. 问题:如何在ID3算法中处理连续特征?

    • 解决方案:通过定义阈值将连续特征离散化,然后按照离散特征处理。
  2. 问题:C4.5算法在处理非常大的数据集时性能如何?

    • 解决方案:由于计算增益比率较为复杂,对于非常大的数据集,C4.5的性能可能不如预期。可以考虑使用算法优化或者硬件加速。
  3. 问题:CART算法在分类问题中如何选择最佳分裂点?

    • 解决方案:通过计算每个可能分裂点的基尼指数,选择基尼指数最低的点作为分裂点。
  4. 问题:如何处理决策树中的过拟合问题?

    • 解决方案:通过剪枝技术,限制树的深度或者设置节点的最小样本大小等方法来控制树的复杂度。
  5. 问题:如果数据集中存在大量缺失值,决策树的性能如何?

    • 解决方案:可以使用多种策略处理缺失值,如使用最常见的值填充,或者利用可用特征的信息推断缺失值。 C4.5算法原生支持处理缺失值。

4. 剪枝技术

定义与概念

剪枝是决策树学习算法中的一种技术,用于减少树的大小,从而控制模型的复杂度和过拟合现象。剪枝可以分为两种主要类型:预剪枝(Pre-pruning)和后剪枝(Post-pruning)。

预剪枝

定义:预剪枝是在决策树完全生成之前停止树的生长。这通常通过设置停止条件来实现,如达到最大深度、节点中的最小样本数或信息增益的最小阈值。

案例应用
假设在一个贷款申请的决策树模型中,我们可以设置最大深度为5,以防止模型变得过于复杂并过拟合训练数据。

后剪枝

定义:后剪枝是在决策树构造完成后进行的。这种方法通常涉及使用验证数据集来评估是否剪去某些子树,从而改善模型在未见数据上的表现。

案例应用
在同一个贷款申请模型中,我们可能会允许树完全生长,然后用一个独立的验证集来测试每一个子树的性能。如果剪除某个子树能够提高验证集上的准确率,则进行剪枝。

公式推导

对于后剪枝,其中一种常用方法是成本复杂度剪枝,其公式可以表示为:
R α ( T ) = R ( T ) + α × ∣ l e a v e s ∣ R_\alpha(T) = R(T) + \alpha \times |leaves| Rα(T)=R(T)+α×leaves
其中 R(T) 是树 T 在训练数据上的误差, |leaves| 是树的叶节点数量,α 是复杂度参数。

常见问题及解决方案
  1. 问题:预剪枝和后剪枝哪个更好?

    • 解决方案:预剪枝可以更快地构建模型,但可能因为过于保守而错过重要的模式;后剪枝通常更能提高模型的泛化能力,但计算成本更高。
  2. 问题:如何选择合适的 α 值进行成本复杂度剪枝?

    • 解决方案:通过交叉验证来选取最佳的α 值,从而在模型简单性和准确性之间找到最佳平衡。
  3. 问题:如果剪枝过度会怎样?

    • 解决方案:过度剪枝可能导致模型过于简单,不能捕捉数据中的重要模式。需要通过调整剪枝参数或减少剪枝程度来解决。
  4. 问题:预剪枝有哪些具体的停止条件?

    • 解决方案:具体的停止条件包括但不限于达到最大树深、节点最小样本数、信息增益低于某个阈值等。
  5. 问题:后剪枝的流程是怎样的?

    • 解决方案:后剪枝通常包括完全生成决策树,然后逐步测试每个节点(从叶节点开始)是否应该替换为更简单的决策过程或其父节点,通常借助独立的验证集来评估性能。

5. 决策树的应用

实际案例分析

决策树因其模型的解释性强,被广泛应用于各种行业和场景中。以下是几个示例:

  1. 医疗诊断

    • 场景:使用病人的历史医疗记录来预测某种疾病的发生。
    • 数据:特征包括年龄、性别、体重、血压等。
    • 应用:构建决策树来识别高风险病人,并进行早期干预。
  2. 客户分类

    • 场景:电商平台根据用户的购物行为和个人喜好进行市场细分。
    • 数据:特征包括购买频率、平均消费金额、浏览历史等。
    • 应用:决策树帮助确定哪些客户对特定产品类别感兴趣,以定向推送广告。
  3. 信用评分

    • 场景:金融机构需要评估贷款申请者的信用风险。
    • 数据:特征包括信用历史、还款能力、已有负债等。
    • 应用:通过决策树分析,银行可以决定是否批准贷款以及贷款条件。
特征重要性评估

在构建决策树模型时,了解哪些特征对预测结果影响最大是至关重要的。特征重要性评估可以帮助我们优化模型和理解数据背后的因果关系。

方法

  • 基于模型的特征重要性:大多数决策树算法(如CART和随机森林)都提供了一种计算特征重要性的内建方法。这通常基于每个特征在分裂节点时的效用(如基尼减少或信息增益)来评分。

案例应用
在信用评分模型中,特征如“年收入”和“现有负债”可能显示为最重要的预测因素。通过分析这些特征的重要性,银行可以更准确地识别潜在的风险客户。

常见问题及解决方案
  1. 问题:决策树在哪些情况下可能不是最佳选择?

    • 解决方案:对于具有复杂关系和大量非线性特征的数据集,单一决策树可能表现不佳。此时,可以考虑使用集成方法如随机森林或梯度提升树。
  2. 问题:如何处理大数据集上的决策树训练?

    • 解决方案:可使用分布式计算框架如Apache Spark中的MLlib来处理大规模数据集上的决策树训练。
  3. 问题:如何解决决策树对于数据中小的变化过于敏感的问题?

    • 解决方案:通过集成学习方法,如随机森林,可以降低模型对数据中小波动的敏感性。
  4. 问题:决策树如何应对非平衡数据集?

    • 解决方案:通过调整类权重或对少数类进行过采样处理,以平衡各类的影响力。
  5. 问题:如何提高决策树的预测准确性?

    • 解决方案:除了使用剪枝和特征选择技术,还可以通过调整模型参数如最大深度和最小分裂样本数来优化模型性能。

6. 集成方法

定义与概念

集成学习是一种强大的机器学习范式,它通过结合多个模型来提高预测性能,通常能够比任何一个单独的模型表现得更好。在决策树的上下文中,常见的集成方法包括随机森林和梯度提升树。

随机森林

定义:随机森林是由多个决策树组成的集成模型,每棵树都在数据集的一个随机子集上训练得到,用于增加模型的多样性。

案例应用
在一个银行欺诈检测系统中,随机森林模型可以通过整合数百棵树的预测结果来提高识别欺诈行为的准确率。

梯度提升树

定义:梯度提升是一种提升技术,通过迭代地添加新模型来纠正前一轮模型的错误,通常使用决策树作为基学习器。

案例应用
在房价预测模型中,梯度提升树可以逐步学习并改进预测,处理各种复杂的非线性关系,以更精确地预测各种因素影响下的房价。

比较决策树与其他模型
与支持向量机(SVM)
  • 优点:决策树易于理解和解释,适合处理带有明确决策边界的问题。
  • 缺点:SVM通常在高维空间和复杂决策边界的情况下表现更好,因为它侧重于最大化类之间的边界。
与神经网络
  • 优点:决策树不需要很多参数调整即可开始训练,而神经网络通常需要复杂的配置和更长的训练时间。
  • 缺点:神经网络在处理大规模数据集和捕捉数据中复杂模式方面更有优势,尤其是在图像和语音识别等领域。
工具与库
  1. Scikit-learn:Python的一个主要机器学习库,提供了决策树和集成算法的实现,包括随机森林和梯度提升树。
  2. XGBoost:优化的分布式梯度提升库,非常适合在大规模数据集上进行高效的模型训练。
  3. Graphviz:用于决策树可视化的工具,可以帮助分析和解释模型的决策路径。

7.案例 - 鸢尾花分类

当然,这里我将给出一个使用Python中的scikit-learn库构建决策树分类器的详细案例。我们将使用经典的鸢尾花数据集(Iris dataset)来演示如何构建和评估一个决策树模型。

数据集

鸢尾花数据集包含150个样本,每个样本有4个特征(花萼长度、花萼宽度、花瓣长度和花瓣宽度)和3种不同类别的鸢尾花(Setosa, Versicolour, 和 Virginica)。

步骤
  1. 导入所需的库和数据集。
  2. 数据预处理。
  3. 分割数据集为训练集和测试集。
  4. 创建决策树模型。
  5. 训练模型。
  6. 预测测试数据。
  7. 评估模型性能。
  8. 可视化决策树。
代码实现
# 1. 导入库
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier, export_text, plot_tree
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report
import matplotlib.pyplot as plt# 2. 加载数据
iris = load_iris()
X = iris.data
y = iris.target# 3. 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 4. 创建决策树模型
tree_classifier = DecisionTreeClassifier(max_depth=3, random_state=42)# 5. 训练模型
tree_classifier.fit(X_train, y_train)# 6. 预测测试数据
y_pred = tree_classifier.predict(X_test)# 7. 评估模型
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)
print("Classification Report:")
print(classification_report(y_test, y_pred))# 8. 可视化决策树
plt.figure(figsize=(12,8))
plot_tree(tree_classifier, filled=True, feature_names=iris.feature_names, class_names=iris.target_names)
plt.show()
说明
  • 这段代码首先导入了必要的库,包括数据集加载、决策树构建、数据分割、模型评估和可视化所需的库。
  • 使用train_test_split函数将数据分为70%的训练集和30%的测试集。
  • 使用DecisionTreeClassifier创建一个决策树模型,设置max_depth=3来限制树的深度,以避免过拟合。
  • 使用训练集训练模型,并在测试集上进行预测。
  • 评估模型性能,输出准确率和分类报告。
  • 使用plot_tree函数可视化决策树,帮助理解模型是如何做出决策的。

更多问题咨询

Cos机器人

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/10962.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

并发-守护线程setDaemon()

目录 为什么存在 什么是守护线程 创建守护线程 在使用守护线程时需要注意以下几点 可以使用isDaemon()方法来检查线程是否是守护线程 例1:上面提到当JVM中只剩下守护线程的时候,JVM就会退出,那么写段代码测试下 例2:thread…

小红的字符串构造和小红的排列构造

小红的字符串构造 小红希望你构造一个长度为nnn的、仅包含小写字母的字符串,其中恰好有kkk个长度大于1的回文子串。你能帮帮她吗?输入两个整数n,k,用空格隔开。 1≤n≤10^5,0≤k≤n/2.一个字符串。如果有多解输出任意即可。 可以证明&#x…

[Bug]:由于中国防火墙,无法连接 huggingface.co

问题描述 : OSError: We couldnt connect to https://huggingface.co to load this file, couldnt find it in the cached files and it looks like youscan/ukr-roberta-base is not the path to a directory containing a file named config. Json. Checkout your internet …

[AIGC] 几道 redis数据结构相关面试题

文章目录 7. 数据类型的实现8. 什么是空间预分配以及惰性空间释放,SDS 是怎么实现的9. 为什么说 SDS 是二进制安全的呢10. 说说 redis 里的对象11. 使用 RedisObject 的好处12. RedisObject 的具体结构是什么 7. 数据类型的实现 8. 什么是空间预分配以及惰性空间释放…

练习题(2024/5/12)

1二分查找 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 示例 1: 输入: nums [-1,0,3,5,9,12], target 9 输出: 4…

如何远程访问?

远程访问是指在不同的地理位置之间通过网络连接来实现对目标设备或系统的访问。无论是在个人生活还是商业领域,远程访问都起到了重要的作用,帮助人们实现高效的工作和便捷的生活。本文将介绍一款名为【天联】的组网产品,它是一款强大的异地组…

Linux与Windows互传文件【笔记】

Linux与Windows互传文件【笔记】 前言前言推荐Linux与Windows互传文件首先确保Windows安装ssh如何传送文件问题 最后 前言 这是陈旧已久的草稿2023-05-10 00:01:24 这个是准备把计组课程华为智能计组的,传输文件。 最后发现,好像没有实现了。 现在202…

汽车线控转向系统介绍

汽车线控转向系统由方向盘总成、转向执行总成和主控制器(ECU)三个主要部分以及自动防故障系统、电源等辅助系统组成。 线控转向系统(Steering-By-Wire),取消了方向盘和转向车轮之间的机械连接部件,彻底摆脱了机械固件的限制,完全由电能来实现…

什么是数据平台——企业构建Data+AI的基础数据底座需要的决策参考

什么是数据平台 标准的解释是这样的 Wikipedia A data platform usually refers to a software platform used for collecting and managing data, and acting as a data delivery point for application and reporting software. 数据平台是指将各类数据进行整合、存储、处…

你知道C++多少——默认成员函数

🌈个人主页:小新_- 🎈个人座右铭:“成功者不是从不失败的人,而是从不放弃的人!”🎈 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝 🏆所属专栏&#xff1…

Python vs MATLAB:选择深度学习的首选编程语言

Python vs MATLAB:选择深度学习的首选编程语言 在深度学习领域,编程语言的选择对于初学者的学习路径和未来的职业发展至关重要。目前,Python和MATLAB都是进行科学计算和数据分析的流行工具,但它们在深度学习社区中的应用和受欢迎…

ipa 分区算法分析,图解

参考 Room Segmentation: Survey, Implementation, and Analysis. 分区算法调查,实现以及评估对比 相关论文 分区算法 New Brooms Sweep Clean - An Autonomous Robotic Cleaning Assistant for Professional Office Cleaning 形态分割 Interactive SLAM using …

NOR FLASH介绍

参考 http://t.csdnimg.cn/gHcrG 一、NOR FLASH简介 XIP技术:https://blog.csdn.net/ffdia/article/details/87437872?fromshareblogdetail NOR Flash 和 NAND Flash 的特点和应用举例: NOR Flash: 特点: 支持随机访问,可以直接…

QT作业4

1、思维导图 2、使用定时器完成闹钟 头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QLineEdit> #include <QLabel> #include <QPushButton> #include <QTextEdit> #include <QDebug> #include <…

Py深度学习基础|关于Batch Normalization

1. 为什么需要Batch Normalization 通常我们会在输入层进行数据的标准化处理&#xff0c;这是为了让模型学习到更好的特征。同样&#xff0c;在模型的中间层我们也可以进行normalize。在神经网络中, 数据分布对训练会产生影响。 比如我们使用tanh作为激活函数&#xff0c;当输入…

Baidu Comate智能编码助手:AI编程时代提升效率的好帮手

目录 写在前面一、如何安装二、如何使用场景需求体验步骤 三、AI 编程实战指令功能插件功能知识库功能 四、问题建议五、体验总结&#x1f680;写在最后 写在前面 Baidu Comate 是基于文心大模型的 AI编程工具&#xff0c;它结合百度积累多年的编程现场大数据和外部优秀开源数据…

在xAnyLabeling中加载自己训练的yolov8s-obb模型进行半自动化标注

任务思路&#xff1a; 先使用xAnyLabeling标注一部分样本&#xff0c;训练出v1版本的yolov8-obb模型&#xff0c;然后加载yolov8-obb模型到xAnyLabeling中对其余样本进行半自动化标注。节省工作量。 任务流程&#xff1a; 1.准备xAnyLabeling标注工具 下载代码&#xff0c;…

Redis系列-3 Redis缓存问题

1.缓存的作用 数据库(如Mysql)的持久化特点带来了较低的性能&#xff0c;高并发的场景下&#xff0c;连接池很快被耗尽而出现宕机或DOS&#xff0c;无法继续对外提供服务。相对于数据库的硬盘IO&#xff0c;缓存中间件基于内存进行读写&#xff0c;从而具备较大的吞吐量和高并…

数据结构(四)——二叉树和堆(下)

制作不易&#xff0c;三连支持一下呗&#xff01;&#xff01;&#xff01; 文章目录 前言一、二叉树链式结构的实现总结 前言 这篇博客我们将来了解普通二叉树的实现和应用&#xff0c;对大家之前分治和递归的理解有所挑战。 一、二叉树链式结构的实现 1.前置说明 在学习二叉…

Java入门——继承和多态(上)

包 包是组织类的一种方式. 使用包的主要目的是保证类的唯一性. 例如, 你在代码中写了一个 Test 类. 然后你的舍友也可能写一个 Test 类. 如果出现两个同名的类, 就会冲突, 导致 代码不能编译通过. 导入包中的类 Java 中已经提供了很多现成的类供我们使用. 例如 public cla…