随机森林(初步学习)

随机森林是一种集成学习(Ensemble Learning) 算法,核心思想是构建多个决策树,通过投票或平均的方式输出结果,以此降低单一决策树过拟合的风险,提升模型的泛化能力。

它在机器学习的分类、回归、特征重要性评估等任务中被广泛应用,是工业界和学术界最常用的算法之一。

一、核心原理:"随机" + "森林"

随机森林的 "随机" 体现在两个层面,"森林" 指由多棵决策树组成的集合:

  1. 样本随机(Bootstrap 抽样)

    • 从原始训练集中,通过有放回抽样的方式,为每一棵决策树生成一个独立的训练子集。
    • 这样做的目的是让每棵决策树的训练数据存在差异,避免所有树都学习到相同的特征模式,提升模型多样性。
    • 未被抽到的样本称为 OOB(Out-of-Bag)样本,可用于无额外验证集的模型评估。
  2. 特征随机(随机子空间)

    • 在构建每一棵决策树的每个节点时,不是从所有特征中选择最优特征进行划分,而是随机选择一部分特征,再从这部分特征中选最优。
    • 例如总共有 100 个特征,每棵树的每个节点随机选 10 个特征来划分。
    • 这一步能进一步降低树与树之间的相关性,让森林的 "投票" 更有意义。
  3. 预测规则

    • 分类任务 :所有决策树分别预测类别,最终结果由多数投票决定(得票最多的类别为最终预测)。
    • 回归任务 :所有决策树分别预测数值,最终结果由所有树预测值的平均值决定。

二、优缺点

优点

  1. 泛化能力强:有效降低过拟合,相比单一决策树,在复杂数据集上表现更稳定。
  2. 对噪声不敏感:能处理含噪声的数据集,不易受异常值影响。
  3. 支持高维数据 :无需特征工程(如降维)也能处理高维数据,同时可输出特征重要性,帮助筛选关键特征。
  4. 训练并行化:每棵树的训练相互独立,可利用多核 CPU 并行加速,训练效率高。

缺点

  1. 模型解释性差:决策树本身是 "白盒" 模型,但随机森林由多棵树组成,整体是 "黑盒",难以直观解释预测逻辑。
  2. 对小样本数据集效果一般:样本量过小时,Bootstrap 抽样可能导致训练集多样性不足,模型性能下降。
  3. 内存占用较大:需要存储多棵决策树的结构,数据量大时内存消耗较高。

三、关键超参数(以 Python sklearn 为例)

在使用 sklearn.ensemble.RandomForestClassifier(分类)或 RandomForestRegressor(回归)时,需调整以下核心超参数:

超参数 作用 调优建议
n_estimators 决策树的数量 通常越大效果越好,但达到一定阈值后性能趋于稳定;太大则会增加训练时间
max_depth 每棵树的最大深度 限制树的生长,防止过拟合;值太小会欠拟合,太大则过拟合
max_features 每个节点随机选择的特征数 分类任务默认 sqrt(n_features),回归任务默认 n_features;可手动调整为 log2(n_features) 或具体数值
min_samples_split 节点分裂所需的最小样本数 样本数过少时停止分裂,防止过拟合
min_samples_leaf 叶节点所需的最小样本数 叶节点样本数过少时合并,提升模型稳定性
bootstrap 是否使用 Bootstrap 抽样 默认 True;若设为 False,则所有树都用原始训练集训练
python 复制代码
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report

# 1. 读取数据(假设表格已保存为csv)
data = pd.read_csv("电网电信客户流失数据.csv")
X = data.drop("流失状态", axis=1)
y = data["流失状态"]

# 2. 划分训练集/测试集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y  # 保持标签分布
)

# 3. 初始化随机森林模型
rf = RandomForestClassifier(
    n_estimators=100,  # 100棵树
    max_depth=8,       # 限制树深度防过拟合
    max_features="sqrt",  # 特征随机选择
    n_jobs=-1,         # 并行训练
    random_state=42
)

# 4. 训练与预测
rf.fit(X_train, y_train)
y_pred = rf.predict(X_test)

# 5. 模型评估
print("准确率:", accuracy_score(y_test, y_pred))
print("分类报告:\n", classification_report(y_test, y_pred))

# 6. 查看关键流失特征
feature_importance = pd.DataFrame({
    "特征": X.columns,
    "重要性": rf.feature_importances_
}).sort_values(by="重要性", ascending=False)
print("影响流失的关键特征:\n", feature_importance.head(5))
相关推荐
不爱吃糖的程序媛1 小时前
基于Ascend C开发的Vector算子模板库-ATVOSS 技术深度解读
人工智能·算法·机器学习
松涛和鸣1 小时前
35、Linux IPC进阶:信号与System V共享内存
linux·运维·服务器·数据库·算法·list
Cx330❀2 小时前
《C++ 动态规划》第001-002题:第N个泰波拉契数,三步问题
开发语言·c++·算法·动态规划
LYFlied2 小时前
【每日算法】LeetCode 114. 二叉树展开为链表:从树结构到线性结构的优雅转换
数据结构·算法·leetcode·链表·面试·职场和发展
小白狮ww2 小时前
abaqus 算例教程:考虑动水压力的 koyna 地震非线性动力响应分析
人工智能·深度学习·机器学习·abaqus·材料科学·工程模拟·混凝土抗震分析
毕设源码-钟学长2 小时前
【开题答辩全过程】以 基于Spark机器学习算法的体育新闻智能分类系统设计与实现为例,包含答辩的问题和答案
算法·机器学习·spark
天勤量化大唯粉2 小时前
基于距离的配对交易策略:捕捉价差异常偏离的均值回归机会(天勤量化代码实现)
android·开发语言·python·算法·kotlin·开源软件·策略模式
智航GIS2 小时前
ArcGIS大师之路500技---036通俗易懂讲解克里金法
人工智能·算法·arcgis
鹤入云霄2 小时前
机器学习笔记
人工智能·机器学习