交叉验证后模型性能恶化

数据挖掘 逻辑回归 交叉验证 特征缩放
2021-09-20 22:49:03

我正在仅具有数字特征的数据集上训练逻辑回归模型。我执行了以下步骤:-

1.)热图以消除变量之间的共线性

2.) 使用 StandarScaler 进行缩放

3.) 对于我的基线模型,拆分后的交叉验证

4.) 拟合和预测

以下是我的代码: -

# SPLITTING 
train_x, test_x, train_y, test_y = train_test_split(data2, y, test_size = 0.2, random_state = 
69)

#MODEL INSTANCE
model = LogisticRegression(random_state = 69)

# SCALING
train_x2 = train_x.copy(deep = True)
test_x2 = test_x.copy(deep = True)

s_scaler = StandardScaler()
s_scaler.fit(train_x2)
s_scaled_train = s_scaler.transform(train_x2)
s_scaled_test = s_scaler.transform(test_x2)

# BASELINE MODEL
cross_val_model2 = -1 * cross_val_score(model, s_scaled_train, train_y, cv = 5,
                              n_jobs = -1, scoring = 'neg_mean_squared_error')
s_score = cross_val_model2.mean()

# FITTING AND PREDICTING
model.fit(s_scaled_train, train_y)
pred = model.predict(s_scaled_test)
mse = mean_squared_error(test_y, pred)

CV 分数为0.06,拟合预测后的分数为0.23我觉得这很奇怪,因为 CV 是衡量模型执行情况的指标。所以我至少应该得到一个等于 CV 分数的分数,对吧?

3个回答

只有 210 个样本,差异可能是由于您的训练数据和测试数据不是来自相同的基础分布。也就是说,使用holdout-CV 来估计如此小的数据集上的模型性能可能会受到拆分数据的方式的影响。您可以通过使用不同的训练/测试拆分重新运行管道来测试这一点,看看结果是否不同。

相反,对于小型数据集,我建议应用嵌套的 k-fold CV您可以阅读更多信息,例如,使用交叉验证进行模型选择时的误差估计偏差在这里你可以在 scikit learn 中找到一个实现。

还有几点:

  • 对于 MSE 或任何误差度量,该值与数据相关。这意味着人们无法知道 0.06 和 0.23 之间的差异代表什么:这种差异可能非常大或非常小,这完全取决于目标的分布。
  • 正如 Sammy 所提到的,数据的小尺寸可能会根据拆分导致很大的变化。为了理解差异,观察 CV 折叠的性能变化会很有用,例如通过计算标准偏差:如果变化很大,则模型不稳定,这可以解释高差异。

这里没有专家,所以不要把我的话放在心上,但我可以想到两个原因。首先,CV如果分成太多部分,不能正常工作(基本上取决于数据大小),甚至会导致过度拟合。其次,您使用的指标:mean_squared_error 不一定会向您显示我们大多数人想要的结果(我不知道您是否是这种情况)。尝试使用 R2 分数,可能会给您不同的结果。祝你好运!希望这会有所帮助