python imblearn make_pipeline TypeError: На последнем шаге Pipeline должна быть реализована подгонка - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь реализовать SMOTE imblearn внутри конвейера. Мои наборы данных - это текстовые данные, хранящиеся в панде. Пожалуйста, смотрите ниже фрагмент кода

text_clf =Pipeline([('vect', TfidfVectorizer()),('scale', StandardScaler(with_mean=False)),('smt', SMOTE(random_state=5)),('clf', LinearSVC(class_weight='balanced'))])

После этого я использую GridsearchCV.

grid = GridSearchCV(text_clf, parameters, cv=4, n_jobs=-1, scoring = 'accuracy') 

Где параметры - только параметры настройки, в основном для TfidfVectorizer (). Я получаю следующую ошибку.

 All intermediate steps should be transformers and implement fit and transform. 'SMOTE

Отправьте эту ошибку, я изменил код следующим образом.

vect = TfidfVectorizer(use_idf=True,smooth_idf = True, max_df = 0.25, sublinear_tf = True, ngram_range=(1,2))
X = vect.fit_transform(X).todense()
Y = vect.fit_transform(Y).todense()
X_Train,X_Test,Y_Train,y_test = train_test_split(X,Y, random_state=0, test_size=0.33, shuffle=True)
text_clf =make_pipeline([('smt', SMOTE(random_state=5)),('scale', StandardScaler(with_mean=False)),('clf', LinearSVC(class_weight='balanced'))])
grid = GridSearchCV(text_clf, parameters, cv=4, n_jobs=-1, scoring = 'accuracy')

Где parameters - это не что иное, как настройка C в SVC классификаторах. На этот раз я получаю следующую ошибку:

Last step of Pipeline should implement fit.SMOTE(....) doesn't

Что здесь происходит? Может кто-нибудь помочь, пожалуйста?

1 Ответ

0 голосов
/ 10 марта 2019

imblearn. У SMOTE нет метода преобразования. Документы: https://imbalanced -learn.readthedocs.io / en / стабильный / созданный / imblearn.over_sampling.SMOTE.html

Но все шаги, кроме последнего в конвейере, должны иметь его вместе с 'fit'.

Чтобы использовать SMOTE с конвейером sklearn, вы должны реализовать собственный преобразователь, вызывающий SMOTE.fit_sample () в методе transform.

Еще один более простой вариант - использовать конвейер ibmlearn:

from imblearn.over_sampling import SMOTE
from imblearn.pipeline import Pipeline as imbPipeline

# This doesn't work with sklearn.pipeline.Pipeline because
# SMOTE doesn't have a .tranform() method.
# (It has .fit_sample() or .sample().)
pipe = imbPipeline([
    ... 
    ('oversample', SMOTE(random_state=5)),
    ('clf', LinearSVC(class_weight='balanced'))
])
...