def classify(actual, probability, threshold):
predicted = (probability > threshold).astype(int)
confusion = pd.crosstab(
pd.Categorical(actual, categories=[0, 1]),
pd.Categorical(predicted, categories=[0, 1]),
rownames=["Actual"], colnames=["Predicted"], dropna=False,
)
tn, fp, fn, tp = confusion.to_numpy().ravel()
metrics = pd.Series({
"Accuracy": (tn + tp) / confusion.to_numpy().sum(),
"Sensitivity": tp / (tp + fn),
"Specificity": tn / (tn + fp),
"Precision": tp / (tp + fp) if tp + fp > 0 else np.nan,
})
return confusion, metrics
confusion_05, metrics_05 = classify(df["call"], p_full, 0.5)
print("Largest fitted probability:", p_full.max())