2015-04-07 25 views
3

我試圖從scikit-learn 0.16實現LogisticRegressionCV類,並且很難讓它使用不同的評分函數。該文件說在的評分函數傳遞從sklearn.metrics所以我嘗試了下面的代碼:如何在Scikit-learn中實現LogisticRegressionCV中的不同評分函數?

from sklearn.linear_model import LogisticRegressionCV 
from sklearn.metrics import log_loss 

... 

model_regression = LogisticRegressionCV(scoring=log_loss) 
model_regression.fit(data_combined, winners_losers) 

但是我得到的擬合函數以下錯誤:

File "C:\Anaconda3\lib\site-packages\sklearn\linear_model\logistic.py", line 1381, in fit 
    for label in iter_labels 
    File "C:\Anaconda3\lib\site-packages\sklearn\externals\joblib\parallel.py", line 659, in __call__ 
    self.dispatch(function, args, kwargs) 
    File "C:\Anaconda3\lib\site-packages\sklearn\externals\joblib\parallel.py", line 406, in dispatch 
    job = ImmediateApply(func, args, kwargs) 
    File "C:\Anaconda3\lib\site-packages\sklearn\externals\joblib\parallel.py", line 140, in __init__ 
    self.results = func(*args, **kwargs) 
    File "C:\Anaconda3\lib\site-packages\sklearn\linear_model\logistic.py", line 844, in _log_reg_scoring_path 
    scores.append(scoring(log_reg, X_test, y_test)) 
    File "C:\Anaconda3\lib\site-packages\sklearn\metrics\classification.py", line 1403, in log_loss 
    T = lb.fit_transform(y_true) 
    File "C:\Anaconda3\lib\site-packages\sklearn\base.py", line 433, in fit_transform 
    return self.fit(X, **fit_params).transform(X) 
    File "C:\Anaconda3\lib\site-packages\sklearn\preprocessing\label.py", line 315, in fit 
    self.y_type_ = type_of_target(y) 
    File "C:\Anaconda3\lib\site-packages\sklearn\utils\multiclass.py", line 287, in type_of_target 
    'got %r' % y) 
ValueError: Expected array-like (array or non-string sequence), got LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True, 
      intercept_scaling=1, max_iter=100, multi_class='ovr', 
      penalty='l2', random_state=None, solver='liblinear', tol=0.0001, 
      verbose=0) 

什麼我在這裏做錯了嗎?如果沒有'scoring = log_loss'參數,那麼該函數可以正常工作,所以它必須與我如何傳遞函數有關?

回答

4

它應該是scoring="log_loss",一個字符串,而不是一個函數。如果你想傳遞一個可調用對象,它需要有一個不同的接口。請參閱docs。可調用應該有三個參數:擬合估計量,得分數據(X)和已知真實目標量(y)。

+0

嗯....文檔說,字符串,可調用,或無。傳遞可調用對象時也會出現此錯誤。 – user48956

+0

是的,但不是任意可調用的,而是一個可調用的,它遵守我鏈接到的文檔中指定的接口。我編輯了我的答案,以總結文檔。 –

0

爲了提供一個功能,你需要的make_scorer包裝

import sklearn.metrics 

scorefunc = sklearn.metrics.accuracy_score # Replace with custom 
myscorer = sklearn.metrics.make_scorer(
     scorefunc, 
     greater_is_better=True, 
     needs_threshold=False # ... classification 
) 

LogisticRegressionCV(... scoring=myscorer,) 

....作爲側面說明,這將是巨大的,如果sklearn的邏輯迴歸主要是迴歸,幷包裹這個新LogisticClassification類。它不可能提供迴歸誤差,或者目前提供實值目標。 (AFAIK)

相關問題