使用 sklearn 的 KFold 分离 pandas 数据框

Posted

技术标签:

【中文标题】使用 sklearn 的 KFold 分离 pandas 数据框【英文标题】:Separate pandas dataframe using sklearn's KFold 【发布时间】:2017-12-20 07:43:44 【问题描述】:

我已经用下面的代码得到了训练集和测试集的索引。

df = pandas.read_pickle(filepath + filename)
kf = KFold(n_splits = n_splits, shuffle = shuffle, random_state = 
randomState)

result = next(kf.split(df), None)

#train can be accessed with result[0]
#test can be accessed with result[1]

我想知道是否有更快的方法将它们分别与我检索到的行索引分成 2 个数据帧。

【问题讨论】:

【参考方案1】:

您需要 DataFrame.iloc 按位置选择行:

示例

np.random.seed(100)
df = pd.DataFrame(np.random.random((10,5)), columns=list('ABCDE'))
df.index = df.index * 10
print (df)
           A         B         C         D         E
0   0.543405  0.278369  0.424518  0.844776  0.004719
10  0.121569  0.670749  0.825853  0.136707  0.575093
20  0.891322  0.209202  0.185328  0.108377  0.219697
30  0.978624  0.811683  0.171941  0.816225  0.274074
40  0.431704  0.940030  0.817649  0.336112  0.175410
50  0.372832  0.005689  0.252426  0.795663  0.015255
60  0.598843  0.603805  0.105148  0.381943  0.036476
70  0.890412  0.980921  0.059942  0.890546  0.576901
80  0.742480  0.630184  0.581842  0.020439  0.210027
90  0.544685  0.769115  0.250695  0.285896  0.852395

from sklearn.model_selection import KFold

#added some parameters
kf = KFold(n_splits = 5, shuffle = True, random_state = 2)
result = next(kf.split(df), None)
print (result)
(array([0, 2, 3, 5, 6, 7, 8, 9]), array([1, 4]))

train = df.iloc[result[0]]
test =  df.iloc[result[1]]

print (train)
           A         B         C         D         E
0   0.543405  0.278369  0.424518  0.844776  0.004719
20  0.891322  0.209202  0.185328  0.108377  0.219697
30  0.978624  0.811683  0.171941  0.816225  0.274074
50  0.372832  0.005689  0.252426  0.795663  0.015255
60  0.598843  0.603805  0.105148  0.381943  0.036476
70  0.890412  0.980921  0.059942  0.890546  0.576901
80  0.742480  0.630184  0.581842  0.020439  0.210027
90  0.544685  0.769115  0.250695  0.285896  0.852395

print (test)
           A         B         C         D         E
10  0.121569  0.670749  0.825853  0.136707  0.575093
40  0.431704  0.940030  0.817649  0.336112  0.175410

【讨论】:

感谢您提供详细示例! 这不只是一个分裂。我们如何获得多个拆分? @hannahmontanna 没有。此方法产生所需的拆分数量,但是,kf.split(df) 是一个生成器。如果你想要一个列表中的所有拆分,你可以通过 list(kf.split(df)) 将它简单地转换为一个列表,或者你可以遍历生成器。

以上是关于使用 sklearn 的 KFold 分离 pandas 数据框的主要内容,如果未能解决你的问题,请参考以下文章

sklearn中的Kfold交叉验证每次都会给出不同的折叠

sklearn可视化不同数据划分方法的差异:KFold, ShuffleSplit,StratifiedKFold, GroupKFold, StratifiedShuffleSplit.......

sklearn KFold() - 将所有折叠保存到 csv 文件

为啥用 shuffle 调用 KFold 生成器会给出相同的索引?

keras:为 fit_generator 使用 ImageDataGenerator 和 KFold 的问题

Sklearn:有没有办法为管道定义特定的分数类型?