advanced_metrics
czym są zaawansowane metryki? ⭐
- Zaawansowane metryki to bardziej wyrafinowane sposoby oceny modeli ML.
- Wykraczają poza podstawowe metryki jak accuracy, precision, recall.
- Uwzględniają różne aspekty wydajności modelu.
- Są szczególnie przydatne dla niezbalansowanych danych i specyficznych problemów.
- Pomagają w lepszym zrozumieniu zachowania modelu.
typy zaawansowanych metryk ⭐
1. Metryki probabilistyczne
- ROC-AUC (Area Under ROC Curve)
- Precision-Recall AUC
- Log Loss
- Brier Score
2. Metryki rankingowe
- Mean Average Precision (MAP)
- Normalized Discounted Cumulative Gain (NDCG)
- Mean Reciprocal Rank (MRR)
3. Metryki biznesowe
- Cost-sensitive metrics
- Custom business metrics
- ROI-based metrics
4. Metryki interpretacyjne
- Calibration metrics
- Confidence metrics
- Uncertainty quantification
przykładowy kod (zaawansowane metryki)
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import roc_auc_score, average_precision_score, log_loss
from sklearn.metrics import roc_curve, precision_recall_curve
from sklearn.calibration import calibration_curve
import matplotlib.pyplot as plt
import seaborn as sns
# Generowanie danych
np.random.seed(42)
n_samples = 2000
# Generowanie cech
feature1 = np.random.normal(0, 1, n_samples)
feature2 = np.random.normal(0, 1, n_samples)
# Tworzenie niezbalansowanego targetu
class_0_mask = np.random.choice([True, False], n_samples, p=[0.8, 0.2])
class_1_mask = ~class_0_mask
# Modyfikacja cech dla klasy 1
feature1[class_1_mask] += 1.5
feature2[class_1_mask] += 1.5
# Target
y = class_1_mask.astype(int)
# Tworzenie DataFrame
data = pd.DataFrame({
'feature1': feature1,
'feature2': feature2,
'target': y
})
# Podział danych
X = data[['feature1', 'feature2']]
y = data['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)
# Trenowanie modelu
model = RandomForestClassifier(random_state=42)
model.fit(X_train, y_train)
# Przewidywania
y_pred = model.predict(X_test)
y_pred_proba = model.predict_proba(X_test)[:, 1]
print("Podstawowe metryki:")
print(f"Accuracy: {np.mean(y_pred == y_test):.3f}")
1. ROC-AUC i krzywa ROC
# ROC-AUC
roc_auc = roc_auc_score(y_test, y_pred_proba)
print(f"ROC-AUC: {roc_auc:.3f}")
# Krzywa ROC
fpr, tpr, thresholds = roc_curve(y_test, y_pred_proba)
plt.figure(figsize=(12, 4))
plt.subplot(1, 3, 1)
plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC curve (AUC = {roc_auc:.3f})')
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.legend(loc="lower right")
plt.grid(True)
2. Precision-Recall AUC
# Precision-Recall AUC
pr_auc = average_precision_score(y_test, y_pred_proba)
print(f"Precision-Recall AUC: {pr_auc:.3f}")
# Krzywa Precision-Recall
precision, recall, _ = precision_recall_curve(y_test, y_pred_proba)
plt.subplot(1, 3, 2)
plt.plot(recall, precision, color='blue', lw=2, label=f'PR curve (AUC = {pr_auc:.3f})')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('Precision-Recall Curve')
plt.legend()
plt.grid(True)
3. Log Loss
# Log Loss
log_loss_score = log_loss(y_test, y_pred_proba)
print(f"Log Loss: {log_loss_score:.3f}")
# Porównanie z innymi modelami
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
models = {
'Random Forest': RandomForestClassifier(random_state=42),
'Logistic Regression': LogisticRegression(random_state=42),
'SVM': SVC(probability=True, random_state=42)
}
log_loss_scores = {}
for name, model in models.items():
model.fit(X_train, y_train)
y_pred_proba_model = model.predict_proba(X_test)[:, 1]
log_loss_scores[name] = log_loss(y_test, y_pred_proba_model)
print("\nLog Loss dla różnych modeli:")
for name, score in log_loss_scores.items():
print(f"{name}: {score:.3f}")
4. Kalibracja modelu
# Kalibracja
fraction_of_positives, mean_predicted_value = calibration_curve(y_test, y_pred_proba, n_bins=10)
plt.subplot(1, 3, 3)
plt.plot(mean_predicted_value, fraction_of_positives, "s-", label="Model")
plt.plot([0, 1], [0, 1], "k:", label="Perfectly calibrated")
plt.xlabel('Mean Predicted Probability')
plt.ylabel('Fraction of Positives')
plt.title('Calibration Plot')
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()
5. Metryki biznesowe
# Przykład: Cost-sensitive metrics
# Koszty różnych typów błędów
cost_fp = 10 # Koszt fałszywego pozytywnego
cost_fn = 50 # Koszt fałszywego negatywnego
# Obliczanie kosztów
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
tn, fp, fn, tp = cm.ravel()
total_cost = fp * cost_fp + fn * cost_fn
cost_per_prediction = total_cost / len(y_test)
print(f"\nMetryki biznesowe:")
print(f"Koszt całkowity: {total_cost}")
print(f"Koszt na predykcję: {cost_per_prediction:.2f}")
# Custom business metric
def custom_business_metric(y_true, y_pred_proba, threshold=0.5):
"""Customowa metryka biznesowa"""
y_pred = (y_pred_proba > threshold).astype(int)
# Przykład: ważona kombinacja precision i recall
precision = precision_score(y_true, y_pred, zero_division=0)
recall = recall_score(y_true, y_pred, zero_division=0)
# Waga recall wyższa (ważniejsze wykrycie pozytywnych)
business_score = 0.3 * precision + 0.7 * recall
return business_score
business_score = custom_business_metric(y_test, y_pred_proba)
print(f"Custom business score: {business_score:.3f}")
6. Metryki rankingowe (dla problemów rankingowych)
# Przykład dla problemu rankingowego
def mean_reciprocal_rank(y_true, y_pred_proba, k=5):
"""Mean Reciprocal Rank dla top-k predykcji"""
# Sortowanie predykcji
sorted_indices = np.argsort(y_pred_proba)[::-1][:k]
# Znalezienie pozycji pierwszej pozytywnej predykcji
for i, idx in enumerate(sorted_indices):
if y_true[idx] == 1:
return 1.0 / (i + 1)
return 0.0
# Przykład użycia
mrr_score = mean_reciprocal_rank(y_test, y_pred_proba, k=5)
print(f"Mean Reciprocal Rank (top-5): {mrr_score:.3f}")
7. Metryki niepewności
# Obliczanie niepewności predykcji
def prediction_uncertainty(y_pred_proba):
"""Niepewność predykcji na podstawie prawdopodobieństw"""
# Im bliżej 0.5, tym większa niepewność
uncertainty = 1 - np.abs(y_pred_proba - 0.5) * 2
return uncertainty
uncertainty_scores = prediction_uncertainty(y_pred_proba)
avg_uncertainty = np.mean(uncertainty_scores)
print(f"\nMetryki niepewności:")
print(f"Średnia niepewność: {avg_uncertainty:.3f}")
print(f"Liczba niepewnych predykcji (>0.5): {np.sum(uncertainty_scores > 0.5)}")
praktyczne ćwiczenia
-
Porównaj metryki - przetestuj różne metryki na tym samym modelu.
-
Threshold optimization - znajdź optymalny próg dla różnych metryk.
-
Custom metrics - stwórz własne metryki biznesowe.
-
Calibration - popraw kalibrację modelu.
-
Uncertainty quantification - zaimplementuj metody oceny niepewności.
dobre praktyki
- Wybór metryki: Dostosuj metrykę do problemu biznesowego.
- Interpretacja: Zrozum, co oznacza każda metryka.
- Walidacja: Używaj cross-validation z zaawansowanymi metrykami.
- Monitoring: Śledź metryki w czasie.
polecane źródła
- Advanced Metrics Guide – Towards Data Science
- ROC and AUC Tutorial – Machine Learning Mastery
- Calibration Tutorial – scikit-learn
- Custom Metrics Guide – Kaggle