作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在处理用于分类的不平衡数据,并且我之前尝试使用合成少数过采样技术 (SMOTE) 对训练数据进行过采样。但是,这一次我认为我还需要使用 Leave One Group Out (LOGO) 交叉验证,因为我想在每份 CV 上遗漏一个主题。
我不确定我是否能很好地解释它,但据我了解,要使用 SMOTE 进行 k 折 CV,我们可以在每一折上循环 SMOTE,正如我在这段代码中看到的 on another post .下面是 k-fold CV 上的 SMOTE 实现示例。
from sklearn.model_selection import KFold
from imblearn.over_sampling import SMOTE
from sklearn.metrics import f1_score
kf = KFold(n_splits=5)
for fold, (train_index, test_index) in enumerate(kf.split(X), 1):
X_train = X[train_index]
y_train = y[train_index]
X_test = X[test_index]
y_test = y[test_index]
sm = SMOTE()
X_train_oversampled, y_train_oversampled = sm.fit_sample(X_train, y_train)
model = ... # classification model example
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print(f'For fold {fold}:')
print(f'Accuracy: {model.score(X_test, y_test)}')
print(f'f-score: {f1_score(y_test, y_pred)}')
在没有SMOTE的情况下,我尝试这样做来做LOGO CV。但通过这样做,我将使用一个 super 不平衡的数据集。
X = X
y = np.array(df.loc[:, df.columns == 'label'])
groups = df["cow_id"].values #because I want to leave cow data with same ID on each run
logo = LeaveOneGroupOut()
logo.get_n_splits(X_std, y, groups)
cv=logo.split(X_std, y, groups)
scores=[]
for train_index, test_index in cv:
print("Train Index: ", train_index, "\n")
print("Test Index: ", test_index)
X_train, X_test, y_train, y_test = X[train_index], X[test_index], y[train_index], y[test_index]
model.fit(X_train, y_train.ravel())
scores.append(model.score(X_test, y_test.ravel()))
我应该如何在 leave-one-group-out CV 循环中实现 SMOTE?我对如何定义合成训练数据的组列表感到困惑。
最佳答案
此处建议的方法 LOOCV留一交叉验证更有意义。留下一组,您将用作测试集,并对另一组进行过度采样。在所有过采样数据上训练您的分类器,并在测试集上测试您的分类器。
在您的情况下,以下代码是在 LOGO CV 循环内实现 SMOTE 的正确方法。
for train_index, test_index in cv:
print("Train Index: ", train_index, "\n")
print("Test Index: ", test_index)
X_train, X_test, y_train, y_test = X[train_index], X[test_index], y[train_index], y[test_index]
sm = SMOTE()
X_train_oversampled, y_train_oversampled = sm.fit_sample(X_train, y_train)
model.fit(X_train_oversampled, y_train_oversampled.ravel())
scores.append(model.score(X_test, y_test.ravel()))
关于python - 进行 Leave-One-Group-Out 交叉验证时如何应用过采样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56964533/
我是一名优秀的程序员,十分优秀!