簡體   English   中英

如何從 LogisticRegressionCV 和 GridSearchCV 中獲得可比較和可重復的結果

[英]How to get comparable and reproducible results from LogisticRegressionCV and GridSearchCV

我想用不同的參數對不同的分類器進行評分。

為了加速LogisticRegression我使用LogisticRegressionCV (至少快 2 倍)並計划為其他人使用GridSearchCV

但是問題雖然它給了我相等的C參數,但不是AUC ROC評分。

我會嘗試修復許多參數,如scorerrandom_statesolvermax_itertol ......請看例子(真實數據沒有):

測試數據及通用部分:

from sklearn import datasets
boston = datasets.load_boston()
X = boston.data
y = boston.target
y[y <= y.mean()] = 0; y[y > 0] = 1

import numpy as np
from sklearn.cross_validation import KFold
from sklearn.linear_model import LogisticRegression
from sklearn.grid_search import GridSearchCV
from sklearn.linear_model import LogisticRegressionCV

fold = KFold(len(y), n_folds=5, shuffle=True, random_state=777)

網格搜索CV

grid = {
    'C': np.power(10.0, np.arange(-10, 10))
     , 'solver': ['newton-cg']
}
clf = LogisticRegression(penalty='l2', random_state=777, max_iter=10000, tol=10)
gs = GridSearchCV(clf, grid, scoring='roc_auc', cv=fold)
gs.fit(X, y)

print ('gs.best_score_:', gs.best_score_)

gs.best_score_:0.939162082194

邏輯回歸CV

searchCV = LogisticRegressionCV(
    Cs=list(np.power(10.0, np.arange(-10, 10)))
    ,penalty='l2'
    ,scoring='roc_auc'
    ,cv=fold
    ,random_state=777
    ,max_iter=10000
    ,fit_intercept=True
    ,solver='newton-cg'
    ,tol=10
)
searchCV.fit(X, y)

print ('Max auc_roc:', searchCV.scores_[1].max())

最大 auc_roc:0.970588235294

求解器newton-cg僅用於提供固定值,其他也嘗試過。 我忘記了什么?

PS 在這兩種情況下,我也收到警告“ /usr/lib64/python3.4/site-packages/sklearn/utils/optimize.py:193: UserWarning: Line Search failed warnings.warn('Line Search failed') “我也看不懂。 如果有人也描述了它的含義,我會很高興,但我希望它與我的主要問題無關。

編輯更新

通過@joeln 評論也添加max_iter=10000tol=10參數。 它不會改變任何數字的結果,但警告消失了。

這是Tom在 scikit-learn 問題跟蹤器上的回答副本:

LogisticRegressionCV.scores_給出所有折疊的分數。 GridSearchCV.best_score_給出所有折疊的最佳平均分數。

要獲得相同的結果,您需要更改代碼:

print('Max auc_roc:', searchCV.scores_[1].max())  # is wrong
print('Max auc_roc:', searchCV.scores_[1].mean(axis=0).max())  # is correct

通過還使用默認的tol=1e-4而不是您的tol=10 ,我得到:

('gs.best_score_:', 0.939162082193857)
('Max auc_roc:', 0.93915947999923843)

剩余的(小)差異可能來自LogisticRegressionCV熱啟動(這實際上使它比GridSearchCV更快)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM