2015-04-16 1 views
1

Для проекта машинного обучения я пытаюсь предсказать категориальную переменную результата с использованием функций, извлеченных из текста.Перекрестная проверка и конвейер в sci-kit learn

Используя перекрестное подтверждение, я разбил свои X и Y на тестовый набор и набор тренировок. Учебный комплект тренируется с использованием конвейера. Однако, когда я вычисляю производительность с помощью X из своего тестового набора, моя производительность равна 0.0. Это пока нет признаков, извлеченных из X_test.

Можно ли разбить набор данных внутри трубопровода?

Мой код:

X, Y = read_data('development2.csv') 

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.33, random_state=42) 

train_pipeline = Pipeline([('vect', CountVectorizer()), #ngram_range=(1,2), analyzer='word' 
       ('tfidf', TfidfTransformer(use_idf=False)), 
       ('clf', OneVsRestClassifier(SVC(kernel='linear', probability=True))), 
       ]) 

train_pipeline.fit(X_train, Y_train) 

predicted = train_pipeline.predict(X_test) 

print accuracy_score(Y_test, predicted) 

отслеживающий при использовании SVC:

File  "/Users/Robbert/Documents/pipeline.py", line  62, in <module> 
train_pipeline.fit(X_train, Y_train) 
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sklearn/pipeline.py", line 130, in fit 
self.steps[-1][-1].fit(Xt, y, **fit_params) 
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sklearn/svm/base.py", line 138, in fit 
y = self._validate_targets(y) 
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sklearn/svm/base.py", line 441, in _validate_targets 
y_ = column_or_1d(y, warn=True) 
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sklearn/utils/validation.py", line 319, in column_or_1d 
raise ValueError("bad input shape {0}".format(shape)) 
ValueError: bad input shape (670, 5) 
+1

Что бы его раскололи в трубопроводе? Ваш подход выглядит хорошо для меня, но вы должны упростить свой конвейер: используйте TfidfVectorizer вместо CountVectorizer + TfidfTransformer и не оберните свой SVC в OneVsRestClassifier. SVC уже может иметь дело с несколькими классами. Если производительность недостаточно, рассмотрите возможность использования других классификаторов или ядер для SVC, получения большего количества данных, использования различных методов предварительной обработки и т. Д. – IVlad

+0

Спасибо за ваш ответ. Я изменил конвейер, используя TfidfVectorizer. Теперь я получаю это сообщение: 'ValueError: плохая форма ввода (670, 5)'. Сообщение, которое я не получаю, когда я использую отдельные функции. Любая идея? – Robbertvh89

+0

Я не уверен. Попытайтесь их разделить; Помогает ли вам удалить OneVsRestClassifier? – IVlad

ответ

0

Я решил проблему.

Целевая переменная (Y) не имела соответствующего формата. Переменные сохранялись следующим образом: [[0 0 0 0 1],[0 0 1 0 0]]. Я преобразовал это в другой формат массива следующим образом: [5, 3].

Это сделало трюк для меня.

Спасибо за все ответы.

Смежные вопросы