机器学习算法--随机森林
🌲 随机森林是什么?
想象你是一个班主任,要预测某个学生期末考试能否及格。你有以下选择:
-
问1个老师:可能带有个人偏见(比如只看数学成绩)。
-
问10个老师:每个老师关注不同方面(数学、出勤、作业等),最后投票决定。
随机森林就是第二种方法:
-
每个老师 = 1棵决策树
-
多个老师投票 = 多棵树的集体决策
-
最终结果 = 票数最多的选项
📚 例子背景
假设你有100个学生的历史数据,包含以下特征:
-
每天学习时间(小时)
-
作业完成率(%)
-
课堂出勤率(%)
-
是否及格(标签:是/否)
现在要预测一个新学生(学习2小时,作业80%,出勤90%)能否及格。
🌟 随机森林原理
1. 核心思想
「三个臭皮匠,顶个诸葛亮」
-
训练多棵不同的决策树(每棵树用随机部分数据和随机部分特征)。
-
预测时,所有树投票,取多数结果。
2. 关键步骤
-
随机抽数据:每棵树训练时,从100个学生中有放回地随机抽100人(可能重复)。
-
随机抽特征:每棵树分裂时,只随机用部分特征(比如只用「学习时间」和「出勤率」)。
-
独立训练:每棵树根据自己的数据和特征生成规则。
-
投票决策:所有树对新学生预测,票数多的胜出。
3. 为什么有效?
-
减少过拟合:单棵树可能死记硬背数据,多棵树互相纠错。
-
增强泛化能力:不同树关注不同特征,综合结果更稳健。
🛠️ 代码实现(Python)
用 scikit-learn
快速实现:
from sklearn.ensemble import RandomForestClassifier
import pandas as pd# 1. 准备数据(模拟数据)
data = {'学习时间': [1, 2, 3, 1, 2, 3, 1, 2, 3, 1],'作业完成率': [50, 70, 90, 60, 80, 85, 40, 75, 95, 55],'出勤率': [60, 80, 90, 70, 85, 95, 50, 75, 100, 65],'是否及格': [0, 1, 1, 0, 1, 1, 0, 1, 1, 0] # 0=不及格,1=及格
}
df = pd.DataFrame(data)# 2. 训练随机森林
X = df[['学习时间', '作业完成率', '出勤率']]
y = df['是否及格']
model = RandomForestClassifier(n_estimators=10, random_state=42) # 10棵树
model.fit(X, y)# 3. 预测新学生
new_student = pd.DataFrame([[2, 80, 90]], columns=['学习时间', '作业完成率', '出勤率'])
pred = model.predict(new_student)
print("预测结果:", "及格" if pred[0] == 1 else "不及格")
输出:
预测结果: 及格
🌍 关键细节
-
超参数选择
-
n_estimators
:树的数量(通常10~100,越多效果越好但计算越慢)。 -
max_features
:每棵树用的最大特征数(默认sqrt(总特征数)
)。 -
max_depth
:每棵树的深度(控制过拟合)。
-
-
为什么比单棵决策树强?
-
单棵树可能因为某个异常值判断错误,而随机森林多数投票能抵消这种错误。
-
-
特征重要性
随机森林可以输出每个特征的贡献度:
python
复制
下载
print("特征重要性:", model.feature_importances_) # 输出示例:[0.3, 0.5, 0.2] → 作业完成率最重要
🆚 对比决策树
维度 | 决策树 | 随机森林 |
---|---|---|
结果稳定性 | 容易受数据微小变化影响 | 多棵树平均,结果稳定 |
过拟合风险 | 高风险(可能长成大树) | 低风险(树之间互相制约) |
计算速度 | 快 | 慢(树越多越慢) |
🎯 实际应用场景
-
医疗诊断:根据患者指标预测疾病。
-
金融风控:判断用户是否会违约。
-
推荐系统:预测用户喜欢的商品。
🤔 举个反例
如果所有树用的数据和特征完全一样,随机森林就退化成了决策树——所以随机性是关键!
总结:随机森林就是让多棵决策树投票,用集体智慧做出更准的预测。就像班级投票决定周末是否加课,比老师一人决定更公平! 🌳🗳️