使用KFold拆分以适合模型返回“不在索引中”

时间:2018-12-11 09:07:46

标签: python pandas cross-validation

我有一个这样的数据框:

    Col1    Col2    
10   1        6         
11   3        8        
12   9        4        
13   7        2
14   4        3
15   2        9
16   6        7
17   8        1
18   5        5

我想使用KFold交叉验证来拟合我的模型并做出预测。

for train_index, test_index in kf.split(X_train, y_train):

    model.fit(X[train_index], y[train_index])
    y_pred = model.predict(X[test_index])

此代码生成以下错误:

  

“ [1 2 4 7]不在索引中”

我看到在KFold.split()之后,train_index和test_index不使用数据帧的实际索引号。

所以我无法适应我的模型。

有人知道吗?

1 个答案:

答案 0 :(得分:1)

据我所知,您数据框的索引从10开始而不是从0开始,并且正如您所说的那样,从sklearn拆分的索引使用从0开始的索引。一种解决方案是使用:

df = df.reset_index(drop=True)

另一种解决方案是在数据框上使用.iloc,这样看起来(假设y是一个数组,如果它是一个数据框,则也必须在其中使用.iloc)。

for train_index, test_index in kf.split(X_train, y_train):
   model.fit(X.iloc[train_index], y[train_index])
   y_pred = model.predict(X.iloc[test_index])

第三个解决方案是将您的数据框转换为数组。

for train_index, test_index in kf.split(X_train, y_train):
   model.fit(X.values[train_index], y[train_index])
   y_pred = model.predict(X.values[test_index])

编辑:我什至可以看到第4个解决方案,这可能是您想要的解决方案。您只需执行df.index.values [train_index]即可获取火车集中的索引数组。