【问题标题】:How to split train data and validation data properly in K fold cross validation如何在 K 折交叉验证中正确拆分训练数据和验证数据
【发布时间】:2022-01-16 04:31:56
【问题描述】:

首先,作为一个不会说英语的人,我正在使用翻译来解决我的问题。如果句子笨拙且难以阅读,请您谅解。

我尝试通过 Kfold 交叉验证来学习数据。但是,在为 kfold 划分训练数据的过程中会出现连续的错误。以下代码是我的数据集。

df_test = df_data.iloc[50001:, :] #Test set
df_use = df_data.iloc[0:50000, :] #Training set
    
x_test = df_test.drop(['upgraded'], axis = 1)
y_test = df_test['upgraded']
    
x = df_use.drop(['upgraded'], axis = 1)
y = df_use['upgraded']

而且每次我尝试拆分训练数据和验证数据时,都会出现错误。

for train_ix, val_ix in kfold.split(x):

    trainX, trainy = x[train_ix], y[train_ix]
    valX, valy = x[val_ix], y[val_ix]


    model, val_acc = evaluate_model(trainX, trainy, valX, valy)

我不确定这是否会有所帮助,但是当我使用此代码时,trainX, trainy = x[train_ix], y[train_ix] 会出现此错误消息。

KeyError: "没有 [Int64Index([10000, 10001, 10002, 10003, 10004, 10005, 10006, 10007, 10008,\n 10009,\n ...\n 49990, 49991, 49992, 49993, 499 , 49995, 49996, 49997, 49998,\n 49999],\n dtype='int64', length=40000)] 在[列]"

所以我像这样切换了代码。

for train_ix, val_ix in kfold.split(x):

  trainX, valX = x.iloc[train_ix], x.iloc[val_ix]
  trainy, valy = y.iloc[train_ix], y.iloc[val_ix]

model, val_acc = evaluate_model(trainX, trainy, valX, valy)

这一次,model, val_acc = evaluate_model(trainX, trainy, valX, valy) 这个代码得到了错误。

IndexError:索引 -9223372036854775808 超出轴 1 的范围,大小为 2

所以我也尝试了这段代码。 (我用 train_test_split 对 df_use 进行了切片。)出现相同的索引错误。

inputs = np.concatenate((x_train, x_val), axis=0)
targets = np.concatenate((y_train, y_val), axis=0)

我想以正确的方式拆分和放置数据,以便 kfold 交叉验证模型识别我的数据并可以运行模型。如果有人提供帮助会非常有帮助。

【问题讨论】:

    标签: python regression cross-validation ensemble-learning k-fold


    【解决方案1】:

    你可以试试下面的

    from sklearn.model_selection import KFold
    
    df_test = df_data.iloc[50001:, :] #Test set
    df_use = df_data.iloc[0:50000, :] #Training set
        
    y_test = df_test['upgraded']
    x_test = df_test.drop(['upgraded'], axis = 1)
        
    y = df_use['upgraded']
    x = df_use.drop(['upgraded'], axis = 1)
    
    kf = KFold(n_splits=2)
    
    for train_index, test_index in kf.split(x):
        trainX, valX = x.take(list(train_index),axis=0), x.take(list(test_index),axis=0)
        trainy, valy = y.take(list(train_index),axis=0), y.take(list(test_index),axis=0)
    model, val_acc = evaluate_model(trainX, trainy, valX, valy)
    

    我希望这有效。 如果遇到任何问题,请在下方评论。

    【讨论】:

    • 您好,首先感谢您的回答。我尝试了您的代码,但不幸的是,当我使用您的代码时,出现了与我在问题中提到的相同的关键错误。我不得不将x[train_index] 改为x.iloc[train_index]。 (全部)但同样的索引错误出现在这段代码中......model, val_acc = evaluate_model(trainX, trainy, valX, valy)
    • 你好,出错的地方已经改了,请试一下。
    • 哦,对不起。似乎在未初始化现有运行时修改代码时发生了错误。因此,按照您的建议,在初始化运行时之后,我尝试了您给我的代码,它仍然有相同的错误 IndexError: index -9223372036854775808 is out of bounds for axis 1 with size 2 in @987654325 @。添加以防万一,我的数据有 12 个解释变量、1 个因变量和 75000 行。
    猜你喜欢
    • 2018-05-03
    • 2020-09-14
    • 1970-01-01
    • 2016-05-12
    • 2018-06-22
    • 2018-12-07
    • 1970-01-01
    • 2020-12-05
    • 2020-08-29
    相关资源
    最近更新 更多