在 python 中尝试交叉验证时出错

Posted

技术标签:

【中文标题】在 python 中尝试交叉验证时出错【英文标题】:Error when attempting cross validation in python 【发布时间】:2017-12-26 17:54:38 【问题描述】:

我目前正在尝试使用线性回归实现交叉验证。线性回归有效,但是当我尝试交叉验证时出现此错误:

TypeError: only integer scalar arrays can be converted to a scalar index

我在代码的第 5 行收到此错误。

这是我的代码:

for train_index, test_index in kf.split(X):
    print("TRAIN:", train_index, "TEST:", test_index)
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    linreg.fit(X_train, Y_train)
    # p = np.array([linreg.predict(xi) for xi in x[test]])
    p = linreg.predict(X_test)
    e = p-Y_test
    xval_err += np.dot(e,e)

rmse_10cv = np.sqrt(xval_err/len(X_train))

有人可以帮我解决这个问题吗?

提前致谢!

【问题讨论】:

你能上传你的数据吗? 您能否提供您的导入和任何相关定义,以便我们解析kf.splitlinreg.fit 【参考方案1】:

您的代码存在一些问题。

在第 5 行 Y_train 未定义。我想你想要小写的y_train

同样你想要e = p-y_test 在第 8 行。

rmse_10cv = np.sqrt(xval_err/len(X_train)) 中,X_train 是在您的循环中定义的,因此它将采用循环最后一次迭代的值。观察您的输出,在哪里打印每个折叠的训练指数,以确保 X_train 的长度始终相同,否则您对 rmse_10cv 的计算将无效。

我使用我描述的修复程序和循环前的以下内容运行了您的代码:

import numpy as np
from sklearn.model_selection import KFold
from sklearn.linear_model import LinearRegression
X = X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
y = np.array([1, 2, 3, 4])
kf = KFold(n_splits=2)
linreg = LinearRegression()
xval_err = 0

我没有收到任何错误。

【讨论】:

以上是关于在 python 中尝试交叉验证时出错的主要内容,如果未能解决你的问题,请参考以下文章

应用分层10折交叉验证时如何在python中获取所有混淆矩阵的聚合

K折交叉验证实现python

sklearn中的交叉验证+决策树

机器学习基础:(Python)训练集测试集分割与交叉验证

交叉验证、留一交叉验证、自助法

字符串python列表上的Kfold交叉验证和SVM