2017-02-02 7 views
2

Прежде всего, спасибо заранее, я не знаю, должен ли я открыть проблему, поэтому я хотел проверить, не сталкивался ли кто-то с этим раньше.Ошибка с CalibratedClassifierCV при использовании трубопровода с TF-IDF?

Так у меня следующая проблема при использовании CalibratedClassifierCV для классификации текста. У меня есть оценщик, который является трубопровода создал этот путь (простой пример):

# Import libraries first 
import numpy as np 
from sklearn.feature_extraction.text import TfidfVectorizer 
from sklearn.pipeline import make_pipeline 
from sklearn.calibration import CalibratedClassifierCV 
from sklearn.linear_model import LogisticRegression 

# Now create the estimators: pipeline -> calibratedclassifier(pipeline) 
pipeline = make_pipeline(TfidfVectorizer(), LogisticRegression()) 
calibrated_pipeline = CalibratedClassifierCV(pipeline, cv=2) 

Теперь мы можем создать простой поезд набор, чтобы проверить, если классификатор работ:

# Create text and labels arrays 
text_array = np.array(['Why', 'is', 'this', 'happening']) 
outputs = np.array([0,1,0,1]) 

Когда Я стараюсь, чтобы соответствовать объекту calibrated_pipeline, я получаю эту ошибку:

ValueError: Found input variables with inconsistent numbers of samples: [1, 4]

Если вы хотите, я могу полицейский y весь след исключения, но это должно быть легко воспроизводимым. Заранее большое спасибо!

EDIT: Я допустил ошибку при создании массивов. Исправлено (Спасибо @ogrisel!) Кроме того, вызов:

pipeline.fit(text_array, outputs) 

работает правильно, но при этом с калиброванным классификатор не может!

+0

Вы должны всегда сообщать о полной трассировке при сообщении об ошибке. Очень часто бывает, что ответ на ваш вопрос есть. – ogrisel

ответ

0

np.array(['Why', 'is', 'this', 'happening']).reshape(-1,1) является 2D массив строк в то время как docstring of the fit_transform method of the TfidfVectorizer class утверждает, что он ожидает:

Parameters 
    ---------- 
    raw_documents : iterable 
     an iterable which yields either str, unicode or file objects 

Если перебрать массиве 2D Numpy вы получите последовательность 1D массивов строк вместо строк непосредственно:

>>> list(text_array) 
[array(['Why'], 
     dtype='<U9'), array(['is'], 
     dtype='<U9'), array(['this'], 
     dtype='<U9'), array(['happening'], 
     dtype='<U9')] 

Так исправить легко, просто передать:

text_documents = ['Why', 'is', 'this', 'happening'] 

как исходный вход в векторизатор.

Редактировать: примечание: LogisticRegression - это почти всегда калиброванный классификатор по умолчанию. Вероятно, в этом случае CalibratedClassifierCV ничего не принесет.

+0

Большое спасибо @ogrisel! Верно, что логистическая регрессия обычно хорошо откалибрована, но это был всего лишь пример, в моем реальном приложении мне нужно использовать другие класиффы и более предварительные этапы обработки внутри конвейера (включая пользовательские функции). Теперь, игнорируя это, вы правы, я ошибался при изменении формы вектора. Однако, запустив это: '# Создаем массивы текстовых и ярлыков ' text_array = np.array (['Why', 'is', 'this', 'happening']) ' ' output = np.array ([ 0,1,0,1]) ' И вызывая' fit' только на «конвейере», вещь работает, но это происходит в откалиброванном конвейере. –

+0

Кроме того, @ogrisel, собирая списки вместо массивов, также дает мне ошибку, и это все еще работает с «конвейером», но с ошибкой «калибруется». Ошибка говорит: 'ValueError: найденные входные переменные с непоследовательным числом выборок: [1, 4]'. Может быть, это что-то относительно формы ввода, ожидаемой оценщиком внутри откалиброванного объекта, столкнувшегося с итерабельным ожидаемым TF-IDF? Спасибо за попытку! Иниго. –

+0

Хм, я думаю, что это можно считать ошибкой CallibratedClassifierCV: он должен быть менее строгим в своей проверке ввода (в основном, не проверять сам на себя, чтобы делегировать входные проверки на базовую оценку). Не стесняйтесь открывать проблему в github и вызывать запрос на перенос. – ogrisel