我们如何在列的每个值中对pandas数据帧进行子采样

时间:2017-08-27 09:30:04

标签: python pandas scikit-learn cross-validation

我有一个数据框,其中包含一个给出聚类的列,我希望在每个聚类中使用相同的分数执行kfold并进行测试。

我知道我可以使用以下代码自行完成:

nb_fold = 10
for i in range(nb_fold):

    X_train= X.groupby('Cluster').apply(lambda x: x.sample(frac = 1/nb_fold))
    X_train.index = temp.index.droplevel(0)

    Y_train = Y.loc[X_train.index]

    X_eval, Y_eval = X.drop(X_train.index), Y.drop(Y_train.index)

但是我想知道是否有一个scikit学习包装器,因为这样做了替换抽奖,我可以使用抽奖而无需替换。

1 个答案:

答案 0 :(得分:1)

看起来你需要StratifiedKFold。它通常有助于在分类任务的折叠中保持类的分布相同。但是你可以对簇标签进行分层以达到预期的效果。

from sklearn.model_selection import StratifiedKFold

skf = StratifiedKFold(n_splits=10)
for train_ind, eval_ind in skf.split(X, X['Cluster']):
    X_train, Y_train = X.iloc[train_ind, :], Y.iloc[train_ind]
    X_eval, Y_eval = X.iloc[eval_ind, :], Y.iloc[eval_ind]