我已經構建了許多 sklearn 分類器模型來執行多標簽分類,我想校準它們的predict_proba輸出,以便我可以獲得置信度分數。我還想使用指標sklearn.metrics.recall_score來評估它們。
我有 4 個標簽要預測,真正的標簽是多熱編碼的(例如[0, 1, 1, 1])。結果,CalibratedClassifierCV不直接接受我的資料:
clf = tree.DecisionTreeClassifier(max_depth=15)
clf = clf.fit(train_X, train_Y)
calibrated_clf = CalibratedClassifierCV(clf, cv="prefit", method="sigmoid")
calibrated_clf.fit(dev_X, dev_Y)
這將回傳一個錯誤:
ValueError: classes [[0 1]
[0 1]
[0 1]
[0 1]] mismatch with the labels [0 1 2 3] found in the data
因此,我試圖將它包裝在一個OneVsRestClassifier:
clf = OneVsRestClassifier(tree.DecisionTreeClassifier(max_depth=15), n_jobs=4)
clf = clf.fit(train_X, train_Y)
calibrated_clf = CalibratedClassifierCV(clf, cv="prefit", method="sigmoid")
calibrated_clf.fit(dev_X, dev_Y)
請注意,即使它們可能更適合我的問題MultiOutputClassifier,ClassifierChain也不起作用。
它有效,但由于其實作predict,校準分類器的輸出是多類而不是多標簽。有四個類 ( ) 但如果不需要放置標簽,它仍然預測 a 。[0 1 2 3]0
通過校準曲線進一步檢查后,發現包裹在校準分類器中的基本估計器根本沒有校準。即,(calibrated_clf.calibrated_classifiers_)[0].base_estimator回傳與clf校準前相同。
我想觀察我的(校準的)模型在執行確定性 ( predict) 和概率 ( predict_proba) 預測時的性能。我應該如何設計我的模型/將東西包裝在其他容器中以獲得每個標簽的校準概率和可理解的標簽預測?
uj5u.com熱心網友回復:
在您的示例中,您使用的DecisionTreeClassifier是默認情況下支持維度 (n, m) 的目標,其中 m > 1。
但是,如果您想獲得每個類別的邊際概率,請使用OneVsRestClassifier.
請注意,CalibratedClassifierCV期望目標為 1d,因此“技巧”是將其擴展為使用MultiOutputClassifier支持多標簽分類。
完整示例
from sklearn.datasets import make_multilabel_classification
from sklearn.tree import DecisionTreeClassifier
from sklearn.multioutput import MultiOutputClassifier
from sklearn.model_selection import train_test_split, StratifiedKFold
import numpy as np
# Generate a sample multilabel target
X, y = make_multilabel_classification(n_classes=4, random_state=0)
y
>>>
array([[1, 0, 1, 0],
[0, 0, 0, 0],
[1, 0, 1, 0],
...
[0, 0, 0, 0],
[0, 1, 1, 1],
[1, 1, 0, 1]])
# Split in train/test
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.9, random_state=42
)
# Splits Stratify target variable
cv = StratifiedKFold(n_splits=2)
# Decision tree support by default multiclass target or use OneVsRest if marginal probabilities
clf = OneVsRestClassifier(DecisionTreeClassifier(max_depth=10))
# Calibrate estimator probabilities
calibrated_clf = CalibratedClassifierCV(base_estimator=clf, cv=cv)
# calibrated_clf target is one dimensional, extend classifier to multi-target classification.
multioutput_clf = MultiOutputClassifier(calibrated_clf).fit(X_train, y_train)
# Check predict
multioutput_clf.predict(X_test[-5:])
>>>
array([[0, 0, 1, 1],
[0, 0, 0, 1],
[0, 0, 0, 1],
[0, 0, 0, 1],
[0, 0, 0, 1]])
# Check predict_proba
multioutput_clf.predict_proba(X_test[-5:])
>>>
[array([[0.78333315, 0.21666685],
[0.78333315, 0.21666685],
[0.78333315, 0.21666685],
[0.78333315, 0.21666685],
[0.78333315, 0.21666685]]),
array([[0.59166537, 0.40833463],
[0.59166537, 0.40833463],
[0.40833361, 0.59166639],
[0.59166537, 0.40833463],
[0.59166537, 0.40833463]]),
array([[0.61666922, 0.38333078],
[0.61666427, 0.38333573],
[0.80000098, 0.19999902],
[0.61666427, 0.38333573],
[0.61666427, 0.38333573]]),
array([[0.26874774, 0.73125226],
[0.26874774, 0.73125226],
[0.45208444, 0.54791556],
[0.26874774, 0.73125226],
[0.26874774, 0.73125226]])]
請注意,結果來自predict_proba一個包含 4 個陣列的串列,每個陣列是屬于類 i 的概率。例如,第一個陣列的第一個樣本內部是第一個樣本屬于第 1 類的概率,依此類推。
關于校準曲線,scikit-learn 提供了示例來繪制二維和三維目標的概率路徑。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/385700.html
