0

我試圖按照Python中建立機器學習系統一書的第6章來對twitter數據進行情感分析。GridSearchCV.fit()返回TypeError:預期的序列或類似數組,得到估計器

我使用的數據集:https://raw.githubusercontent.com/zfz/twitter_corpus/master/full-corpus.csv

它採用TFIDF矢量化和樸素貝葉斯分類器作爲估計的管道。

然後,我使用GridSearchCV()來查找估計器的最佳參數。

的代碼如下:

from load_data import load_data 
from sklearn.cross_validation import ShuffleSplit 
from sklearn.grid_search import GridSearchCV 
from sklearn.metrics import f1_score 
from sklearn.naive_bayes import MultinomialNB 
from sklearn.feature_extraction.text import TfidfVectorizer 
from sklearn.pipeline import Pipeline 

def pipeline_tfidf_nb(): 
    tfidf_vect = TfidfVectorizer(analyzer = "word") 
    naive_bayes_clf = MultinomialNB() 
    return Pipeline([('vect', tfidf_vect),('nbclf',naive_bayes_clf)]) 

input_file = "full-corpus.csv" 
X,y = load_data(input_file) 
print X.shape,y.shape 

clf = pipeline_tfidf_nb() 
cv = ShuffleSplit(n = len(X), test_size = .3, n_iter = 1, random_state = 0) 

clf_param_grid = dict(vect__ngram_range = [(1,1),(1,2),(1,3)], 
        vect__min_df = [1,2], 
        vect__smooth_idf = [False, True], 
        vect__use_idf = [False, True], 
        vect__sublinear_tf = [False, True], 
        vect__binary = [False, True], 
        nbclf__alpha = [0, 0.01, 0.05, 0.1, 0.5, 1], 
       ) 

grid_search = GridSearchCV(estimator = clf, param_grid = clf_param_grid, cv = cv, scoring = f1_score) 
grid_search.fit(X, y) 

print grid_search.best_estimator_ 

load_data()從與正或負情緒csv文件中提取的值。

X是一個字符串數組(TweetText),y是一個布爾值數組(真正的積極情緒)。

的錯誤是:

runfile('C:/Users/saurabh.s1/Downloads/Python_ml/ch6/main.py', wdir='C:/Users/saurabh.s1/Downloads/Python_ml/ch6') 
Reloaded modules: load_data 
negative : 572 
positive : 519 
(1091,) (1091,) 
Traceback (most recent call last): 

    File "<ipython-input-25-823b07c4ff26>", line 1, in <module> 
    runfile('C:/Users/saurabh.s1/Downloads/Python_ml/ch6/main.py', wdir='C:/Users/saurabh.s1/Downloads/Python_ml/ch6') 

    File "C:\anaconda2\lib\site-packages\spyder\utils\site\sitecustomize.py", line 866, in runfile 
    execfile(filename, namespace) 

    File "C:\anaconda2\lib\site-packages\spyder\utils\site\sitecustomize.py", line 87, in execfile 
    exec(compile(scripttext, filename, 'exec'), glob, loc) 

    File "C:/Users/saurabh.s1/Downloads/Python_ml/ch6/main.py", line 31, in <module> 
    grid_search.fit(X, y) 

    File "C:\anaconda2\lib\site-packages\sklearn\grid_search.py", line 804, in fit 
    return self._fit(X, y, ParameterGrid(self.param_grid)) 

    File "C:\anaconda2\lib\site-packages\sklearn\grid_search.py", line 553, in _fit 
    for parameters in parameter_iterable 

    File "C:\anaconda2\lib\site-packages\sklearn\externals\joblib\parallel.py", line 800, in __call__ 
    while self.dispatch_one_batch(iterator): 

    File "C:\anaconda2\lib\site-packages\sklearn\externals\joblib\parallel.py", line 658, in dispatch_one_batch 
    self._dispatch(tasks) 

    File "C:\anaconda2\lib\site-packages\sklearn\externals\joblib\parallel.py", line 566, in _dispatch 
    job = ImmediateComputeBatch(batch) 

    File "C:\anaconda2\lib\site-packages\sklearn\externals\joblib\parallel.py", line 180, in __init__ 
    self.results = batch() 

    File "C:\anaconda2\lib\site-packages\sklearn\externals\joblib\parallel.py", line 72, in __call__ 
    return [func(*args, **kwargs) for func, args, kwargs in self.items] 

    File "C:\anaconda2\lib\site-packages\sklearn\cross_validation.py", line 1550, in _fit_and_score 
    test_score = _score(estimator, X_test, y_test, scorer) 

    File "C:\anaconda2\lib\site-packages\sklearn\cross_validation.py", line 1606, in _score 
    score = scorer(estimator, X_test, y_test) 

    File "C:\anaconda2\lib\site-packages\sklearn\metrics\classification.py", line 639, in f1_score 
    sample_weight=sample_weight) 

    File "C:\anaconda2\lib\site-packages\sklearn\metrics\classification.py", line 756, in fbeta_score 
    sample_weight=sample_weight) 

    File "C:\anaconda2\lib\site-packages\sklearn\metrics\classification.py", line 956, in precision_recall_fscore_support 
    y_type, y_true, y_pred = _check_targets(y_true, y_pred) 

    File "C:\anaconda2\lib\site-packages\sklearn\metrics\classification.py", line 72, in _check_targets 
    check_consistent_length(y_true, y_pred) 

    File "C:\anaconda2\lib\site-packages\sklearn\utils\validation.py", line 173, in check_consistent_length 
    uniques = np.unique([_num_samples(X) for X in arrays if X is not None]) 

    File "C:\anaconda2\lib\site-packages\sklearn\utils\validation.py", line 112, in _num_samples 
    'estimator %s' % x) 

TypeError: Expected sequence or array-like, got estimator Pipeline(steps=[('vect', TfidfVectorizer(analyzer='word', binary=False, decode_error=u'strict', 
     dtype=<type 'numpy.int64'>, encoding=u'utf-8', input=u'content', 
     lowercase=True, max_df=1.0, max_features=None, min_df=1, 
     ngram_range=(1, 1), norm=u'l2', preprocessor=None, 
     smooth_i...e_idf=False, vocabulary=None)), ('nbclf', MultinomialNB(alpha=0, class_prior=None, fit_prior=True))]) 

我試圖重塑X,Y,但不工作。

讓我知道你是否需要更多的數據或者我錯過了什麼。

謝謝!

回答

1

此錯誤是因爲您通過使用scoring=f1_score將錯誤參數傳遞到GridSearchCV構造函數中。 看看documentation of GridSearchCV

在得分PARAM,它要求:

A string (see model evaluation documentation) or a scorer callable object/function with signature scorer(estimator, X, y). If None, the score method of the estimator is used.

你傳入與簽名(y_true, y_pred[, ...])這是不對的可調用的函數。這就是爲什麼你收到錯誤。 您應該使用string as defined here來傳球得分,或傳遞一個帶有簽名(estimator, X, y)的可呼叫。這可以通過使用make_scorer來完成。

更改這一行代碼:

grid_search = GridSearchCV(estimator = clf, param_grid = clf_param_grid, 
          cv = cv, scoring = f1_score) 

這樣:

grid_search = GridSearchCV(estimator = clf, param_grid = clf_param_grid, 
          cv = cv, scoring = 'f1') 

       OR 

grid_search = GridSearchCV(estimator = clf, param_grid = clf_param_grid, 
          cv = cv, scoring = make_scorer(f1_score)) 

我已經回答了相同類型的問題in this answer here

相關問題