机器学习 | Scikit Learn中基于随机森林的OOB误差计算
随机森林是由多个决策树组成的集成机器学习模型。决策树是一种模型,它通过学习一系列基于数据特征的简单决策规则来进行预测。随机森林将多个决策树的预测组合在一起,以做出更准确、更稳健的预测。
随机森林通常用于分类和回归任务。在分类中,目标是预测类别标签(例如,“猫”或“狗”)。在回归中,目标是预测一个连续的目标变量(例如,房屋的价格)。
随机森林很受欢迎,因为它们很容易训练,可以处理高维数据,并且非常准确。它们还具有处理缺失值的能力,并且可以处理不平衡的数据集,其中某些类比其他类更普遍。
要训练随机森林,需要指定要使用的决策树的数量(n_estimators参数)和每棵树的最大深度(max_depth参数)。也可以指定其他超参数,例如分割节点所需的最小样本数和叶节点所需的最小样本数。
一旦训练好随机森林,你就可以用它来预测新数据。为了进行预测,随机森林使用各个决策树的预测,并使用多数投票或平均技术将它们组合起来。
OOB(out-of-bag)误差
OOB误差,全称为“out-of-bag”误差,是评估分类器性能的一种重要指标。具体来说,它用于衡量分类器在未知数据上的预测能力,可以帮助了解模型在实际应用中的表现。OOB误差率越低,说明分类器性能越好。
在Bagging方法中,Bootstrap每次约有1/3的样本不会出现在Bootstrap所采集的样本集合中,这些没有参与决策树建立的数据被称为袋外数据(OOB)。这些数据可以用于取代测试集误差估计方法,对已经生成的模型进行性能评估。
OOB误差的计算方法如下:对于已经生成的随机森林,用袋外数据测试其性能。假设袋外数据总数为O,用这O个袋外数据作为输入,带进之前已经生成的随机森林分类器,分类器会给出O个数据相应的分类。因为这O条数据的类型是已知的,所以用正确的分类与随机森林分类器的结果进行比较,统计随机森林分类器分类错误的数目,设为X,则袋外数据误差大小=X/O。这种误差大小的计算已经经过证明是无偏估计的,所以在随机森林算法中不需要再进行交叉验证或者单独的测试集来获取测试集误差的无偏估计。
降低OOB误差率的方法有多种,例如增加训练数据量、调整模型参数、使用更复杂的模型等。这些方法可以帮助提高分类器在未知数据上的预测能力,从而降低OOB误差率。
总的来说,OOB误差是一种重要的评估指标,它不仅可以用于评估分类器的性能,还可以用于选择最佳模型。同时,通过降低OOB误差率,可以进一步提高分类器的预测能力,使其在实际应用中表现更好。
随机森林中OOB误差计算
在随机森林算法中,每个决策树都是在随机抽取的训练子集上构建的,这意味着每个决策树都没有使用到所有的训练数据。具体来说,由于使用了Bootstrap抽样(有放回的抽样),大约37%的训练数据在每次抽样中都不会被选中,这些数据被称为袋外数据(Out-of-Bag, OOB)。
利用这些袋外数据,我们可以评估随机森林模型的性能,而不需要额外的验证集或测试集。这就是OOB误差估计的概念。
以下是计算随机森林中OOB误差的基本步骤:
-
构建随机森林:首先,你需要构建一个随机森林模型。这通常涉及到指定决策树的数量、每个决策树的最大深度、分裂节点的最小样本数等参数。
-
收集袋外数据:在构建每棵决策树时,记录那些没有被用于训练该棵树的样本(即袋外数据)。
-
预测袋外数据:使用每棵决策树对相应的袋外数据进行预测。由于每棵决策树都没有使用到这些袋外数据,因此这些预测是独立的。
-
多数投票:对于每个样本,随机森林模型会基于所有决策树的预测结果进行多数投票。即,如果多数决策树将某个样本分类为某一类别,则该样本的最终预测类别就是那一类。
-
计算误差:比较每个样本的预测类别与其真实类别。如果预测错误,则增加错误计数。最后,将错误计数除以总样本数(即袋外数据的数量),得到OOB误差率。
-
评估性能:OOB误差率可以作为随机森林模型性能的一个指标。通常,较低的OOB误差率意味着模型在未知数据上的预测能力较好。
实践示例
在scikit-learn库中,使用随机森林(RandomForestClassifier或RandomForestRegressor)时,OOB误差是自动计算的。你可以通过访问模型对象的oob_score_属性来获取OOB误差的估计值。以下是一个使用随机森林分类器并计算OOB误差的示例:
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification
# Generate random data
X, y = make_classification(n_samples=1000,
n_features=10,
n_informative=5,
n_classes=2,
random_state=0)
# Create a random forest
# classifier and fit it to the data
clf = RandomForestClassifier(n_estimators=100,
oob_score=True,
random_state=0)
clf.fit(X, y)
# Obtain the OOB error
oob_error = 1 - clf.oob_score_
# Print the OOB error
print(f'OOB error: {oob_error:.3f}')
输出
OOB error: 0.042
这段代码将创建一个随机森林分类器,将其拟合到数据中,并使用oob_score_ attribute获取OOB误差。oob_score_ attribute只有在创建分类器时将oob_score参数设置为True时才可用。
OOB误差用例
以下是OOB误差的一些主要用例:
-
模型性能评估:
OOB误差是一种无偏估计,可以用来评估随机森林模型的性能。由于它不需要额外的验证集或测试集,因此可以更方便地评估模型在未知数据上的预测能力。通过比较OOB误差和其他模型的评估指标,可以更容易地选择出性能最佳的模型。 -
特征选择:
OOB误差也可以用于特征选择过程。通过随机添加噪声到OOB数据的每个特征,并计算添加噪声前后的误差变化,可以评估每个特征对模型性能的影响。特征的重要性可以通过这种方式进行排序,从而帮助优化特征集,提高模型的预测能力。 -
模型参数调优:
在构建随机森林模型时,通常需要调整一些参数,如决策树的数量(n_estimators)、树的最大深度(max_depth)、分裂节点的最小样本数(min_samples_split)等。通过比较不同参数设置下的OOB误差,可以选择出最优的参数组合,以优化模型的性能。 -
模型泛化能力评估:
OOB误差是随机森林泛化误差的一个无偏估计,它的结果近似于需要大量计算的k折交叉验证。通过比较OOB误差和测试集上的误差,可以评估模型的泛化能力,即模型在未见过的数据上的表现。 -
早期停止训练:
在训练过程中,可以通过监控OOB误差的变化来决定是否提前停止训练。如果OOB误差在连续几个迭代中都没有显著下降,那么这可能意味着模型已经过拟合,此时可以选择停止训练以避免过拟合。
总之,OOB误差是随机森林算法中一个非常有用的工具,它不仅可以用来评估模型的性能,还可以用于特征选择、参数调优、泛化能力评估和早期停止训练等多个方面。