Table of Contents
Model kalibrasyonu, bir modelin tahminlerinin gerçek olasılıklara daha yakın hale getirilmesi işlemidir. Özellikle olasılık tahmininde bulunan modeller için önemlidir. Kalibre edilmemiş bir model, tahminlerinde gerçek dünya olaylarını yeterince doğru bir şekilde yansıtmayabilir. Model kalibrasyonu, modelin tahminlerini gerçek olayların dağılımına daha iyi uyacak şekilde düzenleyerek tahmin güvenilirliğini artırır.
Model kalibrasyonu, birçok önemli avantaja sahiptir:
- Güvenilirlik: Kalibre edilmiş bir model, tahminlerinde daha tutarlı ve doğru olasılıkları sağlar, bu da karar alıcıların ve kullanıcıların model tahminlerine daha fazla güvenmelerini sağlar.
- Uyum: Model kalibrasyonu, modelin gerçek dünya verileriyle daha iyi uyum sağlamasını sağlar, bu da modelin gerçek durumlar hakkında daha doğru tahminler yapmasını sağlar.
Kalibrasyon Metodları
Sigmoid, Isotonic, Beta ve Venn-ABERS olmak üzere birden fazla kalibrasyon metodu bulunmaktadır. Aşağıdaki grafikte bir sınıflandırma problemi üzerinde “isotonic” ve “sigmoid” metodları ile eğitilmiş iki farklı modelin tahminlerinin olasılıkları gösterilmiştir. Koda buradan ulaşabilirsiniz.
Platt Scaling (Sigmoid Fitting)
Adını John Platt’ten alır. Genellikle sigmoid fonksiyonu ile gerçekleştirilir. İlk olarak sınıflandırıcı çıktıları log-odds’a dönüştürülür. Ardından, log-odds değerleri sigmoid fonksiyonuna geçirilir. Bu olasılıkları [0, 1] aralığına yeniden ölçekler. Temel fikir modelin tahmin edilen sınıf olasılıklarına bir lojistik regresyon modeli uydurmaktır. Lojistik regresyon modeli, tahmin edilen olasılıklara dayalı olarak gerçek sınıf etiketlerini tahmin etmek üzere eğitilir ve modelin katsayıları tahmin edilen olasılıkları kalibre edilmiş olasılıklara dönüştürmek için kullanılır.
from sklearn.calibration import CalibratedClassifierCV
svm = SVC(probability=True, random_state=42)
svm.fit(X_train, y_train)
calibrated_svm = CalibratedClassifierCV(svm, method='sigmoid', cv='prefit')
calibrated_svm.fit(X_train, y_train)
probabilities_before = svm.predict_proba(X_test)[:, 1]
probabilities_after = calibrated_svm.predict_proba(X_test)[:, 1]
Isotonic Regression
Olasılık tahminlerini düzgünleştirmek için monoton artan bir fonksiyonla uyumlu hale getirir. İlk olarak, modelin olasılık tahminleri sıralanır. Monoton artan bir fonksiyon olan isotonic regression kullanılır. Bu regresyon, sıralı tahminler arasında bir düzgünleştirme yaparak olasılık tahminlerini yeniden ölçekler. İzotonik, olasılıkların sırasını korur.
from sklearn.calibration import CalibratedClassifierCV
from sklearn.isotonic import IsotonicRegression
svm = SVC(probability=True, random_state=42)
svm.fit(X_train, y_train)
calibrated_svm = CalibratedClassifierCV(svm, method='sigmoid', cv='prefit')
calibrated_svm.fit(X_train, y_train)
probabilities_after = calibrated_svm.predict_proba(X_test)[:, 1]
isotonic_regressor = IsotonicRegression(out_of_bounds='clip')
isotonic_regressor.fit(probabilities_after, y_test)
probabilities_isotonic = isotonic_regressor.transform(probabilities_after)
Beta Calibration
Olasılık tahminlerini uygun bir şekilde düzgünleştirmek için beta dağılımını kullanır. İlk olarak, modelin olasılık tahminleri log-odds’a dönüştürülür. Ardından log-odds değerleri beta dağılımına uydurulur. Beta dağılımı [0, 1] aralığındaki değerleri modellere uygulayarak olasılık tahminlerini yeniden ölçekler.
from sklearn.calibration import CalibratedClassifierCV
from sklearn.calibration import calibration_curve
svm = SVC(probability=True, random_state=42)
svm.fit(X_train, y_train)
calibrated_svm = CalibratedClassifierCV(svm, method='sigmoid', cv='prefit')
calibrated_svm.fit(X_train, y_train)
probabilities_after = calibrated_svm.predict_proba(X_test)[:, 1]
def beta_calibration(probabilities):
sorted_probs = np.sort(probabilities)
beta_values = np.linspace(0.5, len(sorted_probs) - 0.5, len(sorted_probs)) / len(sorted_probs)
calibrated_probs = np.clip(np.interp(probabilities, sorted_probs, beta_values), 0, 1)
return calibrated_probs
probabilities_beta = beta_calibration(probabilities_after)
Venn-ABERS
Modelin tahminleri, modelin tahmin ettiği sınıfların gerçekte hangi oranda gerçekleştiğini gösteren bir referans dağılım ile karşılaştırılır. Karşılaştırma sonucunda, modelin tahminlerinin gerçek tahminlerden ne kadar saptığı hesaplanır. Bu sapmalar modelin tahminlerini düzeltmek için kullanılır. Dengesiz veri setlerinde etkilidir.
from venn_abers import VennAbersCalibrator
from xgboost import XGBClassifier
xgb = XGBClassifier().fit(X_train, y_train)
p_test = xgb.predict_proba(X_test)
p_cal = xgb.predict_proba(X_calib)
vac = VennAbersCalibrator()
# Inductive
ivap = vac.predict_proba(p_cal=p_cal, y_cal=y_calib, p_test=p_test)[:, 1]
# Cross
vac_c = VennAbersCalibrator(estimator=xgb, inductive=False, n_splits=10).fit(X_train, y_train)
cvap = vac_c.predict_proba(X_test)[:, 1]
Kullanılan Metrik
Brier Score, gerçek sınıf etiketleri ile tahmin edilen olasılıklar arasındaki farkların karesinin ortalamasıdır. Düşük brier skoru, daha iyi kalibre edilmiş bir modeli gösterir.
- fi, i’inci örneğin tahmin edilen olasılığı,
- oi, i’nci örneğin gerçek olasılığıdır.