随机森林--集成学习
一、集成学习之随机森林
1、集成学习
集成学习方法,就是人多力量大, 少数服从多数,比如
你需要投资一支股票,你的 100 个朋友给你提供了建议,你如何决定?
选择最牛的那个朋友提供的建议-类似找到最好的那棵决策树
所有朋友的建议合并,选择建议最多的那一支-随机森林
集成学习方法分类如下:
Bagging:Bagging 通过有放回地从原始数据集中抽取多个子样本,然后分别训练模型。最终的预测结果是这些模型预测结果的平均值(对于回归问题)或者是多数投票(对于分类问题)。Bagging的一个典型例子是随机森林
Boosting:对于训练集中的每个样本建立权值 wi,表示对每个样本的关注度。当某个样本被误分类的概率很高时,需要加大对该样本的权值,进行迭代的过程中,每一步迭代都是一个弱分类器。我们需要用某种策略将其组合,作为最终模型
2、随机森林
随机森林(Random Forest)是一种集成学习方法,它通过构建多个决策树来进行预测,并且在预测时采用投票的方式选择最终的分类结果。随机森林既可以用于分类任务也可以用于回归任务
随机森林中的“随机”体现在两个方面:首先,每棵树在训练时,从原始数据集中随机选择一部分数据点作为训练集;其次,在每棵树的每个分裂节点上,只考虑一部分特征,而不是所有特征
随机森林的工作流程通常包括以下几个步骤:
数据预处理:对原始数据进行清洗和标准化,以确保算法的有效运行
自助采样:从原始数据集中通过自助采样的方式抽取多个不同的训练数据集。自助采样允许数据集中的样本重复出现,这意味着每个训练集的大小与原始数据集相同,但包含一些重复的样本
特征随机选择:在每棵树的每个分裂节点上,随机选择一部分特征,而不是考虑所有可能的特征。这一步进一步增加了模型的多样性,并有助于减少过拟合
决策树构建:使用每个训练数据集构建决策树,直到每个树达到其最大深度或达到其他停止条件
预测和聚合:对于分类问题,每棵树给出一个预测,最终的预测结果是所有树预测结果的多数投票;对于回归问题,则是所有树预测结果的平均值
案例:
from sklearn.ensemble import RandomForestClassifier from sklearn.feature_extraction import DictVectorizer import pandas as pd from sklearn.metrics import accuracy_score from sklearn.preprocessing import StandardScaler def titanic_survival_prediction():# 读取训练数据集train_data = pd.read_csv('./train.csv')# 读取测试数据集test_data = pd.read_csv('./test.csv')# 选取训练集和测试集的特征值和目标值X_train = train_data[["Pclass", "Age", "Sex"]]y_train = train_data[["Survived"]]X_test = test_data[["Pclass", "Age", "Sex"]]# 处理数据集中的缺失值X_train = X_train.fillna(X_train['Age'].mean())X_test = X_test.fillna(X_test['Age'].mean())# 将数据集转换为列表,元素是字典格式X_train = X_train.to_dict(orient="records")X_test = X_test.to_dict(orient="records")# 把字典数据转为数值vec = DictVectorizer(sparse=True)X_train = vec.fit_transform(X_train).toarray()X_test = vec.fit_transform(X_test).toarray()# 特征工程:标准化scaler = StandardScaler()X_train = scaler.fit_transform(X_train)X_test = scaler.transform(X_test)# 创建随机森林分类器模型model = RandomForestClassifier(n_estimators=120, max_depth=5)# 训练模型y_train = y_train.values.ravel()model.fit(X_train, y_train)# 预测y_predict = model.predict(X_test)# 读取测试集的结果y_test = pd.read_csv('./gender_submission.csv')[['Survived']]y_test = y_test.values.ravel()print("测试数据集的准确率:\n", model.score(X_test, y_test))# 预测结果与实际标签之间的准确率print('预测结果与实际标签之间的准确率:\n', accuracy_score(y_test, y_predict))
随机森林(Random Forest)中的树被称为“弱分类器”(或“弱学习器”),主要是因为以下几个原因:
单棵树的性能有限
随机森林中的每棵决策树通常生长得较浅(例如,限制最大深度或叶子节点最小样本数),或者通过其他方式(如随机特征选择)主动抑制其复杂度。
单棵树容易受到训练数据中的噪声或局部特征的影响,导致其泛化能力较弱(高方差或高偏差)。如果完全不加限制,单棵树可能过拟合,但随机森林通过限制树的复杂度,刻意保持其“弱”的特性。
“弱”是集成方法的设计需求
随机森林属于集成学习(Ensemble Learning)方法,其核心思想是通过结合多个弱分类器的预测结果来提升整体性能。如果单棵树已经很强(例如深度很深、完全拟合训练数据),集成后的模型反而可能因多样性不足而效果不佳。
弱分类器的多样性比单棵树的强度更重要。通过让每棵树只学习数据的一部分特征或样本(通过特征随机性和Bootstrap采样),森林中的树可以互补错误,从而提升整体鲁棒性。
与Boosting的对比
在Boosting(如AdaBoost、GBDT)中,弱分类器是显式要求的(例如单层决策树),因为Boosting通过迭代修正错误逐步提升模型性能。
随机森林虽然不严格要求单棵树必须“极弱”,但通过Bagging和随机特征选择,本质上也是利用弱分类器的集体决策来降低方差(Variance),避免过拟合。
随机性的引入
每棵树的训练数据是通过Bootstrap采样(有放回抽样)得到的,且分裂节点时仅考虑特征的随机子集。这种随机性进一步削弱了单棵树的独立性,使其更依赖集体决策。
为什么“弱”反而更好?
降低过拟合风险:强分类器容易记住训练数据的细节,而弱分类器的组合可以平滑噪声。
提高多样性:弱分类器之间的差异性(Diversity)是集成方法成功的关键。
效率与泛化的平衡:浅树训练速度快,适合大规模数据,同时通过集成保持泛化能力。