2015-01-03 1 views
0

Я создал свой собственный корпус, так что я расщепляется на учебный текстовый файл, например так:Неверное предсказание с классификатором SVC в scikit-learn?

POS|This film was awesome, highly recommended 
NEG|I did not like this film 
NEU|I went to the movies 
POS|this film is very interesting, i liked a lot 
NEG|the film was very boring i did not like it 
NEU|the cinema is big 
NEU|the cinema was dark 

И для тестирования у меня есть еще один текстовый обзор, который Немеченому:

I did not like this film 

Тогда я делаю следующее:

import pandas as pd 
from sklearn.feature_extraction.text import HashingVectorizer 

trainingdata = pd.read_csv('/Users/user/Desktop/training.txt', 
       header=None, sep='|', names=['labels', 'movies_reviews']) 


vect = HashingVectorizer(analyzer='word', ngram_range=(2,2), lowercase=True, n_features=7) 
X = vect.fit_transform(trainingdata['movies_reviews']) 
y = trainingdata['labels'] 
TestText= pd.read_csv('/Users/user/Desktop/testing.txt', 
        header=None, names=['test_opinions']) 
test = vect.transform(TestText['test_opinions']) 
from sklearn.svm import SVC 
svm = SVC() 
svm.fit(X, y) 

prediction = svm.predict(test) 
print prediction 

И предсказание:

['NEU'] 

Тогда что-то, что приходит мне на ум, почему это предсказание неверно ?. Это проблема кода или функция или проблема алгоритма классификации? Я попытался сыграть с этим, и когда я удаляю последний отзыв из текстового файла обучения, я понимаю, что всегда предсказывает последний элемент этого файла. Любая идея, как решить эту проблему ?.

ответ

1

SVMs, как известно, чувствительны к настройкам параметров. Вам нужно будет выполнить поиск по сетке, чтобы найти правильные значения. Я попытался тренировки два вида наивного байесовского на наборе данных, и я получил идеальную точность на обучающем наборе:

from sklearn.naive_bayes import * 
from sklearn.feature_extraction.text import * 

# first option- Gaussian NB 
vect = HashingVectorizer(analyzer='word', ngram_range=(2,2), lowercase=True) 
X = vect.fit_transform(trainingdata['movies_reviews']) 
y = trainingdata['labels'] 
nb = GaussianNB().fit(X.A,y) # input needs to be dense 
nb.predict(X.A) == y 

# second option- MultinomialNB (input needs to be positive, use CountingVect instead) 
vect = CountVectorizer(analyzer='word', ngram_range=(2,2), lowercase=True) 
X = vect.fit_transform(trainingdata['movies_reviews']) 
y = trainingdata['labels'] 
nb = MultinomialNB().fit(X,y) 
nb.predict(X.A) == y 

В обоих случаях выход является

Out[33]: 
0 True 
1 True 
2 True 
3 True 
4 True 
5 True 
6 True 
Name: labels, dtype: bool 
+0

Спасибо за обратную связь, вы имеете в виду что-то вроде это: 'from sklearn import grid_search parameters = {'kernel' :('linear', 'rbf'), 'C': [1, 10]} svm = SVC() clf = grid_search.GridSearchCV (svm, test_matrix) clf.fit (training_matrix, labels) '? – tumbleweed

+1

Да, но вам также нужно передать сетку параметров в конструктор 'GridSearch'. Кроме того, поиск более широкого интервала для С, например. от 10^-5 до 10^5 вместо просто [1, 10] – mbatchkarov

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