Как передискретизировать текст (несбалансированные группы) в конвейере?

Я пытаюсь выполнить некоторую классификацию текста с помощью MultinomialNB, но у меня возникают проблемы, потому что мои данные несбалансированы. (Ниже для простоты приведены некоторые примеры данных. На самом деле мои данные намного больше.) Я пытаюсь повторно дискретизировать свои данные, используя передискретизацию, и в идеале я хотел бы встроить их в этот конвейер.

Приведенный ниже конвейер отлично работает без избыточной выборки, но опять же, в реальной жизни мои данные требуют этого. Это очень несбалансированно.

С этим текущим кодом я продолжаю получать ошибку: «TypeError: все промежуточные шаги должны быть преобразованы и реализованы подгонка и преобразование».

Как мне встроить RandomOverSampler в этот конвейер?

data = [['round red fruit that is sweet','apple'],['long yellow fruit with a peel','banana'],
    ['round green fruit that is soft and sweet','pear'], ['red fruit that is common', 'apple'],
    ['tiny fruits that grow in bunches','grapes'],['purple fruits', 'grapes'], ['yellow and long', 'banana'],
    ['round, small, green', 'grapes'], ['can be red, green, or purple', 'grapes'], ['tiny fruits', 'grapes'], 
    ['small fruits', 'grapes']]

df = pd.DataFrame(data,columns=['Description','Type'])  

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 0)
text_clf = Pipeline([('vect', CountVectorizer()),
                    ('tfidf', TfidfTransformer()), 
                    ('RUS', RandomOverSampler()),
                    ('clf', MultinomialNB())])
text_clf = text_clf.fit(X_train, y_train)
y_pred = text_clf.predict(X_test)

print('Score:',text_clf.score(X_test, y_test))

person Kelsey    schedule 09.01.2019    source источник


Ответы (1)


Вы должны использовать конвейер, реализованный в пакете imblearn, а не в пакете sklearn. Например, этот код работает нормально:

import pandas as pd

from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.naive_bayes import MultinomialNB

from imblearn.over_sampling import RandomOverSampler
from imblearn.pipeline import Pipeline


data = [['round red fruit that is sweet','apple'],['long yellow fruit with a peel','banana'],
    ['round green fruit that is soft and sweet','pear'], ['red fruit that is common', 'apple'],
    ['tiny fruits that grow in bunches','grapes'],['purple fruits', 'grapes'], ['yellow and long', 'banana'],
    ['round, small, green', 'grapes'], ['can be red, green, or purple', 'grapes'], ['tiny fruits', 'grapes'],
    ['small fruits', 'grapes']]

df = pd.DataFrame(data, columns=['Description','Type'])

X_train, X_test, y_train, y_test = train_test_split(df['Description'],
    df['Type'], random_state=0)

text_clf = Pipeline([('vect', CountVectorizer()),
                    ('tfidf', TfidfTransformer()),
                    ('RUS', RandomOverSampler()),
                    ('clf', MultinomialNB())])
text_clf = text_clf.fit(X_train, y_train)
y_pred = text_clf.predict(X_test)

print('Score:',text_clf.score(X_test, y_test))
person vpekar    schedule 10.01.2019