2017-10-14 1 views
0

Au début, j'utilisais MultinomialNB et le code fonctionne très bien pour prédire le nouveau texte. Mais quand je l'ai changé en SVC, il renvoie toujours array (1), ce qui signifie «pas de technologie», même si je prédisais «les ordinateurs sont cool». Après avoir regardé autour de lui apparemment, il renvoie la «politique» à chaque fois. Il n'y a pas de problème avec MultinomialNB utilisant le même code. Qu'est-ce que j'ai fait de mal?La prédiction de texte Python sklearn renvoie toujours le même résultat

Notez que les données d'apprentissage sont des fichiers séparés par des tabulations avec le titre et la catégorie des actualités, quelque chose comme.

Title         Category 
The new President of United States  politics 

Voici le code:

path="c:/newstrainingutf8.txt" 
import pandas as pd 
from sklearn.model_selection import train_test_split 
from sklearn.feature_extraction.text import CountVectorizer 
from sklearn import svm 
from sklearn import metrics 

news=pd.read_table(path, header=0, names=['category', 'title'], encoding='utf-8') 

news['category_num']=news.category.map({'business':1,'entertainment':1,'health':1,'politics':1,'science':1, 'technology':0, 'world':1}) 
X=news.title 
y=news.category_num 
X_train, X_test, y_train, y_test=train_test_split(X,y,random_state=1) 
vect=CountVectorizer() 
vect.fit(X_train.values.astype('U')) 
X_train_dtm = vect.transform(X_train.values.astype('U')) 
X_train_dtm=vect.fit_transform(X_train.values.astype('U')) 
X_test_dtm=vect.transform(X_test.values.astype('U')) 
svm = svm.SVC() 
svm.fit(X_train_dtm, y_train) 
y_pred_class=svm.predict(X_test_dtm) 
metrics.accuracy_score(y_test, y_pred_class) 

svm.predict(vect.transform(['computers are cool'])) 

newinput="f:/newinput.txt" 
newoutput="f:/newoutput.txt" 
input=pd.read_table(newinput, header=0, names=['cat','title','link'], encoding='utf-8') 
input.cat=svm.predict(vect.transform(input.title)) 
input.to_csv(newoutput, sep='\t', header=None, index=None, mode='a', encoding='utf-8') 

Répondre

0

J'ai trouvé la solution est tout simplement utiliser LinearSVC à la place, puisque SVC apparemment seulement comparer un vs une catégorie, alors que LinearSVC comparer un vs le reste.

+0

Je n'ai pas compris ce que vous avez dit. SVM a 'decision_function_shape' avec la valeur par défaut' 'ovr '' - un vs repos. –

+0

Pour être honnête, je suis toujours un débutant et c'est la façon la plus simple de le faire après avoir lu la documentation. Je ne savais pas qu'il y a une autre option. Je vais chercher, merci. edit: J'ai lu les docs et il a dit qu'il est par défaut "ovr" déjà, mais cela n'a pas fonctionné pour une raison quelconque. –