原力注入

动手学机器学习随机森林算法

动手学机器学习随机森林算法

  1. 动手学机器学习朴素贝叶斯算法

  2. 动手学机器学习逻辑回归算法

  3. 动手学机器学习支持向量机

  4. 动手学线性回归算法

  5. 动手学决策树算法

  6. KNN 算法简介

  7. 分类模型评估工具 - 混淆矩阵

一、随机森林算法定义

随机森林 ( Random Forest )是一种集成学习方法,它通过构建多个 决策树 ( Decision Tree )并将其结果进行整合,利用 降低方差 的策略提高模型的 泛化能力 ,从而减少 过拟合风险 。简单来说,随机森林就像是一个由许多棵决策树组成的 “森林”,每棵树都是独立生长的,最终的预测结果是综合所有树的输出得出的。 决策树是一种基本的机器学习模型,它通过一系列的特征判断条件,将数据划分到不同的叶节点,每个叶节点对应一个预测结果。然而,单一的决策树容易受到数据噪声和过拟合的影响,导致在新数据上的泛化能力较差。而随机森林通过集成多棵决策树,利用 “ 群体智慧 ” 来提高模型的鲁棒性和准确性。 随机森林的 主要特点 包括:
  • 首先,它在训练过程中引入了 随机性 ,不仅在选择训练样本时采用有放回的抽样( Bootstrap Sampling ),还在选择特征时进行随机采样,这使得每棵树在生长过程中都具有独特的视角,降低了树之间的相关性,从而提高了集成模型的多样性。
  • 其次,随机森林既可以用于 分类任务 ,也可以用于 回归任务 ,在分类任务中,通过多数投票法确定最终类别;在回归任务中,则通过对各棵树的预测结果求平均来得到最终预测值。
  • 最后,随机森林具有处理高维数据和大量特征的能力,能够自动筛选出对预测最有用的特征,这对于实际应用中复杂的数据集具有很大的优势。

二、随机森林的优缺点

(一)优点

  1. 高准确性 :通过集成多棵决策树的预测结果,显著提高了模型的整体性能。
  2. 抗过拟合 :随机采样样本和特征降低了模型对噪声的敏感性。
  3. 处理高维数据 :自动进行特征选择,适用于包含大量特征的数据集。
  4. 支持多种任务 :适用于分类和回归任务,且无需复杂的预处理。

(二)缺点

  1. 训练时间较长 :树的数量增加时,计算资源消耗较大。
  2. 可解释性差 :相比单一决策树,集成模型的预测逻辑更复杂。
  3. 内存占用高 :存储多棵决策树需要较大的内存空间。

三、随机森林的数学原理

(一)决策树的构建

决策树的构建过程是随机森林算法的基础,其核心在于如何选择最优的特征和分裂点,以使数据在子节点上的纯度尽可能高。常见的分裂准则包括 基尼不纯度 (Gini Impurity)和 信息增益 (Information Gain)。 基尼不纯度衡量的是一个数据集的混乱程度,其计算公式为: 其中, 表示数据集, 是类别总数, 是第 类样本在数据集 中所占的比例。基尼不纯度的值越小,表示数据集的纯度越高。在选择特征进行分裂时,我们希望找到一个特征,使得分裂后的子数据集的基尼不纯度总和最小。假设数据集 根据特征 的某个取值进行分裂,得到子数据集 和 ,则分裂后的基尼不纯度为: 我们的目标就是找到使 最小的特征 和分裂点。 信息增益则是基于信息熵的概念,其计算公式为: 其中, 表示数据集 的信息熵,定义为: 是特征 的可能取值个数, 是数据集 中特征 取第 个值的子集。信息增益越大,表示通过特征 进行分裂后,数据集的纯度提升越多,因此我们选择信息增益最大的特征作为分裂特征。

(二)随机森林的训练过程

随机森林的训练过程主要包括以下步骤:
    • 从原始训练数据集 有放回地 随机抽取与原数据集同样大小的样本,构造多个训练子集 。
    • 由于是 有放回抽样 ,每个 可能包含重复样本,也可能遗漏一些样本。
    • 未被选中的样本称为“袋外样本”(OOB, Out-of-Bag) ,可以用于模型的评估,计算 OOB 误差 (对每个样本,用未包含它的树预测结果计算整体误差)。
    1. Bootstrap 采样
    • 分类任务 :特征子集大小 ≈
    • 回归任务 :特征子集大小 ≈
    • 在构建每棵树时, 每次分裂节点 均从全部特征中随机选择一个子集,然后从中选择最优特征进行分裂。
    • 经验法则:
    • 这个随机特征选择机制降低了单棵树的相关性,提高了模型的泛化能力。
    1. 随机特征选择
    • 最大深度 ( max_depth )
    • 叶子节点的最小样本数 ( min_samples_leaf )
    • 分裂节点的最小样本数 ( min_samples_split )
    • 每棵树基于所选的 Bootstrap 训练集和随机特征子集进行生长,直到满足某些停止条件:
    • 随机森林中的决策树通常不会剪枝 ,以确保最大的信息保留。
    1. 决策树生长
    • 分类任务 :使用 多数投票法 ,统计所有树的预测类别,选择出现次数最多的类别。
    • 回归任务 :取所有树预测值的 简单平均 作为最终结果(加权平均需特殊场景支持)。
    1. 集成与预测

(三)随机森林的预测过程

如前文所述,在分类任务中,随机森林的预测过程是基于 多数投票法 。假设我们有 棵决策树,每棵树对样本 的预测类别为 ( ),则随机森林的最终预测类别 可表示为: 其中, 是指示函数,当 时取值为 1,否则为 0。即统计每类被预测的次数,选择次数最多的类别作为最终预测结果。 在回归任务中,随机森林的预测过程是对各棵树的预测结果求平均。设每棵树对样本 的预测值为 ,则随机森林的最终预测值 为: 通过这种集成方式,随机森林能够充分利用多棵决策树的预测能力,降低单一树的误差,提高整体模型的准确性和稳定性。

四、算法示例

(一)数据集介绍与预处理

为了更好地理解随机森林算法的实际应用,我们选择经典的 鸢尾花 (Iris)数据集作为示例。该数据集包含 150 个样本,分为 3 个类别( Setosa 、 Versicolor 、 Virginica ),每个类别有 50 个样本。每个样本具有 4 个特征:花萼长度( sepal length )、花萼宽度( sepal width )、花瓣长度( petal length )和花瓣宽度( petal width ),均为数值型数据,单位为厘米。 首先,我们需要加载数据集并进行一些基本的探索性数据分析,以便了解数据的分布和特征之间的关系。然后对数据进行预处理,包括划分训练集和测试集、特征标准化等操作。
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line# 导入必要的库import numpy as npimport pandas as pdfrom sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import StandardScalerfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.metrics import accuracy_score, classification_report, confusion_matrix# 加载鸢尾花数据集iris = load_iris()X = iris.data  # 特征数据y = iris.target  # 标签数据feature_names = iris.feature_namestarget_names = iris.target_names# 打印数据集的基本信息print("数据集描述:")print(iris.DESCR)# 打印前5个样本print("\n前5个样本:")print(pd.DataFrame(X[:5], columns=feature_names))# 打印每个类别的样本数量print("\n每个类别的样本数量:")print(pd.Series(y).value_counts())# 划分训练集和测试集,测试集占20%X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 特征标准化,使每个特征的均值为0,标准差为1scaler = StandardScaler()X_train = scaler.fit_transform(X_train)X_test = scaler.transform(X_test)

(二)随机森林模型的训练与评估

在完成数据预处理后,我们使用 Python 的 scikit-learn 库来构建随机森林分类器,并对模型进行训练和评估。
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line# 创建随机森林分类器,设置估计器数量为100rf_classifier = RandomForestClassifier(n_estimators=100, 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"\n模型准确率:{accuracy:.4f}")# 输出分类报告,包括精确度、召回率、F1分数等指标print("\n分类报告:")print(classification_report(y_test, y_pred, target_names=target_names))# 输出混淆矩阵,直观展示分类结果print("\n混淆矩阵:")print(confusion_matrix(y_test, y_pred))

(三)模型优化与调参

为了进一步提高模型的性能,我们可以对随机森林的超参数进行优化。常见的超参数包括估计器数量(n_estimators)、最大深度(max_depth)、最小分裂样本数(min_samples_split)等。通过使用网格搜索(Grid Search)或随机搜索(Random Search)等方法,我们可以找到最优的参数组合。
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(linefrom sklearn.model_selection import GridSearchCV# 定义参数网格param_grid = {    'n_estimators': [50, 100, 200],    'max_depth': [None, 10, 20, 30],    'min_samples_split': [2, 5, 10]}# 创建网格搜索对象,使用5折交叉验证grid_search = GridSearchCV(estimator=RandomForestClassifier(random_state=42), param_grid=param_grid, cv=5, n_jobs=-1)# 在训练集上进行网格搜索grid_search.fit(X_train, y_train)# 输出最优参数组合和对应的最佳得分print(f"\n最优参数组合:{grid_search.best_params_}")print(f"最佳交叉验证得分:{grid_search.best_score_:.4f}")# 使用最优参数重新训练模型best_rf = grid_search.best_estimator_best_rf.fit(X_train, y_train)# 在测试集上评估最优模型y_pred_best = best_rf.predict(X_test)accuracy_best = accuracy_score(y_test, y_pred_best)print(f"\n最优模型在测试集上的准确率:{accuracy_best:.4f}")

(四)模型应用与案例分析

通过上述步骤,我们已经训练并优化了一个随机森林分类器,可以将其应用于实际的鸢尾花分类任务中。例如,我们可以输入一个新的样本数据,预测其所属的类别。
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line# 假设有一个新的样本,其特征为:花萼长度=5.1,花萼宽度=3.5,花瓣长度=1.4,花瓣宽度=0.2new_sample = [[5.1, 3.5, 1.4, 0.2]]# 对新样本进行特征标准化new_sample_scaled = scaler.transform(new_sample)# 使用最优模型进行预测predicted_class = best_rf.predict(new_sample_scaled)predicted_class_name = target_names[predicted_class][0]print(f"\n新样本的预测类别:{predicted_class_name}")
在实际应用中,随机森林算法还可以用于更多的场景,如客户流失预测、疾病诊断、图像识别等。通过对不同数据集的分析和处理,我们可以根据具体问题调整模型的参数和结构,以获得最佳的预测效果。

五、总结

随机森林算法作为一种强大的集成学习方法,在处理各种类型的机器学习任务时展现出了卓越的性能。它通过构建多个决策树并综合其预测结果,有效地提高了模型的准确性和泛化能力,同时避免了单一决策树容易过拟合的问题。 然而,随机森林算法也并非完美无缺。它的一个主要缺点是相比于单一决策树,模型的训练时间和内存占用会随着树的数量增加而增大,尤其在处理大规模数据集时可能会面临效率问题。此外,由于其 “黑箱” 特性,模型的可解释性相对较差,难以直观地理解每个特征对预测结果的具体贡献,这在某些需要高度可解释性的领域(如医疗、金融等)可能会受到一定的限制。

六、附录 - OOB Error 计算公式

在随机森林算法中, 袋外误差 ( Out-of-Bag Error , OOB Error )是一种用于评估模型性能的方法,它利用了在 Bootstrap 采样过程中未被选中的样本(即袋外样本)。 OOB 误差的计算公式可以表示如下: 假设随机森林中有 棵决策树,对于每个样本 ,有 棵树的袋外样本中不包含 。这些树对 进行预测,记为 (分类任务)或 (回归任务)。 ###(1)分类任务的 OOB 误差计算公式 对于分类任务,OOB误差是所有样本的误分类率的平均值: 其中:
  • 是总样本数;
  • 是树的总数;
  • 是第 棵树的训练子集;
  • 是指示函数,若样本 不在第 棵树的训练子集 中则为1,否则为0;
  • 是指示函数,若第 棵树对样本 的预测类别与真实类别 不同则为1,否则为0。
###(2)回归任务的 OOB 误差计算公式 对于回归任务,OOB误差通常使用均方误差(MSE)来计算: 其中:
  • 是总样本数;
  • 是树的总数;
  • 是第 棵树的训练子集;
  • 是指示函数,若样本 不在第 棵树的训练子集 中则为1,否则为0;
  • 是第 棵树对样本 的预测值;
  • 是样本 的真实值。
通过计算每个样本在所有将其作为袋外样本的树上的预测误差,再对所有样本取平均,即可得到随机森林的 OOB误差 。这种方法无需单独的验证集,能够在模型训练过程中同时进行性能评估,提高了数据的利用效率。