Как выполнить SMOTE с перекрестной проверкой в ​​sklearn в python - PullRequest
1 голос
/ 09 апреля 2019

У меня очень несбалансированный набор данных, и я хотел бы выполнить SMOTE, чтобы сбалансировать набор данных и перекрестную проверку, чтобы измерить точность.Однако в большинстве существующих учебных пособий для выполнения SMOTE используется только одна итерация training и testing.

Поэтому я хотел бы знать правильную процедуру выполнения SMOTE с помощью перекрестной проверки.

Мой текущий код выглядит следующим образом.Однако, как уже упоминалось выше, он использует только одну итерацию.

from imblearn.over_sampling import SMOTE
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
sm = SMOTE(random_state=2)
X_train_res, y_train_res = sm.fit_sample(X_train, y_train.ravel())
clf_rf = RandomForestClassifier(n_estimators=25, random_state=12)
clf_rf.fit(x_train_res, y_train_res)

Я с удовольствием предоставлю более подробную информацию, если это необходимо.

Ответы [ 2 ]

4 голосов
/ 09 апреля 2019

Вам нужно выполнить SMOTE в пределах каждый раз. Соответственно, вам нужно избегать train_test_split в пользу KFold:

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]  # Based on your code, you might need a ravel call here, but I would look into how you're generating your y
    X_test = X[test_index]
    y_test = y[test_index]  # See comment on ravel and  y_train
    sm = SMOTE()
    X_train_oversampled, y_train_oversampled = sm.fit_sample(X_train, y_train)
    model = ...  # Choose a model here
    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)}')

Вы также можете, например, добавить оценки к list, определенному за пределами.

2 голосов
/ 09 апреля 2019
from sklearn.model_selection import StratifiedKFold
from imblearn.over_sampling import SMOTE

cv = StratifiedKFold(n_splits=5)
for train_idx, test_idx, in cv.split(X, y):
    X_train, y_train = X[train_idx], y[train_idx]
    X_test, y_test = X[test_idx], y[test_idx]
    X_train, y_train = SMOTE().fit_sample(X_train, y_train)
    ....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...