混同行列
CoddyのMachine Learningジャーニー「教師あり学習」セクションの一部。レッスン 21/58。
精度は、間違いの種類ではなく、間違いの数を数えます。インフルエンザ検査では、病気の患者を帰宅させてしまうことは、誤警報よりもはるかに深刻です。混同行列は、それぞれの種類を数えます:
インフルエンザは陽性クラスの1です。誤りは対角線から外れた部分にあります。偽陽性(誤報)と偽陰性(見逃したケース)です。
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
cm = confusion_matrix(y_test, pred) # 正解を先に
print(cm)
print(cm[1, 0]) # 行 1: インフルエンザにかかっている、列 0: 健康と判定した
ConfusionMatrixDisplay.from_predictions(y_test, pred, display_labels=["healthy", "flu"],
ax=ax, colorbar=False) # カラーバーなし: 件数を見ればわかるこれは次のように出力されます:
[[50 3]
[ 5 42]]
5この章では、その見逃し例のセルを小さくすることを扱います。ほとんど誰も見逃さないスクリーニング検査で締めくくります。
チャレンジ
中級ライフガードには、離岸流が発生する可能性があるとき、朝にアラートが届きます。スターターコードはアラートモデルを訓練し、テスト対象の朝のデータに対する予測をpredに格納します(1は離岸流を意味します)。
- 混同行列を作成し、以下のように4つの件数を出力してください。
axにcalmとripのラベルを付けて描画し、表示してください。
別のモデルの場合:
Rips caught: 30
Rips missed: 2
False alarms: 9
Calm days cleared: 59Coddyがあなたのグラフを説明します。パイプの漏水アラートを題材にした、次のグラフのようになるはずです。
自分で試してみよう
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
# サーフビーチの各朝につき1行:rip の 1 は、その日に離岸流が発生したことを意味する
beach = pd.read_csv("rips.csv")
features = ["wave_height_m", "wave_period_s", "wind_kmh", "tide_change_m"]
X = beach[features]
y = beach["rip"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
# ライフガードによる離岸流の警報
model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)
pred = model.predict(X_test)
fig, ax = plt.subplots()
ax.set_title("Rip Current Alerts")
# 以下にコードを書いてください
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
教師あり学習のすべてのレッスン
自分で練習してみよう: Pythonオンラインコンパイラ