[英]How to pass argument to scoring function in scikit-learn's LogisticRegressionCV call
問題
我正在嘗試使用scikit-learn的LogisticRegressionCV
和roc_auc_score
作為評分指標。
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score
clf = LogisticRegressionCV(scoring=roc_auc_score)
但是當我嘗試擬合模型( clf.fit(X, y)
)時,它會引發錯誤。
ValueError: average has to be one of (None, 'micro', 'macro', 'weighted', 'samples')
這很酷。 很明顯發生了什么:根據其文檔和上面的錯誤,需要使用指定的average
參數調用roc_auc_score
。 所以我試過了。
clf = LogisticRegressionCV(scoring=roc_auc_score(average='weighted'))
但事實證明,不能單獨使用可選參數調用roc_auc_score
,因為這會引發另一個錯誤。
TypeError: roc_auc_score() takes at least 2 arguments (1 given)
問題
關於如何使用roc_auc_score
作為LogisticRegressionCV
的評分指標的任何想法,我可以為評分函數指定一個參數?
我在scikit-learn的 GitHub 存儲庫中找不到關於此問題的 SO 問題或對此問題的討論,但肯定有人以前遇到過這個問題?
您可以使用make_scorer
,例如
from sklearn.linear_model import LogisticRegressionCV
from sklearn.metrics import roc_auc_score, make_scorer
from sklearn.datasets import make_classification
# some example data
X, y = make_classification()
# little hack to filter out Proba(y==1)
def roc_auc_score_proba(y_true, proba):
return roc_auc_score(y_true, proba[:, 1])
# define your scorer
auc = make_scorer(roc_auc_score_proba, needs_proba=True)
# define your classifier
clf = LogisticRegressionCV(scoring=auc)
# train
clf.fit(X, y)
# have look at the scores
print clf.scores_
我找到了解決這個問題的方法!
scikit-learn在其metrics
模塊中提供了一個make_scorer
函數,允許用戶從其本機評分函數之一創建評分對象,並將參數指定為非默認值(有關此函數的更多信息,請參見此處來自scikit-learn文檔)。
因此,我創建了一個指定average
參數的評分對象。
roc_auc_weighted = sk.metrics.make_scorer(sk.metrics.roc_auc_score, average='weighted')
然后,我在對LogisticRegressionCV
的調用中傳遞了該對象,它運行沒有任何問題!
clf = LogisticRegressionCV(scoring=roc_auc_weighted)
有點晚(4年后)。 但今天你可以使用:
clf = LogisticRegressionCV(scoring='roc_auc')
此外,所有其他評分鍵都可以通過以下方式獲得:
from sklearn.metrics import SCORERS
print(SCORERS.keys())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.