梯度提升 - 极端预测与接近 0.5 的预测

机器算法验证 分类 大车 助推
2022-03-16 05:39:24

假设您在两个不同的数据集上训练了两个不同的梯度提升分类器模型。您使用留一法交叉验证,并绘制两个模型输出的预测直方图。直方图如下所示: 在此处输入图像描述

和这个:

在此处输入图像描述

因此,在一种情况下,预测(在样本外/验证集上)大多是极端的(接近 0 和 1),而在另一种情况下,预测接近 0.5。

如果有的话,可以从每个图表中推断出什么?怎么能解释这种差异?关于数据集/特征/模型可以说什么吗?

我的直觉是,在第一种情况下,特征可以更好地解释数据,因此模型可以更好地拟合数据(并且可能会过度拟合,但不一定——如果特征实际上很好地解释了数据)。在第二种情况下,特征不能很好地解释数据,因此模型与数据的拟合度不太高。然而,这两个模型在精确度和召回率方面的表现可能仍然相同。那会是正确的吗?

4个回答

我准备了一个简短的脚本来展示我认为应该是正确的直觉。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn import ensemble
from sklearn.model_selection import train_test_split


def create_dataset(location, scale, N):
    class_zero = pd.DataFrame({
        'x': np.random.normal(location, scale, size=N),
        'y': np.random.normal(location, scale, size=N),
        'C': [0.0] * N
    })

    class_one = pd.DataFrame({
        'x': np.random.normal(-location, scale, size=N),
        'y': np.random.normal(-location, scale, size=N),
        'C': [1.0] * N
    })
    return class_one.append(class_zero, ignore_index=True)

def preditions(values):
    X_train, X_test, tgt_train, tgt_test = train_test_split(values[["x", "y"]], values["C"], test_size=0.5, random_state=9)
    clf = ensemble.GradientBoostingRegressor()
    clf.fit(X_train, tgt_train)
    y_hat = clf.predict(X_test)
    return y_hat

N = 10000
scale = 1.0
locations = [0.0, 1.0, 1.5, 2.0]

f, axarr = plt.subplots(2, len(locations))
for i in range(0, len(locations)):
    print(i)
    values = create_dataset(locations[i], scale, N)

    axarr[0, i].set_title("location: " + str(locations[i]))

    d = values[values.C==0]
    axarr[0, i].scatter(d.x, d.y, c="#0000FF", alpha=0.7, edgecolor="none")
    d = values[values.C==1]
    axarr[0, i].scatter(d.x, d.y, c="#00FF00", alpha=0.7, edgecolor="none")

    y_hats = preditions(values)
    axarr[1, i].hist(y_hats, bins=50)
    axarr[1, i].set_xlim((0, 1))

脚本的作用:

  • 它创建了不同的场景,其中两个类逐渐变得越来越可分离——我可以在这里提供一个更正式的定义,但我想你应该得到直觉
  • 它在测试数据上拟合一个 GBM 回归器,并将预测值输出给训练模型

生成的图表显示了每个场景中生成的数据的外观,并显示了预测值的分布。解释:缺乏可分离性意味着预测的等于或正好在 0.5 左右。y

所有这些都显示了直觉,我想以更正式的方式证明这一点应该不难,尽管我将从逻辑回归开始——这将使数学变得更容易。

图1


编辑 1

我猜在最左边的例子中,两个类是不可分离的,如果你设置模型的参数来过度拟合数据(例如深度树,大量的树和特征,相对较高的学习率),你仍然会得到预测极端结果的模型,对吗?换句话说,预测的分布表明模型最终拟合数据的接近程度?

假设我们有一个超深的决策树。在这种情况下,我们会看到预测值的分布在 0 和 1 处达到峰值。我们还会看到较低的训练误差。我们可以使训练误差任意小,我们可以让深度树过度拟合到树的每个叶子对应于训练集中的一个数据点,并且训练集中的每个数据点对应于树中的一个叶子的点。在训练集上非常准确的模型在测试集上表现不佳,这是过度拟合的明显迹象。请注意,在我的图表中,我确实展示了对测试集的预测,它们提供的信息要多得多。

另一个注意事项:让我们使用最左边的示例。让我们在圆圈上半部分的所有 A 类数据点和圆圈下半部分的所有 B 类数据点上训练模型。我们将有一个非常准确的模型,预测值的分布在 0 和 1 处达到峰值。测试集上的预测(下半圆中的所有 A 类点,上半圆中的 B 类点)也将是在 0 和 1 达到峰值——但它们是完全不正确的。这是一些令人讨厌的“对抗性”训练策略。尽管如此,总而言之:分布在可分离程度上有所不同,但这并不是真正重要的。

首先,我建议使用一个数据集而不是两个数据集来探索输出概率预测。原因很简单:如果我们更改数据,没人知道会发生什么。正如@IcannotFixThis 的答案中所演示的,如果数据从重叠变为更可分离,完全相同的模型将具有不同的概率输出。


如果我们坚持要谈论两个不同的数据集,从有限的信息来看,我们只能说“极端预测”可能意味着模型过度拟合/数据对于模型来说过于“简单”

预测通常取决于您的模型。决策树通常会产生相当“校准”的输出,几乎可以解释为概率。例如,有些人喜欢 SVM,但不喜欢。但这也高度依赖于过拟合/欠拟合。或者关于功能的数量(不,它不一定要“更好”)。实际上,如果这是一个类,那么第一个可能会过度拟合。

但首先要做的事情是:你的其他班级在哪里?在您进行预测时,您应该始终绘制两个类(使用不同的颜色)。从一个班级的预测来看,你不能说太多。

如果您想衡量性能并得出关于从特征中学到了多少的结论,请使用 ROC AUC 这样的分数,其中事件的顺序很重要,而不是分布。如果您打算使用分布,您可以查看概率校准方法(或阅读哪些分类器无论如何都能产生良好的校准)。它们并不完美,但旨在将预测转化为概率(因此赋予输出意义)。

第一种情况可能是由于训练数据的过度拟合。样本内和样本外的性能还取决于您使用的评估指标(或适用于问题)。除了比较指标之外,还可以尝试检查混淆矩阵以检查错误分类。

使用logloss等指标并引入正则化参数可能是另一种选择。(查看XGBoost - 它允许添加 alpha、beta 正则化参数。)