ColumnTransformer не работает с CountVectorizer в конвейере - PullRequest
0 голосов
/ 08 ноября 2019

Я пытаюсь преобразовать текст, используя sklearn CountVectorizer внутри конвейеров в сочетании с ColumnTransformer. Однако конвейер возвращает неверный массив. Почему мой конвейер с ColumnTransformer дает мне неправильный массив 1 на 1 для CountVectorize -d текста?

Я понимаю, что мог бы просто использовать один конвейер с CountVectorizer и опустить ColumnTransformer. Однако позже мне нужно будет добавить числовые столбцы, что делает необходимым ColumnTransformer. Первоначально я попытался это сделать, нашел ошибки и изолировал проблему от проблемы, описанной выше.

Я попытался ввести X в виде серии вместо фрейма данных, но получил другую ошибку: IndexError: tuple index out of range

data = pd.DataFrame(data={'text_feat':['This is my first sentence.','This is my second.'], 
                          'numeric_feat':[1,2], 
                          'target':[3,4]})
X = data.loc[:,['text_feat', 'numeric_feat']]
y = data.loc[:,'target']

# first pipeline 
text_features = ['text_feat']
text_transformer = Pipeline(
        steps = [('vec', CountVectorizer())])

# wrap in ColumnTransformer
preprocessor = ColumnTransformer(
        transformers=[('text', text_transformer, text_features)])

# second pipeline
pipeline = Pipeline(steps=[('preprocessor', preprocessor)])

# single pipeline works as expected
X_expected = text_transformer.fit_transform(X['text_feat'])

# but this fails
X_test = pipeline.fit_transform(X)

print('Expected:')
print(X_expected.toarray())
print('Got:')
print(X_test)

Я ожидал массив 2 на 6 array([[1, 1, 1, 0, 1, 1], [0, 1, 1, 1, 0, 1]]) (матрица термина документа от CountVectorizer). Вместо этого я получил это: array([[1]]). Есть идеи?

1 Ответ

0 голосов
/ 08 ноября 2019

Вы можете использовать make_column_transformer и сделать что-то вроде следующего. Остальные оставшиеся функции, к которым вы можете применить другие преобразования. По умолчанию остаток установлен на «отбрасывание», что означает, что оставшиеся объекты без каких-либо преобразований будут отброшены .:

preprocess = make_column_transformer((CountVectorizer(), 'text_feat'), remainder='passthrough') make_pipeline(preprocess).fit_transform(X)

Подробнее здесь: https://scikit -learn.org/stable/modules/generated/sklearn.compose.make_column_transformer.html

Более подробно в следующем блоге: https://jorisvandenbossche.github.io/blog/2018/05/28/scikit-learn-columntransformer/

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

preprocessor = ColumnTransformer( transformers=[('text', text_transformer, 'text_feat')])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...