Для проекта машинного обучения я пытаюсь предсказать категориальную переменную результата с использованием функций, извлеченных из текста.Перекрестная проверка и конвейер в 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)
Что бы его раскололи в трубопроводе? Ваш подход выглядит хорошо для меня, но вы должны упростить свой конвейер: используйте TfidfVectorizer вместо CountVectorizer + TfidfTransformer и не оберните свой SVC в OneVsRestClassifier. SVC уже может иметь дело с несколькими классами. Если производительность недостаточно, рассмотрите возможность использования других классификаторов или ядер для SVC, получения большего количества данных, использования различных методов предварительной обработки и т. Д. – IVlad
Спасибо за ваш ответ. Я изменил конвейер, используя TfidfVectorizer. Теперь я получаю это сообщение: 'ValueError: плохая форма ввода (670, 5)'. Сообщение, которое я не получаю, когда я использую отдельные функции. Любая идея? – Robbertvh89
Я не уверен. Попытайтесь их разделить; Помогает ли вам удалить OneVsRestClassifier? – IVlad