对回归算法应用交叉验证

数据挖掘 线性回归 交叉验证
2022-03-12 10:34:32

我们如何在线性回归上应用 K 折交叉验证?回归包含权重更新和迭代,那么我们是否将 K-fold 集成到它?

如果完成,是否像我们使用线性回归训练第一个 K-1 折叠并执行迭代以获得权重,然后进行下一个折叠并继续进行相同的操作,依此类推,直到完成所有折叠并选择最佳权重折叠从中?

2个回答

如何在回归中使用交叉验证(假设为 10 倍):将数据集分成 10% 和 90%,在 90% 上进行训练,在剩余的 10 上测试指标(平方误差或您正在建模的任何内容) %。使用不同的 10% 组做 10 次。现在您有 10 个指标,您可以分析其均值和范围,以查看模型是否对过度拟合具有鲁棒性。

如何选择模型:在整个数据集上进行训练。交叉验证用于测试/验证目的,您不使用交叉验证生成的模型。

让我们假设您有一个数据集D. 我们首先将该数据集拆分为训练数据集Dtraining和一个Dvalidation. 对于交叉验证,我们只使用训练数据集Dtraining. 该数据集分为k-折叠Dtraining,1,Dtraining,2, ...,Dtraining,K.

让我们考虑多项式的阶数M=1,,Mmax作为超参数范围。

M=1: 采用K1这些折叠以确定模型的参数并使用剩余的数据集进行验证。对于回归,我们经常使用误差平方和的平均值MSE. 正如我们所能做的K在这些计算中,我们将获得K误差平方和的平均值MSE. 通常是这些平方误差的平均值MSE¯M=1用作验证质量的衡量标准。

然后设置M=2,...,Mmax获得MSE¯M=2, ... ,MSE¯M=Mmax.

最后,选择价值M为此MSE¯是最小的。然后使用这个顺序来确定全训练数据集上的参数Dtraining并在验证集上验证Dvalidation.


在伪代码/python 中

import numpy as np
Initialize dataset $\mathcal{D}$
Initialize the ratio training to validation
Initialize k (the number of folds)
Initialize M_min (the maximum value for the hyperparameter)
Initialize M_max (the maximum value for the hyperparameter)
Initialize array M_values = np.arange(M_min, M_max + 1)
Initialize array MSE_values = np.arange([0] * M_values.size)  
Split the dataset in D_train and D_validation.
Split the training dataset in K folds
for M in M_values:
    Initialize means squared error MSE = 0
    for k in range(1, K + 1):
         Determine data set D_crossval = D_train \ D_train_k
         Determine model for M and D_crossval
         Evaluate model MSE_crossval
         MSE += MSE_crossval
    MSE /= M_values.size 
    MSE_values[M-M_min] = MSE 
M_best = np.argmin(MSE_values) + M_min
print('M_best ={}'.format(M_best))

Determine model for M_best and D_train
Evaluate model on D_validation