2017-10-14 21 views
0

私は当初MultinomialNBを使用していましたが、コードは新しいテキストの予測にはうまく機能します。しかし、私はそれをSVCに変更したとき、常に「コンピュータはクール」を予測していたにもかかわらず、「技術ではない」という意味の配列(1)を返します。明らかに周りを確認した後、毎回「政治」を返します。 MultinomialNBに同じコードを使用しても問題はありません。 どうしたのですか?Python Sklearnのテキスト予測は常に同じ結果を返します

メモトレーニングデータは、ニュースタイトルとカテゴリなどのタブで区切られたファイルです。

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

答えて

0

私はSVCは明らかに一つだけのカテゴリ対1を比較するため、LinearSVCが残り対1を比較しながら、解決策は単純に、代わりにLinearSVCを使用しているが見つかりました:ここ

Title         Category 
The new President of United States  politics 

はコードです。

+0

あなたの言ったことを理解できませんでした。 SVMにはデフォルト値 '' ovr ''を持つ' decision_function_shape'があります。 –

+0

正直言って私はまだ初心者ですが、これはドキュメントを読んだ後に行うのが最も簡単な方法です。別のオプションがあるかどうかはわかりませんでした。私はそれを探します、ありがとう。 編集:私はドキュメントを読んで、それはすでに "ovr"がデフォルトになっていると言っていましたが、何らかの理由でうまく動作しませんでした。 –

関連する問題