我已经建立了一些sklearn分类器模型来执行多标签分类,并希望校准它们的
我有4个标签要预测,真实标签是多热编码的(例如
这将返回一个错误:
因此,我尝试将其包装在
请注意,即使它们可能更适合我的问题,
它能够工作,但由于其实现方式,校准分类器的
通过校准曲线的进一步检查,发现包装在校准分类器内部的基础估计器根本没有被校准。也就是说,
我希望观察我的(校准过的)模型在进行确定性(
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
输出是多类别而不是多标签。有四个类别([0 1 2 3]
),但如果没有必要放置标签,它仍然会预测0
。通过校准曲线的进一步检查,发现包装在校准分类器内部的基础估计器根本没有被校准。也就是说,
(calibrated_clf.calibrated_classifiers_)[0].base_estimator
返回与校准之前相同的clf
。我希望观察我的(校准过的)模型在进行确定性(
predict
)和概率性(predict_proba
)预测时的表现。我应该如何设计我的模型/包装其他容器,以获得每个标签的校准概率和易于理解的标签预测?