2
$\begingroup$

I have trained my xgboost binary classifier on a dataset which does not represent the true proportion of positive over negative observations of the population. The model has approximately 45% of positives whereas the "true" population only has 15%.

Since I have to make inference on a sample which contains the original proportion of positives/negatives (15/85), how can I end up having calibrated probabilities?

I was thinking of reducing the positive observations in my training set after the xgboost training, so to restore the original proportions, and fit an isotonic regression on it. Then, I would use this model to calibrate my output probabilities:

from sklearn.isotonic import IsotonicRegression y_pred_train = (sampled y_pred_train) calibr = IsotonicRegression() calibr.fit(y_pred_train,y_train) y_pred_test = calibr.predict(y_pred_test)

Does this make any sense? Thanks in advance.

$\endgroup$

1 Answer 1

2
$\begingroup$

The calibration using isotonic regression will do two things for you, firstly re-adjusting for the oversampling, but secondly also helping with mis-calibration. The second point is rather helpful, because it is reasonably well-known that even if you had not oversampled, the calibration of XGBoost is often not right in the sense that on average cases predicted to be a 1 with probability X% do not end up being cases about X% of the time.

If it were not for the second issue, you could simply re-scale the log-odds by taking the inverse of he sigmoid function (i.e. log(predicted probability)- log(1 - predicted probability)) and adding a constant. I believe the constant would simply be the difference between 0.15 and 0.45 when transformed to the logit scale, i.e. -0.2006707 and -1.734601. I.e. you would get $$\text{adjusted prediction} = \sigma(\sigma^{-1}(\text{predicted probability})-1.53393).$$ In Python you'd probably use the logit and expit functions from scipy.special. However, that approach is only the way to do it, if your model is already well-calibrated, so what you propose seems better to me.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.