簡體   English   中英

將 sklearn GridSearchCV 與 CalibratedClassifierCV 一起使用是否有意義?

[英]Does it make sense to use sklearn GridSearchCV together with CalibratedClassifierCV?

我想要做的是推導出一個分類器,它的參數相對於給定的指標(例如召回分數)是最佳的,但也經過校准(從這個意義上說,predict_proba 方法的輸出可以直接解釋為置信度)級別,請參閱https://scikit-learn.org/stable/modules/calibration.html )。 將 sklearn GridSearchCV 與 CalibratedClassifierCV 一起使用是否有意義,即通過 GridSearchCV 擬合分類器,然后將 GridSearchCV 輸出傳遞給 CalibratedClassifierCV 對象? 如果我是正確的,CalibratedClassifierCV 對象將適合給定的估計器 cv 次,然后對每個折疊的概率進行平均以進行預測。 但是,對於每個折疊,GridSearchCV 的結果可能不同。

是的,你可以這樣做,它會起作用。 我不知道這樣做是否有意義,但我至少可以解釋我認為會發生什么。

我們可以將這樣做與從網格搜索中獲得最佳估計量並將其提供給校准的替代方案進行比較。

  1. 簡單地獲得最好的估計器並將其提供給calibrationcv
from sklearn.model_selection import GridSearchCV
from sklearn import svm, datasets
from sklearn.calibration import CalibratedClassifierCV

iris = datasets.load_iris()
parameters = {'kernel':('linear', 'rbf'), 'C':[1, 10]}
svc = svm.SVC()
clf = GridSearchCV(svc, parameters)
clf.fit(iris.data, iris.target)
calibration_clf = CalibratedClassifierCV(clf.best_estimator_)
calibration_clf.fit(iris.data, iris.target)
calibration_clf.predict_proba(iris.data[0:10])

array([[0.91887427, 0.07441489, 0.00671085],
       [0.91907451, 0.07417992, 0.00674558],
       [0.91914982, 0.07412815, 0.00672202],
       [0.91939591, 0.0738401 , 0.00676399],
       [0.91894279, 0.07434967, 0.00670754],
       [0.91910347, 0.07414268, 0.00675385],
       [0.91944594, 0.07381277, 0.0067413 ],
       [0.91903299, 0.0742324 , 0.00673461],
       [0.91951618, 0.07371877, 0.00676505],
       [0.91899007, 0.07426733, 0.00674259]])

  1. 校准 cv 中的饋電網格搜索

from sklearn.model_selection import GridSearchCV
from sklearn import svm, datasets
from sklearn.calibration import CalibratedClassifierCV

iris = datasets.load_iris()
parameters = {'kernel':('linear', 'rbf'), 'C':[1, 10]}
svc = svm.SVC()
clf = GridSearchCV(svc, parameters)
cal_clf = CalibratedClassifierCV(clf)
cal_clf.fit(iris.data, iris.target)
cal_clf.predict_proba(iris.data[0:10])

array([[0.900434  , 0.0906832 , 0.0088828 ],
       [0.90021418, 0.09086583, 0.00891999],
       [0.90206035, 0.08900572, 0.00893393],
       [0.9009212 , 0.09012478, 0.00895402],
       [0.90101953, 0.0900889 , 0.00889158],
       [0.89868497, 0.09242412, 0.00889091],
       [0.90214948, 0.08889812, 0.0089524 ],
       [0.8999936 , 0.09110965, 0.00889675],
       [0.90204193, 0.08896843, 0.00898964],
       [0.89985101, 0.09124147, 0.00890752]])

請注意,兩者的概率輸出略有不同。

每種方法的區別在於:

  1. 使用最佳估計器僅在 5 個分割(默認 cv)之間進行校准。 它在所有 5 個分割中使用相同的估計器。

  2. 使用網格搜索,正在對來自校准的 5 個 CV 拆分中的每一個進行網格搜索 5 次。 每次為 4/5 的數據選擇最佳估計器,然后在最后 5 日使用該最佳估計器進行校准時,您實際上是在對 4/5 的數據進行交叉驗證。 根據網格搜索選擇的內容,您可以在每組測試數據上運行略有不同的模型。

我認為網格搜索和校准是不同的目標,所以在我看來,我可能會分別處理每一個,並按照上面指定的第一種方法得到一個效果最好的模型,然后將其輸入校准曲線。

但是,我不知道您的具體目標,所以我不能說這里描述的第二種方式是錯誤的方式。 您可以隨時嘗試兩種方式,看看哪種方式可以提供更好的性能,然后選擇最有效的方式。

我認為您的方法與您的目標略有不同。 您的目標是“找到一個具有最佳召回率的模型,哪個置信度應該是無偏的”,但您要做的是“找到一個具有最佳召回率的模型,然后使置信度無偏”。 所以一個更好(但更慢)的方法是:

  1. CalibratedClassifierCV包裹你的模型,把這個模型作為你應該優化的最終模型;
  2. 修改您的參數網格,確保您在CalibratedClassifierCV中調整模型(將param更改為base_estimator__param類的base_estimator__param ,這是CalibratedClassifierCV的屬性來保存基礎估算器)
  3. CalibratedClassifierCV模型輸入到最終的GridSearchCV ,然后擬合
  4. 獲得best_estimator_ ,這是您具有最佳召回率的無偏模型。

我建議您在單獨的一組上進行校准,以免對估計產生偏差。 我看到兩個選項。 如上所述,您可以在為校准而生成的一小部分折疊內進行交叉驗證,或者在對訓練集執行交叉驗證后,將僅用於校准的臨時評估集分開。 無論如何,我建議您最終在測試集上進行評估。

暫無
暫無

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

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