本次修炼方法请往下查看
🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地!
🎇 免费获取相关内容文档关注:微信公众号,发送 pandas 即可获取
🎇 相关内容视频讲解 B站
🎓 博主简介:AI算法驯化师,混迹多个大厂搜索、推荐、广告、数据分析、数据挖掘岗位 个人申请专利40+,熟练掌握机器、深度学习等各类应用算法原理和项目实战经验。
🔧 技术专长: 在机器学习、搜索、广告、推荐、CV、NLP、多模态、数据分析等算法相关领域有丰富的项目实战经验。已累计为求职、科研、学习等需求提供近千次有偿|无偿定制化服务,助力多位小伙伴在学习、求职、工作上少走弯路、提高效率,近一年好评率100% 。
📝 博客风采: 积极分享关于机器学习、深度学习、数据分析、NLP、PyTorch、Python、Linux、工作、项目总结相关的实用内容。
文章目录
- 🎯 1. 基本介绍
- 💡 2. 原理介绍
- 2.1 信息增益
- 2.2 基尼指数
- 2.3 CART树的原理推导
- 🔍 3. 代码实践
- 3.1 sklearn代码实践
- 3.2 高阶用法
- 🔍 4. 注意事项
- 🔍 5. 总结
🎯 1. 基本介绍
决策树(Decision Tree)是一种常用的机器学习算法,可以用于分类和回归问题。它使用树状结构来表示决策规则,并通过一系列条件进行判断和决策。
在训练决策树时,通常采用自顶向下的递归方法,通过选择能够使数据集的纯度提高最大的特征,将数据集分割成更小的子集。纯度是指数据集中同一类别数据的占比或误差的度量,常用的纯度衡量指标有基尼系数、信息熵等。
决策树可以根据数据集的特点进行灵活的分类和回归预测,且易于理解和解释。它具有可解释性强、处理缺失值和离散特征能力强等优点。然而,决策树在处理高维数据和过拟合问题上有一定的限制,因此通常需要结合其他方法进行优化和改进,如随机森林、梯度提升树等。
在scikit-learn(简称sklearn)库中,决策树模型通过DecisionTreeClassifier和DecisionTreeRegressor类实现。
💡 2. 原理介绍
决策树的构建基于以下准则:
2.1 信息增益
用于分类问题,衡量数据集的不确定性减少量。具体的公式如下所示,其中,d为样本集,a为离散属性,v为为类别属性a的种类个数, ∣ d ∣ |d| ∣d∣为所以样本个数, ∣ d v ∣ |d^v| ∣dv∣为a属性中某个类别的样本个数,后面这一项相关于一个权重,相当于类别样本越多权重越大。:
G a i n ( d , a ) = E ( d ) − ∑ v = 1 v ∣ d v ∣ ∣ d ∣ E ( d v ) Gain(d,a)=E(d)-\sum_{v=1}^{v}\frac{|d^v|}{|d|}E(d^v) Gain(d,a)=E(d)−v=1∑v∣d∣∣dv∣E(dv)
其中E(d)为信息熵用来描述事物的混乱情况,熵越大越混乱,具体的数学表达如下,其中d为样本集合,k为样本中的类别, p k p_k pk为第k类样本说占的比例。:
E ( d ) = − ∑ k = 1 ∣ y ∣ p k l o g 2 p k E(d) = -\sum_{k=1}^{|y|}p_klog_2p_k E(d)=−k=1∑∣y∣pklog2pk
缺点: 1. 这个评价标准有一个不好的地方在于,对于某个类别,如果划分的种类越多,那么该类别的重要性就越高,这很明显不错,比如给每个样本进行一个标号,那么这个特征肯定重要性会很高,但是这样训练处理的模型泛化能力不佳。2. 该指标是全局的特征选择,不能具体寻找出这个属性在具体哪个值最优。3.而且只能处理离散值,不能处理连续值(如非要处理:可以通过对连续值进行大小排序取中位数,其实就是一种离散化的处理方法)
优点: 1.计算了所有样例的统计信息,对噪声不敏感。2.简单容易计算
2.2 基尼指数
和信息增益一样同样是用来评价划分后的效果的一种指标,基尼指数也是一种评估分裂效果的指标,该指标可以选出哪个特征并且哪个值是最优的,具体的数学表达如下所示:
G i n i ( d ) = 1 − ∑ k = 1 ∣ y ∣ p k 2 Gini(d)=1-\sum_{k=1}^{|y|}p_k^2 Gini(d)=1−k=1∑∣y∣pk2
G i n i ( d , a ) = ∑ v = 1 v ∣ d v ∣ d G i n i ( d v ) Gini(d,a)=\sum_{v=1}^{v}\frac{|d^v|}{d}Gini(d^v) Gini(d,a)=v=1∑vd∣dv∣Gini(dv)
其中,d为样本集,a为离散属性,v为为类别属性a的种类个数,为所以样本个数,为a属性中某个类别的样本个数。
2.3 CART树的原理推导
- 分类树(每颗子树都是二叉树):
- 设置结点的训练数据集d, 计算所以特征对数据集d的基尼指数,并对每一个特征A,对其可能取的每一个值a,根据A是否等于a,将数据集d划分为 d 1 d_1 d1(等于a)和 d 2 d_2 d2(不等于a)两部分,利用上式的公式计算A=a时的基尼指数。
- 在所以可能的特征以及其每个值中,选择基尼指数最小的特征及其对应的最优特征与最优切分点,从该节点生成两个子节点,并将数据集d依据特征分配到两个子节点中去。
- 对生成的两个子节点重复调用1,2,直到满足停止条件
- 输出决策树(CART)
- 回归树: 其原理和分类树基本一致,只是每次进行树划分时选择的评价指标不一致,分类树是根据基尼指数来进行最优特征最优值,而回归树采样均方差最小来选择最优特征和最优值,因此,下面就介绍回归树的最优值选择方法:
e r r d = ∑ i = 1 ∣ d ∣ ( y i − y ‾ ) 2 err_d=\sum_{i=1}^{|d|}(y_i-\overline{y})^2 errd=∑i=1∣d∣(yi−y)2
e r r a l l = e r r ( d 1 ) + e r r ( d 2 ) err_{all} = err(d_1) + err(d2) errall=err(d1)+err(d2)
- 其中, e r r d err_d errd为数据集d的均方差, y ‾ \overline{y} y是数据集d的均值,因此,回归树就是遍历所以的特征以及该特征下的每个值,以此值将数据划分为 d 1 d_1 d1和 d 2 d_2 d2,然后再计算该划分下的误差和 e r r a l l err_{all} errall,选择误差和最小的最优特征最优值,然后接着重复分类树的节点分裂方法。
🔍 3. 代码实践
3.1 sklearn代码实践
下面通过读取sklearn中自带的分类数据集来实践决策树的处理过程,具体的代码如下所示:
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, y = iris.data, iris.target# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 创建决策树分类器实例
tree_clf = DecisionTreeClassifier()# 训练模型
tree_clf.fit(X_train, y_train)# 在测试集上进行预测
y_pred = tree_clf.predict(X_test)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"准确率: {accuracy:.2f}")
3.2 高阶用法
DecisionTreeClassifier是scikit-learn中用于分类任务的决策树模型。下面是一些常用的参数介绍:
criterion:
选择划分特征的衡量指标。可选的值包括"gini"和"entropy",默认为"gini"。基尼系数(gini)和信息熵(entropy)都是用来衡量划分的纯度,选择哪个衡量指标取决于具体问题。max_depth:
决策树的最大深度。用于控制决策树的复杂度和防止过拟合。默认为None,表示不限制决策树的深度。min_samples_split:
拆分内部节点所需的最小样本数。如果某个内部节点的样本数小于该值,则不会再划分。默认为2。min_samples_leaf:
叶节点所需的最小样本数。如果某个叶节点的样本数小于该值,则该叶节点会被剪枝,合并到其他叶节点上。默认为1。max_features:
寻找最佳划分特征时要考虑的特征数量。可以是整数(表示考虑的特征数量)或浮点数(表示考虑特征比例)。默认为"auto",表示考虑所有特征。random_state:
随机种子。用于控制每次训练结果的随机性。默认为None。
🔍 4. 注意事项
- 决策树容易过拟合,特别是当树很深时。可以通过设置max_depth参数来限制树的最大深度。
- 特征选择和剪枝技术可以用来提高模型的泛化能力。
- 决策树对数据中的小变化非常敏感,因此对噪声和异常值敏感。
🔍 5. 总结
决策树是一种强大的模型,能够捕捉数据中的非线性关系。scikit-learn提供了易于使用的决策树实现,适用于分类和回归任务。通过本博客的代码示例,我们学习了如何创建决策树模型,进行训练、预测和评估。希望这篇博客能够帮助你更好地理解决策树模型,并将其应用于实际的机器学习问题中。