如何执行引导验证?

数据挖掘 机器学习 深度学习 数据挖掘 预测建模 采样
2022-02-21 15:53:14

我正在研究二进制分类问题。

我对火车数据进行了交叉验证和网格搜索。后来我在我的测试数据上验证了模型,如下所示

logreg=LogisticRegression(random_state=41)
logreg_cv=GridSearchCV(logreg,op_param_grid,cv=10,scoring='f1')
logreg_cv.fit(X_train_std,y_train)
y_pred = logreg_cv.predict(X_test_std)

但是我遇到了bootstrap validation关于如何使用它来避免由于拆分不平衡(在测试数据中)导致测试数据性能不佳的术语。

有人可以指导我什么是bootstrap validation以及如何实施吗?

2个回答

我不同意 Bootstrapping 通常优于使用单独的测试数据集进行模型评估。

首先,在这里区分模型选择和评估很重要。在“统计学习的要素”(1)中,作者将其表述如下:

模型选择:估计不同模型的性能以选择最佳模型。

模型评估:选择最终模型,估计其对新数据的预测误差(泛化误差)。

他们继续声明:

如果我们处于数据丰富的情况,解决这两个问题的最佳方法是将数据集随机分为三部分:训练集、验证集和测试集。训练集用于拟合模型;验证集用于估计模型选择的预测误差;测试集用于评估最终选择模型的泛化误差。理想情况下,测试集应保存在“保险库”中,仅在数据分析结束时取出。假设我们重复使用测试集,选择测试集误差最小的模型。那么最终选择的模型的测试集误差会低估真实的测试误差,有时甚至会大大低估。

与此一致,“机器学习 - 概率视角”(2)的作者写道:

通常我们将大约 80% 的数据用于训练集,将 20% 用于验证集。但是如果训练用例的数量很少,这种技术就会遇到问题,因为该模式没有足够的数据来训练,我们也没有足够的数据来对未来的性能做出可靠的估计。一个简单但流行的解决方案是使用交叉验证 (CV)

由于在模型选择中您正在比较不同的模型(给定技术甚至不同技术的不同超参数),因此预测误差估计的绝对水平并不那么重要。只要相对误差,即模型 A 与 B 的比较如何,被充分估计。相反,在评估最终模型时,您希望获得绝对预测误差的估计值。另请注意,在 Carlos Mougan 引用的文本中,作者写道

[...] 可以在这些实例上进行评估,而不需要单独的验证集。[...]”

即我们在这里谈论验证(模型选择)而不是测试(模型评估)。Cross-Validation 和 Bootstrapping 在模型选择(即估计验证误差)中更常见,但在模型评估(即估计测试误差)中不太常见。

总结一下:

  1. 当数据有限时,通常会应用交叉验证和引导
  2. 交叉验证和自举通常用于模型选择/验证错误的估计。它们在测试误差估计中不太常见。

然而,Bootstrapping 可用于估计验证甚至测试错误。至少有 3 种应用它的方法(我现在将提到“预测错误”,这可能意味着“验证错误”或“测试错误”,具体取决于您使用 Bootstrapping 的方式):

1. 简单的引导

你生产B通过随机选择为您的数据引导样本N(样本大小)重复的数据点。然后,您在每个 Bootstrap 样本上训练数据并计算整个数据集的预测误差。然后在所有 Bootstrap 样本中进行平均B. 由于预测误差是基于整个数据集,包括。Bootstrap 样本中的示例,这意味着训练数据也用于估计预测误差。这可能导致过度拟合。

2. 留一法引导

在这里,该方法类似于交叉验证:对于预测器fb^在 Bootstrap 样本上训练b预测误差是基于除 Bootstrap 样本中的示例之外的所有数据估计的b. (但是,这与交叉验证不同,因为 Bootstrap 样本是通过重复绘制产生的。)这种方式解决了过度拟合的问题,因为训练和预测误差估计是基于每个 bootstrap 样本的不同子数据集。

3. .632 引导程序

该方法使用 Leave-one-out Bootstrap 预测误差的线性组合errorleave-one-out和简单的训练错误errortraining

error.632=0.368errortraining+0.632errorleave-one-out

注意0.632是绘制 Bootstrap 样本时数据点的概率(xn,yn)该 Bootstrap 样本中包含来自总体人口的数据。对这个等式的一个非常随意的解释是,您使用的估计值介于测试误差和留一法 Bootstrap 误差之间,而后者的权重更大。

有关更多详细信息,我建议阅读“统计学习的要素 - 数据挖掘、推理和预测”(1) 中的第 7.11 节。


(1)《统计学习的要素——数据挖掘、推理和预测》;哈斯蒂等人;第二版

(2)《机器学习——概率视角》;墨菲;第一版

我只是要复制 Oreilly 的书 Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 2nd Edition:

使用 bagging,对于任何给定的预测器,某些实例可能会被采样多次,而其他实例可能根本不会被采样。默认情况下,BaggingClassifier 对 m 个训练实例进行替换(bootstrap=True),其中 m 是训练集的大小。这意味着对于每个预测变量,平均仅对大约 63% 的训练实例进行了采样。6 未采样的剩余 37% 的训练实例称为袋外 (oob) 实例。请注意,对于所有预测变量,它们不是相同的 37%。

由于预测器在训练期间永远不会看到 oob 实例,因此可以对这些实例进行评估,而无需单独的验证集。您可以通过平均每个预测器的 oob 评估来评估集成本身。

在 Scikit-Learn 中,您可以在创建 BaggingClassifier 时设置 oob_score=True 以请求训练后的自动 oob 评估。下面的代码演示了这一点。结果评估分数可通过 oob_score_ 变量获得:

from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier


>>> bag_clf = BaggingClassifier(
...     DecisionTreeClassifier(), n_estimators=500,
...     bootstrap=True, n_jobs=-1, oob_score=True)
...
>>> bag_clf.fit(X_train, y_train)
>>> bag_clf.oob_score_
0.90133333333333332

根据这个 oob 评估,这个 BaggingClassifier 在测试集上很可能达到 90.1% 左右的准确率。让我们验证一下:

>>> from sklearn.metrics import accuracy_score
>>> y_pred = bag_clf.predict(X_test)
>>> accuracy_score(y_test, y_pred)
0.91200000000000003