精度が十分ではない理由
機械学習モデルの評価は、思っているよりもはるかに複雑です。間違い 初心者の間で最も一般的なのは、もっぱら依存することです。正確さ (パーセンテージ 正しい予測の結果)。 1 つのクラスがデータの 95% を表す不均衡なデータセットの場合、モデルは次のようになります。 まったく役に立たないにもかかわらず、多数派クラスが 95% の精度を獲得すると常に予測します。 モデルを適切に評価するには、より洗練されたメトリクスが必要です。
この記事では、分類と回帰に利用できるメトリクスの全武器を調査します。 それぞれをいつ使用するかを理解し、相互検証を備えた堅牢な評価フレームワークを構築します。
この記事で学べること
- 混同マトリックス: TP、TN、FP、FN
- 精度、再現率、F1 スコア
- ROC 曲線と AUC
- 回帰指標: MSE、MAE、R²
- 相互検証: 堅牢な評価
- 問題に適した指標を選択する方法
混同マトリックス
La 混同行列 これはすべての分類指標の基礎となります。問題について バイナリでは、予測が 4 つのカテゴリに分類されます。 真陽性 (TP) — 正しく 陽性と予測される。 真陰性 (TN) — 正しく陰性と予測されました。 誤検知 (FP) — 誤って陽性と予測された(タイプ I 過誤)。 偽陰性 (FN) — 誤って陰性と予測されました (タイプ II エラー)。
from sklearn.metrics import (
confusion_matrix, classification_report,
precision_score, recall_score, f1_score,
roc_auc_score, roc_curve, accuracy_score
)
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
import numpy as np
# Dataset
data = load_breast_cancer()
X, y = data.data, data.target
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# Modello
pipeline = Pipeline([
('scaler', StandardScaler()),
('clf', LogisticRegression(max_iter=10000, random_state=42))
])
pipeline.fit(X_train, y_train)
# Predizioni e probabilità'
y_pred = pipeline.predict(X_test)
y_proba = pipeline.predict_proba(X_test)[:, 1]
# Confusion Matrix
cm = confusion_matrix(y_test, y_pred)
tn, fp, fn, tp = cm.ravel()
print("Confusion Matrix:")
print(f" TN={tn} FP={fp}")
print(f" FN={fn} TP={tp}")
# Metriche
print(f"\nAccuracy: {accuracy_score(y_test, y_pred):.3f}")
print(f"Precision: {precision_score(y_test, y_pred):.3f}")
print(f"Recall: {recall_score(y_test, y_pred):.3f}")
print(f"F1-Score: {f1_score(y_test, y_pred):.3f}")
print(f"ROC-AUC: {roc_auc_score(y_test, y_proba):.3f}")
# Report completo
print(f"\n{classification_report(y_test, y_pred, target_names=data.target_names)}")
精度、再現率、F1 スコア
精度 = TP / (TP + FP): 陽性であると予測されたすべてのサンプルのうち、実際に陽性であるサンプルはいくつありますか? 精度が高いということは、誤検知が少ないことを意味します。誤検知にコストがかかる場合(承認など)に重要 売掛金: 滞納している顧客を承認したくない場合)。
想起 (感度) = TP / (TP + FN): すべての真に陽性のサンプルのうち、いくつあるでしょうか? 見つかった?再現率が高いということは、偽陰性が少ないことを意味します。偽陰性が危険な場合に重要 (例: 腫瘍の診断: 陽性症例を見逃したくないでしょう)。
F1 スコア = 2 * (精度 * 再現率) / (精度 + 再現率): 精度の調和平均 そして思い出してください。 2 つのメトリック間のバランスが必要な場合に役立ちます。調和平均により値にペナルティが課されます 極端: 2 つの指標のうち 1 つが非常に低い場合、F1 は低くなります。
精度と再現率のトレードオフ: 分類しきい値を上げる (0.5 を超える) と、 精度は向上しますが、再現率は低下します。下げるとその逆になります。普遍的に閾値はありません 最良: 特定のドメインにおける誤検知と誤検知の相対コストによって異なります。
ROC 曲線と AUC
La ROC曲線(受信機動作特性) 真陽性間のトレードオフを表示します 分類しきい値が変化するときの率 (再現率) と誤検知率。ザ」AUC (エリアアンダー) 曲線) ROC を 1 つの数値で要約します。1.0 は完全なモデル、0.5 は完全なモデルです。 偶然に相当します(ランダムな分類)。 AUC はモデルの分離能力を測定します。 選択したしきい値に関係なくクラス。
from sklearn.metrics import precision_recall_curve, roc_curve, roc_auc_score
from sklearn.model_selection import cross_val_score, StratifiedKFold
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
import numpy as np
# Pipeline
pipeline = Pipeline([
('scaler', StandardScaler()),
('clf', RandomForestClassifier(n_estimators=100, random_state=42))
])
# --- CROSS-VALIDATION con più' metriche ---
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
metrics = ['accuracy', 'precision', 'recall', 'f1', 'roc_auc']
print("Cross-Validation Results:")
for metric in metrics:
scores = cross_val_score(pipeline, X, y, cv=cv, scoring=metric)
print(f" {metric:<12s}: {scores.mean():.3f} (+/- {scores.std():.3f})")
# --- THRESHOLD TUNING ---
pipeline.fit(X_train, y_train)
y_proba = pipeline.predict_proba(X_test)[:, 1]
# Precision-Recall per diverse soglie
precisions, recalls, thresholds = precision_recall_curve(y_test, y_proba)
# Trovare la soglia che massimizza F1
f1_scores = 2 * (precisions * recalls) / (precisions + recalls + 1e-10)
best_idx = np.argmax(f1_scores)
best_threshold = thresholds[best_idx] if best_idx < len(thresholds) else 0.5
print(f"\nMiglior threshold per F1: {best_threshold:.3f}")
print(f" Precision: {precisions[best_idx]:.3f}")
print(f" Recall: {recalls[best_idx]:.3f}")
print(f" F1: {f1_scores[best_idx]:.3f}")
回帰指標
回帰の場合、メトリクスは予測値と実際の値の間の距離を測定します。 MSE (平均二乗) エラー) 大きなエラーに二次的にペナルティを課します。 MAE (平均絶対誤差) 取引する すべての誤差は線形であり、外れ値に対してより堅牢です。 RMSE (ルート MSE) 同じものを持っています ターゲットの測定単位、より解釈しやすくなりました。 R² 割合を示します モデルによって説明される分散: 1.0 は完全、0 は常に平均を予測することに等しい。
適切な指標を選択する方法
メトリックの選択は、ドメインとエラー コストによって異なります。医学的診断のため、リコール これは重要です (ケースを見逃さないでください)。スパム フィルタリングでは、精度が重要です(精度は重要ではありません)。 重要なメールを失いたい)。不均衡なデータセットの場合、精度よりも F1 スコアと AUC が優先されます。 外れ値を含む回帰の場合、MAE は MSE よりも優れています。常にステークホルダーと議論する ドメインを使用して、どのタイプのエラーが最もコストがかかるかを理解できます。
重要なポイント
- 特に不均衡なデータセットの場合、精度だけでは不十分です
- 精度は、予測された陽性反応の正確さを測定します。リコール測定の完全性
- F1 スコアは適合率と再現率を調和平均でバランスさせます
- ROC-AUCは閾値に関係なく分離能力を測定します
- StratifiedKFold による相互検証は評価のゴールドスタンダードです
- メトリックの選択は、ドメイン内のさまざまな種類のエラーの相対コストによって決まります。







