当前位置: 首页 > news >正文

机器学习④【算法详解:从决策树到随机森林】

文章目录

  • 先言
  • 一、决策树(Decision Tree)
    • 1.基本概念:树形结构,基于特征进行数据节点划分。
      • 1.1树形结构
      • 1.2特征节点划分原理
    • 2.核心算法:ID3、CART(分类与回归树)
      • 2.1基于信息增益决策树的建立ID3(Iterative Dichotomiser 3)
      • 2.2基于基尼指数决策树的建立(CART)
    • 3.使用Python的scikit-learn实现决策树对红酒数据进行预测。
  • 二、集成学习(Ensemble Learning)
    • 1.核心机制:Bagging(自助采样)和随机特征选择。
    • 2.随机森林:集成多个决策树,通过投票或平均提高泛化能力。
  • 结语


先言

在人工智能和机器学习领域,选择合适的算法对模型的性能至关重要。今天,我们将深入探讨两种强大且广泛应用的算法——决策树(Decision Tree)和随机森林(Random Forest)。

决策树以其直观的可解释性和简单的逻辑深受欢迎,而随机森林则通过集成学习(Ensemble Learning)进一步提升预测能力,成为许多数据科学竞赛中的“常胜将军”。本文将详细介绍它们的原理、优缺点、应用场景,并通过实例帮助大家理解其工作机制。

无论你是机器学习初学者,还是希望巩固知识的从业者,这篇文章都将为你提供清晰的指导!


一、决策树(Decision Tree)

决策树(Decision Tree)是一种常用的机器学习算法,广泛应用于分类和回归问题。

决策树通过树状结构来表示决策过程,每个内部节点代表一个特征或属性的测试,每个分支代表测试的结果,每个叶节点代表一个类别或值。

1.基本概念:树形结构,基于特征进行数据节点划分。

1.1树形结构

  • 节点(Node):树中的每个点称为节点。根节点是树的起点,内部节点是决策点,叶节点是最终的决策结果。
  • 分支(Branch):从一个节点到另一个节点的路径称为分支。
  • 分裂(Split):根据某个特征将数据集分成多个子集的过程。
  • 纯度(Purity):衡量一个子集中样本的类别是否一致。纯度越高,说明子集中的样本越相似。

1.2特征节点划分原理

决策树通过递归地将数据集分割成更小的子集来构建树结构。具体步骤如下:

  • 选择最佳特征:根据某种标准(如信息增益、基尼指数等)选择最佳特征进行分割。
  • 分割数据节点:根据选定的特征将数据集分成多个子集。
  • 递归构建子树:对每个子集重复上述过程,直到满足停止条件(如所有样本属于同一类别、达到最大深度等)。
  • 生成叶节点:当满足停止条件时,生成叶节点并赋予类别或值。

2.核心算法:ID3、CART(分类与回归树)

在决策树算法中,ID3 和 CART 是两种经典的构建方法,它们在核心思想、适用场景和优化目标上有所不同。

2.1基于信息增益决策树的建立ID3(Iterative Dichotomiser 3)

信息增益决策树倾向于选择取值较多的属性,在有些情况下这类属性可能不会提供太多有价值的信息,算法只能对描述属性为离散型属性的数据集构造决策树。
基本概念
提出者:Ross Quinlan(1986年)

用途:分类任务(不支持回归)

核心思想:通过信息增益(Information Gain)选择最优特征进行节点分裂,递归构建树。

关键公式
在这里插入图片描述
特点

  • 优点:直观易理解,适合离散特征
  • 缺点:只能处理分类问题,无法直接用于回归,对取值多的特征有偏好(信息增益倾向于选择取值多的特征),无剪枝策略,容易过拟合
    计算示例:
    根据以下信息构建一棵预测是否贷款的决策树。我们可以看到有4个影响因素:职业,年龄,收入和学历。
职业年龄收入学历是否贷款
1工人365500高中
2工人422800初中
3白领453300小学
4白领2510000本科
5白领328000硕士
6白领2813000博士

计算步骤:
第一步,计算根节点的信息熵

上表根据是否贷款把样本分成2类样本,"是"占4/6=2/3, "否"占2/6=1/3,

所以在这里插入图片描述
第二步,计算属性的信息增益

<1> “职业"属性的信息增益在这里插入图片描述
在职业中,工人占1/3, 工人中,是否代款各占1/2, 所以有在这里插入图片描述
在职业中,白领占2/3, 白领中,是贷款占3/4, 不贷款占1/4, 所以有在这里插入图片描述
所以有 在这里插入图片描述
最后得到职业属性的信息增益为:在这里插入图片描述
<2>” 年龄"属性的信息增益(以35岁为界)

在这里插入图片描述

<3> "收入"属性的信息增益(以10000为界,大于等于10000为一类)

在这里插入图片描述

<4> "学历"属性的信息增益(以高中为界, 大于等于高中的为一类)
在这里插入图片描述
第三步, 划分属性

对比属性信息增益发现,"收入"和"学历"相等,并且是最高的,所以我们就可以选择"学历"或"收入"作为第一个

决策树的节点, 接下来我们继续重复1,2的做法继续寻找合适的属性节点

在这里插入图片描述

2.2基于基尼指数决策树的建立(CART)

基尼指数(Gini Index)是决策树算法中用于评估数据集纯度的一种度量,基尼指数衡量的是数据集的不纯度,或者说分类的不确定性。在构建决策树时,基尼指数被用来决定如何对数据集进行最优划分,以减少不纯度。
基本概念
提出者:Breiman等(1984年)

用途:分类和回归(支持两者)

核心思想:分类任务:使用基尼系数(Gini Index)选择特征;回归任务:使用均方误差(MSE)选择分裂点。

关键公式
在这里插入图片描述
Gini指数的计算和上述信息增益相似我们直接进入案例

3.使用Python的scikit-learn实现决策树对红酒数据进行预测。

示例代码:

from sklearn.tree import DecisionTreeClassifier,export_graphviz
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import  StandardScaler
# 创建数据集
wine = load_wine()
x = wine.data
y = wine.target
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
#创建决策数模型对象
# criterion="entropy"表示使用信息熵作为划分标准(默认gini:gini系数划分标准)
model = DecisionTreeClassifier(criterion="gini",max_depth=None)
#对数据集新型标准化
transfer = StandardScaler()
x_train = transfer.transform(x_train)
X_test = transfer.transform(x_test)
#训练模型
model.fit(x_train,y_train)
#保存模型
# joblib.dump(model,"../src/model/DecisionTree.pkl")
#模型预测
y_predict = model.predict(X_test)
print("预测结果为:",y_predict)
#f返回预测准确率
score = model.score(X_test,y_test)
print("预测准确率:",score)
#可视化决策树模型
export_graphviz(model,out_file="../src/graph/DecisionTree.dot",feature_names=wine.feature_names)

二、集成学习(Ensemble Learning)

机器学习中有一种大类叫集成学习(Ensemble Learning),集成学习的基本思想就是将多个分类器组合,从而实现一个预测效果更好的集成分类器。集成算法可以说从一方面验证了中国的一句老话:三个臭皮匠,赛过诸葛亮。集成算法大致可以分为:Bagging,Boosting 和 Stacking 三大类型。

(1)每次有放回地从训练集中取出 n 个训练样本,组成新的训练集;

(2)利用新的训练集,训练得到M个子模型;

(3)对于分类问题,采用投票的方法,得票最多子模型的分类类别为最终的类别;

1.核心机制:Bagging(自助采样)和随机特征选择。

Bagging(Bootstrap Aggregating)是一种集成学习(Ensemble Learning)方法,通过组合多个弱学习器的预测结果来提升模型的稳定性和泛化能力。其核心思想是:通过自助采样(Bootstrap Sampling)生成多个子数据集,并行训练多个基学习器,最终通过投票(分类)或平均(回归)得到最终预测。
Bagging 的核心步骤:

在这里插入图片描述

2.随机森林:集成多个决策树,通过投票或平均提高泛化能力。

随机森林就属于集成学习,是通过构建一个包含多个决策树(通常称为基学习器或弱学习器)的森林,每棵树都在不同的数据子集和特征子集上进行训练,最终通过投票或平均预测结果来产生更准确和稳健的预测。这种方法不仅提高了预测精度,也降低了过拟合风险,并且能够处理高维度大规模数据集
随机森林是 Bagging 的扩展,在决策树的基础上增加了特征随机性:

  • 随机: 特征随机,训练集随机
    • 样本:对于一个总体训练集T,T中共有N个样本,每次有放回地随机选择n个样本。用这n个样本来训练一个决策树。
    • 特征:假设训练集的特征个数为d,每次仅选择k(k<d)个来构建决策树。
  • 森林: 多个决策树分类器构成的分类器, 因为随机,所以可以生成多个决策树

在这里插入图片描述

class sklearn.ensemble.RandomForestClassifier

参数:
n_estimators int, default=100
森林中树木的数量。(决策树个数)

criterion {“gini”, “entropy”}, default=”gini” 决策树属性划分算法选择
当criterion取值为“gini”时采用 基尼不纯度(Gini impurity)算法构造决策树,
当criterion取值为 “entropy” 时采用信息增益( information gain)算法构造决策树.

max_depth int, default=None 树的最大深度。
示例代码:

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
import joblib
transfer = joblib.load("../src/model/transfer.pkl")
wine = load_wine()
X_train,X_test,y_train,y_test = train_test_split(wine.data,wine.target,test_size=0.2,random_state=42)
#创建随机森林模型n_estimators参数指定创建100棵树
model_forest = RandomForestClassifier(n_estimators=100,criterion="gini",max_depth=None)
#对数据进行标准化
X_train = transfer.transform(X_train)
X_test = transfer.transform(X_test)
#使用模型进行训练
model_forest.fit(X_train,y_train)
#预测
y_predict = model_forest.predict(X_test)
print("预测结果为:",y_predict,"实际结果为:",y_test)
#预测准确度
score = model_forest.score(X_test,y_test)
print("准确度为:",score)

结语

决策树和随机森林是机器学习中不可或缺的工具,理解它们的原理和应用能帮助我们在实际项目中做出更优的模型选择。接下来的内容将深入技术细节,并附上代码示例,敬请期待!

🔍 你对决策树或随机森林有什么疑问?欢迎在评论区留言讨论!

📌 下一篇预告:我们将深入探讨线性回归以及如何梯度下降求解理想损失函数!

http://www.lryc.cn/news/611512.html

相关文章:

  • 一周学会Matplotlib3 Python 数据可视化-图形的组成部分
  • 场外期权的卖方是什么策略?
  • Python包管理新利器:uv全面解析与Conda对比指南
  • 从 LinkedIn 到 Apache:Kafka 的架构设计与应用场景
  • KafKa 项目 -- GitHub 学习
  • 【第6话:相机模型2】相机标定在自动驾驶中的作用、相机标定方法详解及代码说明
  • 在Word和WPS文字中如何输入汉字的偏旁部首
  • SELinux加固Linux安全2
  • docker安装FFmpeg
  • SmartMediaKit 模块化音视频框架实战指南:场景链路 + 能力矩阵全解析
  • Flink CDC如何保障数据的一致性?
  • 力扣经典算法篇-44-组合总和(回溯问题)
  • Ubuntu20.04 离线安装 FFmpeg 静态编译包
  • 【unity实战】用unity实现一个3D俯视角暗杀潜行恐怖类游戏,主要是实现视野范围可视化效果
  • X86-ubuntu22.04远程桌面只有1/4无法正常操作
  • 问题定位排查手记1 | 从Windows端快速检查连接状态
  • 分布式文件系统07-小文件系统的请求异步化高并发性能优化
  • ubuntu 22.04 中安装python3.11 和 3.11 的 pip
  • STM32U5 外部中断不响应问题分析
  • Ubuntu设置
  • DevOps时代的知识基座革命:Gitee Wiki如何重构研发协作范式
  • 基于51单片机的温控风扇Protues仿真设计
  • 【面试场景题】电商秒杀系统的库存管理设计实战
  • Python高级排序技术:非原生可比对象的自定义排序策略详解
  • 17.10 智谱AI GLM 篇:ChatGLM3-6B 快速上手
  • LeetCode每日一题,8-6
  • List、ArrayList 与顺序表
  • 软考软件设计师考点总结
  • 模电知识点总结
  • 安卓雷电模拟器安装frida调试