首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sklearn:用CalibratedClassifierCV校准多标签分类

Sklearn:用CalibratedClassifierCV校准多标签分类
EN

Stack Overflow用户
提问于 2021-12-17 04:25:30
回答 1查看 620关注 0票数 3

我已经建立了许多学习分类器模型来执行多标签分类,我想校准他们的predict_proba输出,以便我可以获得信心分数。我还想使用诸如sklearn.metrics.recall_score这样的指标来评估它们。

我有4个标签要预测,真正的标签是多热编码(如[0, 1, 1, 1])。因此,CalibratedClassifierCV不直接接受我的数据:

代码语言:javascript
复制
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)

这将返回一个错误:

代码语言:javascript
复制
ValueError: classes [[0 1]
 [0 1]
 [0 1]
 [0 1]] mismatch with the labels [0 1 2 3] found in the data

因此,我试图将它包装在一个OneVsRestClassifier中。

代码语言:javascript
复制
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)

请注意,尽管MultiOutputClassifierClassifierChain可能更适合我的问题,但它们不起作用。

由于predict的存在,标定分类器的其实施情况输出是多类的,而不是多标签的。有四个类([0 1 2 3]),但是如果不需要放置标签,它仍然可以预测0

通过对标定曲线的进一步检验,证明被标定分类器中的基估计器根本没有被校准。也就是说,(calibrated_clf.calibrated_classifiers_)[0].base_estimator返回与校准前相同的clf

我想观察我的(校准的)模型进行确定性(predict)和概率(predict_proba)预测的性能。我应该如何设计我的模型/包装在其他容器中,以获得每个标签的校准概率和可理解的标签预测?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-17 15:33:36

在您的示例中,您使用的是一个DecisionTreeClassifier,默认情况下,它的维数为(n,m),其中m> 1。

但是,如果希望得到每个类的边际概率,则使用OneVsRestClassifier.

注意,CalibratedClassifierCV期望目标为1d,所以“诀窍”是将其扩展到支持使用MultiOutputClassifier的多标签分类。

完整示例

代码语言:javascript
复制
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个数组的列表,每个数组都是属于第一类的概率,例如,在第一个数组的第一个样本中,第一个样本属于第一类的概率等等。

关于标定曲线,scikit- Regarding提供了绘制二维三维目标概率路径的示例.

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70388422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档