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

How can we subsample a pandas dataframe within every value of a column

我有一个数据框,其中有一列给出了聚类,我想在每个聚类中用相同的分数在训练和测试中执行 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 learn 包装器,因为这会进行带替换的平局,而我可以使用不带替换的平局。

看来您需要 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]