predict_proba method available in OneVsRestClassifier

Question:

I am using sklearn‘s OneVsOneClassifier in an pipeline like so:

smt = SMOTE(random_state=42)
base_model = LogisticRegression()
pipeline = Pipeline([('sampler', smt), ('model', base_model)])

classifier = OneVsOneClassifier(estimator=pipeline)
classifier.fit(X_train, y_train)
# prediction
yhat = classifier.predict(X_test)

But then I cannot do:

yhat_prob = predict_proba(X_test)

AttributeError: 'OneVsOneClassifier' object has no attribute 'predict_proba'

scikit-learns OneVsRestClassifier does provide predict_proba method. I am suprised OneVsOneClassifier doesn’t have this method.

How do I then get class probability estimates from my pipeline above?

Asked By: arilwan

||

Answers:

It’s not clear how to use OvO to get probabilities, so it’s not implemented. https://github.com/scikit-learn/scikit-learn/issues/6164

There is the decision_function method for a more nuanced version of predict.

Answered By: Ben Reiniger

Thank to Ben’s answer, I however found a way around getting the class probability estimates using the CalibratedClassifierCV classifier.

smt = SMOTE(random_state=42)
base_model = LogisticRegression()
pipeline = Pipeline([('sampler', smt), ('model', base_model)])

classifier = OneVsOneClassifier(estimator=pipeline)
calibrated_clf = CalibratedClassifierCV(
     base_estimator=classifier,
     cv="prefit")

# sanity check
yhat1 = classifier.predict(xtest)
yhat2 = calibrated_clf.predict(xtest)
y_prob = calibrated_clf.predict_proba(xtest)
yhat3 = np.argmax(y_prob, axis=1)

np.array_equal(yhat2, yhat3)
True

np.array_equal(yhat1, yhat2)
True

np.array_equal(yhat1, yhat2)
True
Answered By: arilwan