计算多元线性回归的交叉验证

Compute cross validation for multi-variate linear regression

我正在为一个回归问题训练不同的模型。因为我想在选择之间找到最佳模型,所以我想执行 k = 20 的交叉验证,以表征模型的 MSE,并统计确定它们之间哪个模型更好。 该问题有多个因变量,我想分别为两个因变量确定 MSE,但 cross_val_score 不允许我明确地这样做。 这是我的一个模型的一些示例代码:

from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold
from sklearn.metrics import mean_squared_error

model = LinearRegression()

model.fit(x, y)

y_pred = model.predict(x_test)

mse = mean_squared_error(scaler2.inverse_transform(y_test), scaler2.inverse_transform(y_pred), multioutput="raw_values")

我如何在k次交叉验证中对k个训练和测试的模型对应的k次进行迭代训练? Scikit 提供了一个 Kfold 但它只是一种指定折叠次数的方法,它实际上并没有 returns 训练和测试折叠,所以我想不出一种使用 kfold 交叉验证理论实际训练不同模型的方法.另外,我需要对每个因变量单独评估 MSE,因为它是一个多元回归问题

您可以通过简单的 for 循环使用 Scikit Learn KFold 交叉验证。

这是一个在 bayes 分类器 上测试 5 折交叉验证的示例:

from sklearn.model_selection import KFold

k = 5
kf = KFold(n_splits=k)

res = []
for train_index , test_index in kf.split(X_train_concat):
    X_train_kf , X_test_kf = X_train_concat[train_index,:],X_train_concat[test_index,:]
    y_train_kf , y_test_kf = y_train_concat[train_index] , y_train_concat[test_index]
    
    X_train = np.append(X_train_concat, np.reshape(y_train_concat, (len(y_train_concat),1)), axis=1)
    W_bayes = trainBayes(X_train)
    y_pred = predict(X_test_kf, W_bayes)
    
    mis_classification = len(y_pred)-np.count_nonzero(y_pred == y_test_kf)
    e = (mis_classification / y_test_kf.shape[0]) * 100

    res.append(e)

avg_res = sum(res)/k
print('Result of each fold - {}'.format(res))
print('Avg result : {}'.format(avg_res))

更多检查this