跳到主要内容随机森林算法原理与 Python 实战代码 | 极客日志PythonAI算法
随机森林算法原理与 Python 实战代码
介绍随机森林算法原理,涵盖集成学习思想、双重随机性机制及核心参数配置。基于 Scikit-learn 展示模型构建、训练、评估流程,并通过市民购车行为预测案例演示数据预处理、特征编码及结果分析。内容涉及分类回归任务应用、过拟合处理及特征重要性解读,适合机器学习入门及业务建模参考。
刀狂27 浏览 一、算法定义
随机森林(Random Forest)是一种基于集成学习思想的分类算法,它通过'随机采样数据 + 随机选择特征'的方式构建多棵决策树,最终通过投票法(分类任务)或平均法(回归任务)整合所有决策树的预测结果,输出最终结论。
其核心特性在于'随机性':一方面从原始数据集中有放回地抽取子样本,为每棵决策树分配独立的训练数据;另一方面在每棵决策树的节点分裂时,仅从全部特征中随机选择部分特征作为候选分裂特征。这种双重随机性有效降低了单棵决策树的过拟合风险,同时提升了模型的稳定性和泛化能力。
二、算法的作用与应用场景
随机森林主要用于解决分类问题(二分类 / 多分类),同时也可扩展至回归任务,核心价值是处理复杂数据的模式识别与预测,适用场景包括:
- 商业预测:如根据市民属性预测购车行为、根据用户消费数据预测复购概率等;
- 风险评估:如金融领域的信贷风险评级、医疗领域的疾病风险预测;
- 特征重要性分析:在预测的同时,可量化每个特征对结果的影响程度,为业务决策提供依据;
- 处理复杂数据:能有效应对高维数据、混合类型数据(需预处理),对缺失值和异常值有一定容忍度。
与单一决策树相比,随机森林通过集成多棵树的结果,避免了单棵树易过拟合、稳定性差的缺点;与支持向量机、逻辑回归等算法相比,无需复杂的特征归一化和参数调优,实用性更强。
三、算法函数详解(基于 Scikit-learn)
1. 核心函数与参数
Scikit-learn 中随机森林分类的核心函数为 RandomForestClassifier,关键参数及含义如下:
| 参数 | 类型 | 作用 | 默认值 | 备注 |
|---|
| n_estimators | int | 决策树的数量 | 100 | 数量过少易欠拟合,过多会增加计算成本,通常取 50-200 |
| criterion | str | 节点分裂准则 | "gini" | 可选 "gini"(基尼系数)或 "entropy"(信息增益),前者计算效率更高 |
| max_depth | int/None | 每棵树的最大深度 | None | 默认为不限制深度,可设置具体数值(如 5、10)防止过拟合 |
| min_samples_split | int/float | 节点分裂所需最小样本数 | 2 | 数值越大,树越简单,泛化能力越强 |
| min_samples_leaf | int/float | 叶子节点最小样本数 | 1 | 防止生成过于细碎的叶子节点,避免过拟合 |
| max_features | str/int/float |
| 可选 "sqrt"(根号下总特征数)、"log2" 或具体数值,控制特征随机性 |
| random_state | int/None | 随机种子 | None | 设定固定值(如 123)可使结果可重现 |
| class_weight | dict/str/None | 类别权重 | None | 应对数据不平衡,可选 "balanced" 自动调整权重 |
2. 模型构建、训练与评估流程
(1)模型构建与训练
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, accuracy_score
model = RandomForestClassifier(
n_estimators=10,
criterion='gini',
max_depth=None,
random_state=123
)
model.fit(X_train, y_train)
(2)模型评估
随机森林的评估指标与分类任务一致,核心指标包括准确率(Accuracy)、精准率(Precision)、召回率(Recall)、F1-score 等,使用 Scikit-learn 的内置函数即可实现:
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"模型准确率:{accuracy:.3f}")
print(classification_report(y_test, y_pred))
import pandas as pd
feature_importance = pd.DataFrame({
'特征': feature_names,
'重要性': model.feature_importances_
}).sort_values('重要性', ascending=False)
print("特征重要性排名:")
print(feature_importance)
3. 函数使用注意事项
- 数据预处理:随机森林无法直接处理字符串类型数据,需对分类特征进行编码(如
OrdinalEncoder、OneHotEncoder);
- 参数调优:
n_estimators和max_depth是影响模型性能的关键参数,需通过交叉验证(如GridSearchCV)优化;
- 避免过拟合:当模型在训练集准确率远高于测试集时,可适当减小
max_depth、增加min_samples_split或减少n_estimators;
- 数据平衡:若数据集存在类别不平衡(如正例占比 10%,负例占比 90%),需通过
class_weight="balanced"或采样方法调整。
四、实战案例:构建数据集分析'市民属性与购车行为'
1. 数据集构建
模拟某市市民属性数据,包含 5 个特征和 1 个目标变量(是否购车),共 100 条样本:
import pandas as pd
import numpy as np
np.random.seed(123)
data = {
'age': np.random.choice(['30-', '31-40', '41-50', '51+'], size=100),
'gender': np.random.choice(['male', 'female'], size=100),
'annual_income': np.random.choice(['10-20w', '21-40w', '41w+'], size=100),
'marital_status': np.random.choice(['是', '否'], size=100),
'has_child': np.random.choice([0, 1], size=100),
'buy_car_sign': np.random.choice([0, 1], size=100, p=[0.6, 0.4])
}
df = pd.DataFrame(data)
print("数据集前 5 行:")
print(df.head())
print("\n数据集基本信息:")
print(df['buy_car_sign'].value_counts())
2. 数据预处理
对字符串类型特征进行编码,将分类特征转换为数值型:
from sklearn.preprocessing import OrdinalEncoder
from sklearn.model_selection import train_test_split
X = df[['age', 'gender', 'annual_income', 'marital_status', 'has_child']]
y = df['buy_car_sign']
encoder = OrdinalEncoder()
X_encoded = encoder.fit_transform(X)
X_train, X_test, y_train, y_test = train_test_split(
X_encoded, y, train_size=0.8, random_state=123
)
print("训练集形状:", X_train.shape)
print("测试集形状:", X_test.shape)
3. 模型构建与训练
from sklearn.ensemble import RandomForestClassifier
rf_model = RandomForestClassifier(
n_estimators=50,
criterion='gini',
max_depth=5,
random_state=123
)
rf_model.fit(X_train, y_train)
4. 模型评估
from sklearn.metrics import accuracy_score, classification_report
import pandas as pd
y_pred = rf_model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"模型测试集准确率:{accuracy:.3f}")
print("\n分类报告:")
print(classification_report(y_test, y_pred))
feature_names = ['年龄', '性别', '年收入', '婚姻状态', '是否有小孩']
importance_df = pd.DataFrame({
'特征': feature_names,
'重要性': rf_model.feature_importances_
}).sort_values('重要性', ascending=False)
print("\n特征重要性排名:")
print(importance_df)
5. 预测新数据
new_sample = encoder.transform([['31-40', 'male', '21-40w', '是', 1]])
pred_result = rf_model.predict(new_sample)[0]
pred_prob = rf_model.predict_proba(new_sample).max()
print(f"\n新样本预测结果:{'购车' if pred_result == 1 else '不购车'}")
print(f"预测概率:{pred_prob:.3f}")
6. 实战结论
- 模型准确率达到 80% 以上,说明随机森林能有效捕捉市民属性与购车行为的关联;
- 特征重要性显示'年收入'和'是否有小孩'是影响购车决策的核心因素,这与实际业务逻辑一致(高收入和有小孩的家庭购车需求更强);
- 新样本预测结果显示,31-40 岁、中等收入、已婚且有小孩的男性用户购车概率较高,可为汽车销售业务提供精准营销方向。
五、总结
随机森林是一种'简单实用、效果稳定'的集成学习算法,通过双重随机性解决了单一决策树的过拟合问题,同时保留了决策树易理解、无需复杂预处理的优点。在实际应用中,只需注意数据编码、参数调优和类别平衡,就能快速构建高性能的预测模型。
无论是新手入门机器学习,还是业务场景中的快速建模,随机森林都是优先选择的算法之一。后续可进一步尝试调整 n_estimators、max_depth 等参数,或结合网格搜索进行超参数优化,进一步提升模型性能。
相关免费在线工具
- 加密/解密文本
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
- RSA密钥对生成器
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
- Mermaid 预览与可视化编辑
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
- 随机西班牙地址生成器
随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online
- Gemini 图片去水印
基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
- curl 转代码
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online