机器学习——学习笔记:随机森林
随机森林是一种集成学习算法,核心思想是“三个臭皮匠顶个诸葛亮”——通过组合多棵“决策树”的预测结果,得到更稳定、更准确的最终结论。它可以说是决策树的“升级版”,解决了单棵决策树容易过拟合的问题。
一、原理
可以用“集体投票”来类比随机森林的工作流程:
假设你想判断一部电影是否好看(预测目标),单棵决策树就像“一个影评人”,可能因为个人喜好给出极端评价(比如只看导演是谁);
随机森林则像“100个不同背景的影评人”:有人关注演员,有人关注剧情,有人关注评分——每个人(每棵树)独立给出判断,最后通过“投票”(分类任务)或“平均”(回归任务)得到最终结果。
具体来说,随机森林的“随机性”体现在两个方面(这也是它名字的由来):
- 样本随机:每棵树的训练数据是从原始数据中“有放回地随机抽样”(即bootstrap抽样),比如1000个样本中随机选800个(允许重复)来训练一棵决策树;
- 特征随机:每棵树在分裂节点时,不会用所有特征,而是从特征中随机选一部分(比如10个特征中选5个)来寻找最优分裂点。
通过这两种随机性,让每棵树的“视角”略有不同(避免“抱团犯错”),最后结合所有树的意见,得到更稳健的结果。
二、应用场景
随机森林是机器学习中的“万能选手”,几乎适用于所有结构化数据(表格数据)的任务,尤其擅长处理复杂关系:
1、分类任务:
疾病诊断(根据症状判断是否患病);
客户流失预测(判断用户是否会取消订阅);
垃圾邮件识别。
2、回归任务:
房价预测(结合面积、地段、年限等特征);
销售额预测(根据促销活动、季节、竞品价格等);
3、特征重要性分析:
识别影响用户留存的关键因素(如“使用频率”“客服投诉次数”);
筛选对疾病风险最重要的生物指标。
随机森林的优势在于“开箱即用”——不需要复杂的特征工程(如标准化),对缺失值和异常值也不敏感,非常适合快速出结果的场景。
三、适用的数据特征
1、数据类型:
最适合结构化数据(CSV/Excel表格),包含数值型(如年龄、收入)和类别型(如性别、职业)特征;
对非结构化数据(文本、图像)需先做特征工程(如文本转TF-IDF向量)。
2、数据特点:
对高维数据友好(即使特征比样本多,也能较好处理);
容忍缺失值和异常值(决策树特性,无需额外处理);
不要求特征满足特定分布(如正态分布),适用范围广。
四、优缺点
1、优点:
(1)精度高:通常优于单棵决策树和线性模型,在很多任务上接近XGBoost/LightGBM;
(2)抗过拟合能力强:多棵树的组合降低了单棵树的过拟合风险;
(3)鲁棒性好:对异常值、噪声数据不敏感,缺失值处理简单;
(4)易解释:可输出“特征重要性”,直观展示哪些特征对预测影响最大;
(5)训练快:树之间可并行训练(比XGBoost/LightGBM更易并行)。
2、缺点:
(1)计算成本较高:需要训练多棵树,内存占用比单棵树大;
(2)在超高维稀疏数据上(如文本)可能不如线性模型高效;
(3)对小数据集:可能不如简单模型(如逻辑回归)效果好。
五、使用方法与核心参数(Python实战)
在Python中,scikit-learn库的RandomForestClassifier(分类)和RandomForestRegressor(回归)是最常用的接口,使用简单直观。
1、基础实战
# 以鸢尾花分类为例
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 1、准备数据
data = load_iris
X_train, X_test, y_train, y_test = train_test_split(
data.data, data.target, test_size = 0.2, random_state = 42
)
# 2、定义模型和核心参数
model = RandomForestClassifier(
n_estimators =100,
max_depth = None,
min_samples_split = 2,
min_samples_leaf = 1,
max_features = 'sqrt',
bootstrap = True,
random_state = 42
)
# 3、训练模型
model.fit(X_train, y_train)
# 4、预测与评估
y_pred = model.predict(X_test)
print(f"测试集准确率:{accuracy_score(y_test, y_pred):.2f}")
# 5、查看特征重要性
print("特征重要性:", model.feature_importances_)
2、核心参数说明
|
参数名 |
含义与作用 |
调参建议 |
|
n_estimators |
森林中树的数量(默认100)。 →数量越多,模型越稳定(但计算成本越高)。 |
常用100-500:太少可能欠拟合,太多增益有限且耗时。 |
|
max_depth |
每棵树的最大深度(默认None,不限制)。 →控制树的复杂度:深度越大,越易过拟合。 |
小数据集:设3-10;大数据集:可设10-20,或保持默认(让树自然生长)。 |
|
min_samples_split |
分裂一个内部节点所需的最小样本数(默认2)。 →值越大,树越简单(防过拟合)。 |
通常设2-10:样本少用2,样本多用5-10。 |
|
min_samples_leaf |
叶子节点必须包含的最小样本数(默认1)。 →值越大,叶子越“健壮”(避免单个样本影响)。 |
建议≥1,样本多可设5-10(减少过拟合)。 |
|
max_features |
每棵树随机选择的特征数量(默认“sqrt”)。 →控制特征随机性:值越小,树的多样性越高(但可能丢失重要特征)。 |
分类任务:sqrt(特征数开平方)或log2; 回归任务:1/3或sqrt。 |
|
bootstrap |
是否用bootstrap抽样训练每棵树(默认True)。 →关闭(False)则所有树用全量数据训练(多样性降低,可能过拟合)。 |
通常保持True,小数据集可设False。 |
|
oob_score |
是否使用“袋外样本”评估模型(默认False)。 →袋外样本:未被bootstrap选中的样本,可作为验证集。 |
当bootstrap=True时,设为True可节省验证集(适合小数据)。 |
六、常见问题与解决方案
|
常见问题 |
症状 |
解决方案(参数调整) |
|
过拟合(训练准,测试差) |
训练准确率99%,测试准确率80%;特征重要性波动大。 |
1.增加min_samples_split(如从2→5)或min_samples_leaf(如从1→5):限制树生长; 2.减小max_depth(如从None→10):降低树复杂度; 3.减小max_features(如从“sqrt”→0.5):增加树的多样性; 4.增加n_estimators(如从100→300):用更多树平均噪声(效果有限)。 |
|
欠拟合(训练测试都差) |
训练准确率80%,测试准确率78%;损失始终较高。 |
1.减小min_samples_split(如从5→2)或min_samples_leaf(如从5→1):允许树更复杂; 2.增大max_depth(如从10→None):让树生长更充分; 3.增大max_features(如从0.5→“sqrt”):让树使用更多特征; 4.补充特征:增加交互特征(如“年龄×收入”)或统计特征。 |
|
训练速度慢/内存不足 |
百万级样本训练耗时几小时;程序报内存错误。 |
1.减小n_estimators(如从500→200):减少树的数量; 2.减小max_depth(如从20→10):降低单棵树的复杂度; 3.特征筛选:删除冗余特征(如相关性>0.9的特征); 4.增大max_features(如从0.5→0.8):每棵树用更多特征,减少树的数量需求。 |
|
特征重要性不合理 |
明显重要的特征(如“用户是否注册”)排名靠后。 |
1.增大n_estimators(如从100→500):让重要性更稳定; 2.关闭bootstrap(设为False):所有树用全量数据,减少抽样随机性; 3.检查特征是否存在多重共线性(如“身高”和“体重”高度相关),删除冗余特征。 |
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)