详解机器学习经典模型(原理及应用)——随机森林
本文详细介绍了随机森林模型的概念、原理、应用等内容,可用作业务或面试八股的参考。
一、什么是随机森林
随机森林(Random Forest)是一种集成学习方法(Ensemble Learning),它通过构建多个决策树(决策树原理及应用可参考此处)并将它们的结果结合起来,以提高预测的准确性和稳定性(就是多棵树构成一片森林的意思)。与决策树一样,随机森林也是同时可以用于分类和回归任务,它的核心思想是利用多个决策树的预测结果来减少模型的方差,从而提高整体的泛化能力。
二、随机森林模型原理
要了解随机森林的原理,首先应当知道它为什么叫“随机”。随机森林的随机主要体现在两方面,一是森林中的每棵树会随机且有放回地选择样本,二是每棵树会随机且有放回地选择建模的特征。试想一下,如果森林中的每棵树都使用同样的样本和同样的特征来建模,那么效果是不是跟单颗决策树一模一样?随机森林之所以比决策树更强大的原因就在于这两个“随机”,它构建了多颗相互存在较大差异的树模型进行决策,从而达到“三个臭皮匠,赛过诸葛亮”的效果。决策树的训练流程如下:
1、初始化模型参数
在训练随机森林之前,一般需要定义一下相关的参数,特别是树的数量和树的深度,以scikit-learn的决策树模型为例,常用的参数有n_estimators、max_depth等。
2、构建决策树
随机森林由多棵决策树组成,每棵树的构建过程如下:
(1)样本抽样:如果bootstrap=True,则使用自助采样从训练集中有放回地抽取样本,形成每棵树的训练集,未被抽中的样本成为袋外(Out-of-Bag, OOB)样本。
(2)特征选择:在每个节点的分裂过程中,随机选择max_features数量的特征作为候选特征。
(3)最佳分裂点选择:在候选特征中,选择一个特征和阈值来最大化节点的纯度(例如,使用基尼不纯度或信息增益)。
(4)递归分裂:重复特征选择和最佳分裂点选择的过程,直到达到最大深度或叶节点的最小样本数。
3、决策树训练
每棵决策树都从根节点开始,递归地分裂直到满足停止条件:
(1)内部节点分裂:在内部节点,根据选定的特征和阈值分裂样本。
(2)叶节点生成:当节点满足停止条件时,将其标记为叶节点,并根据多数类或平均值确定预测结果。
4、聚合结果
随机森林的最终预测结果是通过聚合所有决策树的预测结果得到的:
(1)分类任务:对于每个样本,所有树对其进行分类,并采用多数投票法确定最终类别。
(2)回归任务:对于每个样本,所有树给出预测值,并计算这些预测值的平均值作为最终预测结果。
三、模型损失函数
在随机森林的训练过程中,通常不会直接使用损失函数来指导每棵决策树的学习,这与许多其他机器学习算法(如线性回归、逻辑回归或神经网络)不同。随机森林是一种基于决策树的集成学习方法,它通过构建多棵决策树并结合它们的预测结果来提高整体模型的性能。每棵决策树在训练时会使用特定的分裂准则(比如基尼不纯度、均方误差等)来选择最佳的分裂点。随机森林的训练目标是最小化整个森林的预测误差,这通常是通过减少模型的方差来实现的。
四、袋外数据(Out of bag,OOB)
随机森林中的袋外数据(Out-of-Bag, OOB)是指在构建随机森林模型时,由于自助采样(Bootstrap Sampling)过程中产生的那些没有被选中用于训练个别决策树的样本。在自助采样中,每次从原始训练数据集中随机抽取一个样本,抽取后将样本放回,这样每个样本都有被重复抽取的机会。因此,在构建每棵树时大约有36.8%的样本不会被选中,这些未被选中的样本就构成了袋外数据。
袋外数据可以用来估计模型的泛化误差,而不需要单独的验证集。对于每棵决策树,可以用其未选中的袋外数据来计算预测误差,如分类错误率或回归的均方误差。这些误差的平均值可以作为模型性能的一个无偏估计。这是由于袋外数据没有直接参与模型训练,因此它们提供了一种有效的交叉验证手段,可以用来验证模型的稳定性和可靠性。但一般情况我们很少使用OOB,尤其是数据量较大的时候,它会显著增加训练的时间复杂度。
五、模型应用
1、分类
# 导入必要的库
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 将数据集拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建随机森林分类器实例
# n_estimators 表示决策树的数量,可以调整这个参数
# n_estimators 表示决策树的深度
# random_state 用于控制随机数生成器的种子,确保结果可复现
rf_classifier = RandomForestClassifier(n_estimators=100, max_depth=3, random_state=42)
# 训练模型
rf_classifier.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = rf_classifier.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy:.2f}')
# 可打印特征重要性
feature_importances = rf_classifier.feature_importances_
print("Feature importances:", feature_importances)
2、回归
# 导入必要的库
from sklearn.datasets import load_boston
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
# 加载波士顿房价数据集
boston = load_boston()
X = boston.data
y = boston.target
# 将数据集拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建随机森林回归器实例
# n_estimators 表示决策树的数量,可以调整这个参数
# n_estimators 表示决策树的深度
# random_state 用于控制随机数生成器的种子,确保结果可复现
rf_regressor = RandomForestRegressor(n_estimators=100, max_depth=3, random_state=42)
# 训练模型
rf_regressor.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = rf_regressor.predict(X_test)
# 计算均方误差(MSE)
mse = mean_squared_error(y_test, y_pred)
print(f'Mean Squared Error: {mse:.2f}')
# 可打印特征重要性
feature_importances = rf_regressor.feature_importances_
print("Feature importances:", feature_importances)
六、总结
随机森林比决策树更为强大,因此在业务中也是常用的模型之一。在面试八股中,随机森林也是常客,随之引出的概念就是Bagging,全称Bootstrap Aggregating,通过构建多个基学习器(通常是决策树)并将它们的预测结果结合起来,以减少模型的方差,从而提高整体模型的泛化能力(Bagging、Boosting、Stacking都是集成学习的经典方法,也是竞赛常用算法)。随机森林的优缺点如下:
1、优点
(1)高准确性:随机森林通常在各种数据集上都能取得较好的预测性能。
(2)并行处理:随机森林可以并行构建决策树,提高训练速度。
(3)易于使用:随机森林算法相对简单,易于实现和理解。
(4)可处理高维数据:随机森林能够有效地处理具有大量特征的数据集。
(5)抗过拟合能力强:由于集成了多棵树,随机森林通常具有较低的过拟合风险。
2、缺点
(1)预测速度慢:由于需要集成多棵树的预测,不进行并行运算的话,随机森林的预测速度可能较慢。
(2)内存消耗大:随机森林需要存储多棵树,因此内存消耗较大。
(3)对噪声数据敏感:随机森林可能会过度拟合噪声数据,尤其是在特征数量较少时。
(4)可能欠拟合:如果树的数量太少或者树的深度太浅,随机森林可能会欠拟合。
更多推荐
所有评论(0)