交叉验证加过采样?

数据挖掘 机器学习 Python 交叉验证 采样
2021-09-18 17:32:42

我对机器学习和 python 也很陌生。我遇到了一个不平衡的数据集,想使用交叉验证和过采样,如图所示。

在此处输入图像描述

我意识到下面的 Python 函数不能直接用于此目的,请为此任务提供一些代码。

cross_val_score(model, X_train,np.ravel(y_train), cv=n_folds, n_jobs=1, scoring='roc_auc')
3个回答

分层 K 折不是这里的答案。

为此目的创建过采样 k-fold 类的代码示例:

class oversampled_Kfold():
    def __init__(self, n_splits, n_repeats=1):
        self.n_splits = n_splits
        self.n_repeats = n_repeats

    def get_n_splits(self, X, y, groups=None):
        return self.n_splits*self.n_repeats

    def split(self, X, y, groups=None):
        splits = np.split(np.random.choice(len(X), len(X),replace=False), 5)
        train, test = [], []
        for repeat in range(self.n_repeats):
            for idx in range(len(splits)):
                trainingIdx = np.delete(splits, idx)
                Xidx_r, y_r = ros.fit_resample(trainingIdx.reshape((-1,1)), 
y[trainingIdx])
                train.append(Xidx_r.flatten())
                test.append(splits[idx])
        return list(zip(train, test))
...
...
rkf_search = oversampled_Kfold(n_splits=5, n_repeats=2)
...
output = cross_validate(clf,x,y, scoring=metrics,cv=rkf)

ros 是 imblearn 的随机过采样器。

添加到Himanshu Rai所说的内容中,您应该注意不要在 StratifiedKFold 之前进行过度采样,一旦您冒险将相同的样本放入训练和测试折叠中,请检查此,(您从中获取图像的位置)并且这并不是真的评估您的模型对从未见过的数据的能力。我所做的是使用 StratifiedKFold,然后只查看该折叠的训练数据,然后分别对所有训练折叠进行过采样或 SMOTE(或任何你想要的)。然后使用所有这些折叠来验证您的模型。

使用分层 K-Fold 交叉验证,它试图平衡每个折叠的正负类的数量。在此处查找文档和示例。如果它仍然不能解决您的不平衡问题,请查看 SMOTE 算法,是一个 scikit learn 的实现。