一次将 pandas 数据帧随机分组以进行 x 折交叉验证

Posted

技术标签:

【中文标题】一次将 pandas 数据帧随机分组以进行 x 折交叉验证【英文标题】:Randomly divide a pandas dataframe into groups at once for x-fold crossvalidation 【发布时间】:2019-03-05 14:35:15 【问题描述】:

假设我有一个包含 500 行的数据框。我想执行 10 倍交叉验证。所以,我需要将这些数据分成 10 组,每组包含 50 行。我也想随机一次将整个数据分成 10 个组。

有没有办法使用任何库,如 pandas、numpy 等?

【问题讨论】:

【参考方案1】:

你可以使用 sklearn 的KFold:

import numpy as np
import pandas as pd
from sklearn.model_selection import KFold 

# create dummy dataframe with 500 rows
features = np.random.randint(1, 100, 500)
labels = np.random.randint(1, 100, 500)
df = pd.DataFrame(data = "X": features, "Y": labels)

kf = KFold(n_splits=10, random_state=42, shuffle=True) # Define the split - into 10 folds 
kf.get_n_splits(df) # returns the number of splitting iterations in the cross-validator
print(kf) 

for train_index, test_index in kf.split(df):
    print("TRAIN:", train_index) 
    print("TEST:", test_index)
    X_train, X_test = df.loc[train_index, "X"], df.loc[test_index, "X"]
    y_train, y_test = df.loc[train_index, "Y"], df.loc[test_index, "Y"]

例如taken from here。

【讨论】:

我实际上应该编辑这个问题。实际上我根本不想使用 KFold。我想得到一个逻辑,可以一次将数据随机分成 10 组。我猜在任何模块中都没有这种方法。我制定了自己的逻辑。但是,如果有一些优化的解决方案,我将不胜感激。 @A.Sinha 感谢您的更新。我建议您将此作为新问题发布,然后关闭此问题或接受我的回答,以便其他人可以看到问题已解决。无论如何——祝你的项目好运!

以上是关于一次将 pandas 数据帧随机分组以进行 x 折交叉验证的主要内容,如果未能解决你的问题,请参考以下文章

根据 pandas 中的字典对数据帧的行进行分组并对相应的分子求和

Kaggle-pandas

每周分组 python pandas 数据帧(从星期一开始)

Pandas 循环分组

在pandas数据帧中的行之间添加随机数据

对 pandas 数据框中的连续值进行分组