2017-10-14 245 views
0

我最初使用MultinomialNB並且代碼在預測新文本時工作得很好。但是當我將它改爲SVC時,它總是返回數組(1),這意味着'不是技術',即使我預測'電腦很酷'。經過檢查顯然,它每一次都會返回「政治」。 MultinomialNB使用相同的代碼沒有問題。 我做錯了什麼?Python sklearn文本預測總是返回相同的結果

請注意訓練數據是一個帶有新聞標題和類別的標籤分隔文件,類似。

Title         Category 
The new President of United States  politics 

下面是代碼:

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

我找到了解決辦法是簡單地使用LinearSVC相反,由於SVC顯然只有一個比較VS一類,而LinearSVC一個比較VS休息。

+0

不明白你說的。 SVM有一個「decision_function_shape」,默認值爲「ovr」 - 一個與其餘的。 –

+0

說實話我還是個初學者,這是閱讀文檔後最簡單的方法。不知道還有另一種選擇。我會找的,謝謝。 編輯:我閱讀文檔,它說它默認已經「ovr」,但由於某種原因它沒有工作。 –

相關問題