机器学习实战(5):决策树与随机森林——直观的分类与回归方法

第5集:决策树与随机森林——直观的分类与回归方法

在机器学习中,决策树(Decision Tree)随机森林(Random Forest) 是两种直观且强大的算法,广泛应用于分类和回归任务。决策树通过一系列规则对数据进行划分,而随机森林则是由多棵决策树组成的集成模型,能够显著提升预测性能。今天我们将深入探讨这两种算法的原理,并通过实践部分使用 Wine Quality 数据集 进行分类预测。


决策树的工作机制

什么是决策树?

决策树是一种基于树形结构的监督学习算法,其核心思想是递归地将数据划分为更小的子集,直到满足某种停止条件。每个内部节点表示一个特征测试,每个分支表示测试结果,每个叶节点表示一个类别或输出值。

图1:决策树示意图
(图片描述:一棵简单的决策树,根节点根据某个特征进行划分,中间节点继续划分,最终到达叶节点,叶节点标注为类别标签。)
在这里插入图片描述


决策树的构建过程

  1. 选择最佳划分特征:根据某种准则(如信息增益或基尼指数)选择最优特征。
  2. 递归划分:对每个子集重复上述过程,直到满足停止条件(如达到最大深度或节点纯度足够高)。
  3. 生成叶节点:当划分停止时,生成叶节点并赋予类别或输出值。

信息增益与基尼指数

1. 信息增益

信息增益衡量划分前后数据集的不确定性减少程度。公式如下:
Information Gain = H ( D ) − ∑ v ∈ V ∣ D v ∣ ∣ D ∣ H ( D v ) \text{Information Gain} = H(D) - \sum_{v \in V} \frac{|D_v|}{|D|} H(D_v) Information Gain=H(D)vVDDvH(Dv)
其中:

  • $ H(D) $ 是数据集 $ D $ 的熵。
  • $ D_v $ 是划分后的子集。

熵的计算公式为:
H ( D ) = − ∑ i = 1 n p i log ⁡ 2 ( p i ) H(D) = -\sum_{i=1}^{n} p_i \log_2(p_i) H(D)=i=1npilog2(pi)
其中 $ p_i $ 是第 $ i $ 类样本的比例。

2. 基尼指数

基尼指数衡量数据集的不纯度,越小表示纯度越高。公式如下:
Gini Index = 1 − ∑ i = 1 n p i 2 \text{Gini Index} = 1 - \sum_{i=1}^{n} p_i^2 Gini Index=1i=1npi2

案例:基于信息增益的决策树案例

数据集描述

我们使用一个简单的数据集来说明如何构建决策树。假设我们有以下数据:

天气 (Outlook)温度 (Temperature)湿度 (Humidity)是否打球 (Play)
SunnyHotHighNo
SunnyHotHighNo
OvercastHotHighYes
RainMildHighYes
RainCoolNormalYes
RainCoolNormalNo
OvercastCoolNormalYes
SunnyMildHighNo
SunnyCoolNormalYes
RainMildNormalYes
SunnyMildNormalYes
OvercastMildHighYes
OvercastHotNormalYes
RainMildHighNo

计算信息增益

我们以“天气”为例,计算信息增益。

  1. 整体熵
    H ( D ) = − ( 9 14 log ⁡ 2 9 14 + 5 14 log ⁡ 2 5 14 ) ≈ 0.94 H(D) = -\left(\frac{9}{14} \log_2 \frac{9}{14} + \frac{5}{14} \log_2 \frac{5}{14}\right) \approx 0.94 H(D)=(149log2149+145log2145)0.94

  2. 按“天气”划分后熵

S u n n y : H ( S u n n y ) = − ( 2 5 log ⁡ 2 2 5 + 3 5 log ⁡ 2 3 5 ) ≈ 0.97 Sunny: H(Sunny) = -\left(\frac{2}{5} \log_2 \frac{2}{5} + \frac{3}{5} \log_2 \frac{3}{5}\right) \approx 0.97 SunnyH(Sunny)=(52log252+53log253)0.97
O v e r c a s t : H ( O v e r c a s t ) = 0 (全部为 Y e s ) Overcast: H(Overcast) = 0 (全部为 Yes) OvercastH(Overcast)=0(全部为Yes
R a i n : H ( R a i n ) = − ( 3 5 log ⁡ 2 3 5 + 2 5 log ⁡ 2 2 5 ) ≈ 0.97 Rain: H(Rain) = -\left(\frac{3}{5} \log_2 \frac{3}{5} + \frac{2}{5} \log_2 \frac{2}{5}\right) \approx 0.97 RainH(Rain)=(53log253+52log252)0.97

平均熵:
H ( D ∣ O u t l o o k ) = 5 14 ⋅ 0.97 + 4 14 ⋅ 0 + 5 14 ⋅ 0.97 ≈ 0.69 H(D|Outlook) = \frac{5}{14} \cdot 0.97 + \frac{4}{14} \cdot 0 + \frac{5}{14} \cdot 0.97 \approx 0.69 H(DOutlook)=1450.97+1440+1450.970.69

  1. 信息增益
    I G ( O u t l o o k ) = H ( D ) − H ( D ∣ O u t l o o k ) ≈ 0.94 − 0.69 = 0.25 IG(Outlook) = H(D) - H(D|Outlook) \approx 0.94 - 0.69 = 0.25 IG(Outlook)=H(D)H(DOutlook)0.940.69=0.25

决策树描述

根据信息增益,选择“天气”作为根节点,进一步划分其他特征,最终得到如下决策树:

图2:决策树示例
(图片描述:一棵决策树,根节点为“天气”,分为三个分支(Sunny、Overcast、Rain),每个分支进一步划分湿度或温度,最终到达叶节点,标注为是否打球。)
Root Node: Weather
├── Sunny
│ ├── Humidity
│ │ ├── High: No
│ │ └── Normal: Yes
│ └── Temperature
│ ├── Hot: No
│ └── Mild: Yes
├── Overcast
│ └── Yes
└── Rain
├── Humidity
│ ├── High: No
│ └── Normal: Yes
└── Temperature
├── Cool: Yes
└── Mild: Yes


随机森林的概念及其优势

什么是随机森林?

随机森林是一种基于决策树的集成学习算法,通过构建多棵决策树并将它们的结果进行投票或平均来提高模型的稳定性和准确性。

随机森林的优势

  1. 减少过拟合:通过引入随机性(如随机选择特征和样本),降低单棵树的过拟合风险。
  2. 鲁棒性强:对噪声数据具有较好的容忍能力。
  3. 易于调参:超参数较少,且对默认值通常表现良好。

超参数调优

随机森林的性能受以下超参数影响:

  • n_estimators:森林中树的数量,越多通常效果越好,但会增加计算成本。
  • max_depth:每棵树的最大深度,控制模型复杂度。
  • min_samples_split:分裂节点所需的最小样本数。
  • max_features:每棵树分裂时考虑的最大特征数。

可以通过网格搜索(Grid Search)或随机搜索(Random Search)优化这些超参数。


实践部分:使用随机森林对 Wine Quality 数据集进行分类预测

数据集简介

Wine Quality 数据集包含葡萄酒的化学特性及其质量评分(从 0 到 10)。我们将使用该数据集进行二分类任务,目标是预测葡萄酒是否为高质量(评分 ≥ 7)。

完整代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
from sklearn.preprocessing import StandardScaler# 加载数据
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv"
data = pd.read_csv(url, sep=';')# 构建二分类目标变量
data['Quality'] = data['quality'].apply(lambda x: 1 if x >= 7 else 0)# 提取特征和标签
X = data.drop(['quality', 'Quality'], axis=1)
y = data['Quality']# 标准化特征
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.3, random_state=42)# 构建随机森林模型
model = RandomForestClassifier(random_state=42)# 超参数调优
param_grid = {'n_estimators': [50, 100, 200],'max_depth': [None, 10, 20],'min_samples_split': [2, 5, 10]
}
grid_search = GridSearchCV(model, param_grid, cv=3, scoring='accuracy')
grid_search.fit(X_train, y_train)# 最佳模型
best_model = grid_search.best_estimator_# 预测
y_pred = best_model.predict(X_test)# 评估模型性能
accuracy = accuracy_score(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)
class_report = classification_report(y_test, y_pred)print("最佳超参数:", grid_search.best_params_)
print(f"Accuracy: {accuracy:.2f}")
print("Confusion Matrix:")
print(conf_matrix)
print("Classification Report:")
print(class_report)# 特征重要性可视化
feature_importances = best_model.feature_importances_
features = data.drop(['quality', 'Quality'], axis=1).columnsplt.figure(figsize=(10, 6))
plt.barh(features, feature_importances, color='skyblue')
plt.title('Feature Importances in Random Forest', fontsize=16)
plt.xlabel('Importance Score', fontsize=12)
plt.ylabel('Features', fontsize=12)
plt.show()

运行结果

输出结果:
最佳超参数: {'max_depth': None, 'min_samples_split': 2, 'n_estimators': 100}
Accuracy: 0.91
Confusion Matrix:
[[408   6][ 37  19]]
Classification Report:precision    recall  f1-score   support0       0.92      0.99      0.95       4141       0.76      0.34      0.47        56accuracy                           0.91       470macro avg       0.84      0.66      0.71       470
weighted avg       0.90      0.91      0.89       470

图3:特征重要性条形图
(图片描述:水平条形图展示了随机森林模型中各特征的重要性得分,颜色深浅表示特征的重要性高低。)
在这里插入图片描述


总结

本文介绍了决策树和随机森林的基本原理,并通过实践部分展示了如何使用随机森林对 Wine Quality 数据集进行分类预测。希望这篇文章能帮助你更好地理解这两种算法!

下集预告:第6集:支持向量机(SVM)——强大的非线性分类器


参考资料

  • Scikit-learn 文档: https://scikit-learn.org/stable/documentation.html
  • Wine Quality 数据集: https://archive.ics.uci.edu/ml/datasets/Wine+Quality

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

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

相关文章

网站中内嵌腾讯元宝用deepseek

网站中内嵌元宝deepseek <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>BING搜</title> <meta name="description" content="不用学习就G搜索高级语法,即选即用…

draw.io:开源款白板/图表绘制利器

在工作和学习中&#xff0c;我们常常需要绘制各种图表&#xff0c;例如流程图、思维导图、网络拓扑图等等。一款功能强大且易于上手的图表绘制工具可以极大地提高我们的效率。今天&#xff0c;我要向大家推荐一款开源免费的图表绘制工具—— draw.io&#xff0c;并手把手教你如…

ES6箭头函数:从基础到进阶指南

目录 引言&#xff1a;新时代的函数表达 一、基础篇&#xff1a;语法与特性 1. 语法演进 2. 参数处理 3. 函数体形式 二、进阶特性深度解析 1. this绑定机制&#xff08;词法作用域&#xff09; 2. 不可构造特性 3. 与普通函数对比 三、实战应用场景 1. 数组高阶函数…

XML Schema 元素替换

XML Schema 元素替换 引言 XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。XML Schema 是一种用于定义 XML 文档结构的语言,它描述了 XML 文档的结构、数据类型和约束。在处理 XML 文档时,有时需要对特定的元素进行替换,以满足特定的需求。本文将介绍 XML Sch…

推理模型时代:大语言模型如何从对话走向深度思考?

一、对话模型和推理模型的区别概述 对话模型是专门用于问答交互的语言模型,符合人类的聊天方式,返回的内容可能仅仅只是一个简短的答案,一般模型名称后面会带有「chat」字样。 推理模型是比较新的产物,没有明确的定义,一般是指输出过程中带有<think>和</think&…

数据仓库与数据湖的协同工作:智慧数据管理的双引擎

数据仓库与数据湖的协同工作:智慧数据管理的双引擎 引言 在数据驱动的今天,企业和组织收集和存储的数据量正以惊人的速度增长。如何高效管理和利用这些数据,成为了决策者和技术专家的共同难题。为了解决这一问题,数据仓库(Data Warehouse)和数据湖(Data Lake)这两种技…

基于eBPF的全栈可观测性系统:重新定义云原生环境诊断范式

引言&#xff1a;突破传统APM的性能桎梏 某头部电商平台采用eBPF重构可观测体系后&#xff0c;生产环境指标采集性能提升327倍&#xff1a;百万QPS场景下传统代理模式CPU占用达63%&#xff0c;而eBPF直采方案仅消耗0.9%内核资源。核心业务的全链路追踪时延从900μs降至18μs&a…

【CS285】高斯策略对数概率公式的学习笔记

公式介绍 在【CS285】中提到了高斯策略对数概率公式的公式如下&#xff1a; log ⁡ π θ ( a t ∣ s t ) − 1 2 ∥ f ( s t ) − a t ∥ Σ 2 const \log \pi_{\theta}(\mathbf{a}_t | \mathbf{s}_t) -\frac{1}{2} \left\| f(\mathbf{s}_t) - \mathbf{a}_t \right\|_{\S…

图解MySQL【日志】——Binlog

Binlog&#xff08;Binary Log&#xff0c;归档日志&#xff09; 为什么需要 Binlog&#xff1f; Binlog 是 MySQL 中的二进制日志&#xff0c;用于记录数据库的所有写操作&#xff08;INSERT、UPDATE、DELETE 等&#xff09; 1. 主从复制 作用&#xff1a;是 MySQL 主从复…

Java 使用websocket

添加依赖 <!-- WebSocket 支持 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dependency>添加配置类 Configuration public class WebSocketConfig {B…

进程的介绍--进程状态/切换

1.冯 • 诺依曼体系结构 1.1 体系结构 冯•诺依曼结构也称普林斯顿结构&#xff0c;是一种将程序指令存储器和数据存储器合并在一起的存储器结构。数学家冯•诺依曼提出了计算机制造的三个基本原则&#xff0c;即采用二进制逻辑、程序存储执行以及计算机由五个部分组成&#x…

百万架构师第三十七课:RabbitMq:高可用集群搭建步骤|JavaGuide

安装环境 Centos-7 三台虚拟机 192.168.8.150&#xff08;磁盘节点&#xff09; 192.168.8.45 &#xff08;内存节点&#xff09; 192.168.8.40 &#xff08;内存节点&#xff09;一、安装Erlang 1、erlang 下载地址&#xff1a; http://www.rabbitmq.com/releases/erlang…

Python开源项目月排行 2025年1月

#2025年1月2025年2月2日1DeepSeek-R1当红炸子鸡&#xff0c;国人之骄傲&#xff01;项目于 2025 年 1 月 20 日正式发布。早期的预览版&#xff08;如 DeepSeek-R1-Lite-Preview&#xff09;则在 2024 年 11 月 20 日亮相。 用途&#xff1a;DeepSeek-R1 是一个开源的推理模型&…

yolov8改进:efficientViT替换YOLOV8主干网络结构

6.1 efficientViT替换YOLOV8主干网络结构 6.1.1 effivientvit EfficientViT 的架构特点 EfficientViT 是一种结合了 Transformer 和卷积网络优点的轻量级模型&#xff0c;它的设计目标是高效地提取图像特征&#xff0c;同时减少计算量。以下是它的关键组成部分&#xff1a; …

Android Studio安装配置及运行

一、下载Android Studio 官网下载&#xff1a;下载 Android Studio 和应用工具 - Android 开发者 | Android Developers 跳转到下载界面&#xff0c;选择同意条款&#xff0c;并点击下载&#xff0c;如图&#xff1a; 二、详细安装 双击下载的文件 三、配置Android Studio …

OpenHarmony分布式数据管理子系统

OpenHarmony分布式数据管理子系统 简介 目录 组件说明 分布式数据对象数据共享分布式数据服务Key-Value数据库首选项关系型数据库标准数据化通路 相关仓 简介 子系统介绍 分布式数据管理子系统支持单设备的各种结构化数据的持久化&#xff0c;以及跨设备之间数据的同步、…

JavaScript 中的数组详解

在 JavaScript 中&#xff0c;数组是一种用于存储多个值的特殊对象。数组可以存储任何类型的数据&#xff0c;包括数字、字符串、对象&#xff0c;甚至其他数组。本文将详细介绍 JavaScript 中数组的基本用法、常用方法&#xff08;包括 splice 方法&#xff09;以及一些最佳实…

智能算法如何优化数字内容体验的个性化推荐效果

内容概要 在数字内容体验的优化过程中&#xff0c;个性化推荐系统的核心价值在于通过数据驱动的技术手段&#xff0c;将用户需求与内容资源进行高效匹配。系统首先基于用户行为轨迹分析&#xff0c;捕捉包括点击频次、停留时长、交互路径等关键指标&#xff0c;形成对用户兴趣…

mysql实时同步到es

测试了多个方案同步&#xff0c;最终选择oceanu产品&#xff0c;底层基于Flink cdc 1、实时性能够保证&#xff0c;binlog量很大时也不产生延迟 2、配置SQL即可完成&#xff0c;操作上简单 下面示例mysql的100张分表实时同步到es&#xff0c;优化备注等文本字段的like查询 创…

超简单理解KMP算法(最长公共前后缀next数组、合并主子串、子串偏移法)

KMP算法理解 最长公共前后缀next合并主子串子串偏移 参考b站&#xff1a;子串偏移、合并主子串 最长公共前后缀next 这个概念是一个trick&#xff0c;帮助我们记录遍历了一遍的数组的相似特性&#xff0c;想出来确实很nb&#xff0c;我也不理解逻辑是怎么想出来的。 字符串的…