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')
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. –
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. –