2017-06-20 27 views
0

我對sklearn非常陌生,我試圖使用scikit構建一個簡單的文本分類器,但運行到ValueError中。它顯示在fit()錯誤,但其他教程正在使用它,它運行良好。運行sklearn分類器模型時出現數值錯誤

這裏是我的代碼:

from sklearn.datasets import fetch_20newsgroups 
from sklearn.cross_validation import train_test_split 
from sklearn.feature_extraction.text import TfidfVectorizer 
from sklearn.pipeline import Pipeline 
from sklearn.naive_bayes import MultinomialNB 

news = fetch_20newsgroups(subset='all') 
print len(news.data) 



def train(classifier , X , y): 
     X_train , y_train , X_test , y_test = train_test_split(X,y,test_size =   0.20, random_state = 33) 
     classifier.fit(X_train ,y_train) 
     print "Accuracy %s" % classifier.score(X_test , y_test) 
     return classifier 

model1 = Pipeline([('vectorizer' , TfidfVectorizer()),('classifier' , MultinomialNB()),]) 

train(model1 , news.data , news.target) 

當運行它,我得到一個值誤差

Traceback (most recent call last): 
    File "/home/padam/Documents/git/ticketClassifier/news.py", line 30, in <module> 
    train(model1 , news.data , news.target) 
    File "/home/padam/Documents/git/ticketClassifier/news.py", line 24, in train 
    classifier.fit(X_train ,y_train) 
    File "/usr/lib/python2.7/dist-packages/sklearn/pipeline.py", line 165, in fit 
    self.steps[-1][-1].fit(Xt, y, **fit_params) 
    File "/usr/lib/python2.7/dist-packages/sklearn/naive_bayes.py", line 527, in fit 
    X, y = check_X_y(X, y, 'csr') 
    File "/usr/lib/python2.7/dist-packages/sklearn/utils/validation.py", line 520, in check_X_y 
    check_consistent_length(X, y) 
    File "/usr/lib/python2.7/dist-packages/sklearn/utils/validation.py", line 176, in check_consistent_length 
    "%s" % str(uniques)) 
ValueError: Found arrays with inconsistent numbers of samples: [ 3770 15076] 

什麼用的樣本數量不一致的意思。其他stackoverflow解決方案建議重新排列矩陣numpy矩陣。但我沒有使用numpy。 謝謝!

回答

1

錯誤在於您如何使用train_test_split

您正在使用它作爲

X_train , y_train , X_test , y_test = train_test_split(X, y, 
               test_size = 0.20, 
               random_state = 33) 

但輸出順序是不同的實際as given in documentation。它是:

X_train , X_test , y_train , y_test = train_test_split(X, y, 
               test_size = 0.20, 
               random_state = 33) 

此外,還有一個建議是,如果你正在使用scikit版本> = 0.18,那麼該方案改變從cross_validationmodel_selection,因爲它的棄用,並將在新的版本中刪除。

因此,而不是: -

from sklearn.cross_validation import train_test_split 

使用以下:

from sklearn.model_selection import train_test_split