SMOTETomek - как установить соотношение в качестве словаря для фиксированного баланса - PullRequest
0 голосов
/ 25 сентября 2018

Я пытался использовать эту технику для исправления очень несбалансированных классов.

В моем наборе данных есть классы, например:

In [123]:
data['CON_CHURN_TOTAL'].value_counts()

Out[123]:
0    100
1     10
Name: CON_CHURN_TOTAL, dtype: int64

Я хотел использовать SMOTETomek для примера 0-классаи по выборке 1-класса для достижения соотношения 80: 20. Однако я не могу найти способ исправить словарь.Конечно, в полном коде соотношение 80:20 будет рассчитываться на основе количества строк.

Когда я пытаюсь:

from imblearn.combine import SMOTETomek
smt = SMOTETomek(ratio={1:20, 0:80})

У меня ошибка:

ValueError: При использовании методов избыточной выборки число выборок в классе должно бытьбольше или равно исходному количеству образцов.Первоначально есть 100 выборок и 80 выборок задаются.

Но этот метод должен быть подходящим для одновременного выполнения как недостаточного, так и избыточного отбора.

К сожалению, документальный фильм сейчас не работает из-за ошибки 404.

1 Ответ

0 голосов
/ 22 февраля 2019

Я снова столкнулся с проблемой, поэтому я задал вопрос непосредственно на github imbalanced-learn.

Вот полный ответ: github.com / scikit-learn-contrib / imbalanced-learn

Наиболее важные:

SMOTETomek не делает то, о чем вы думаете.

SMOTETomek применяет SMOTE с последующим удалением ссылки Tomek, а не одновременной избыточной и недостаточной выборкой.

Помните, что выневозможно определить количество сэмплов для использования при использовании Tomek: http://imbalanced -learn.org / ru / stable / under_sampling.html # tomek-s-links

Если вы действительно хотитеиметь недостаточную выборку, вы можете передать 2 выборки:

from sklearn.datasets import load_breast_cancer
import pandas as pd
from imblearn.pipeline import make_pipeline
from imblearn.over_sampling import SMOTE
from imblearn.under_sampling import NearMiss

data = load_breast_cancer()
X = pd.DataFrame(data=data.data, columns=data.feature_names)

count_class_0 = 300
count_class_1 = 300
pipe = make_pipeline(
    SMOTE(sampling_strategy={0: count_class_0}),
    NearMiss(sampling_strategy={1: count_class_1}
)

X_smt, y_smt = pipe.fit_resample(X, data.target)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...