Menu
CoddyTech

ROC曲線

CoddyのMachine Learningジャーニー「教師あり学習」セクションの一部。レッスン 25/58。

各しきい値には、それぞれの再現率と誤警報の数があります。ROC曲線は、それらをすべて一度に示します。

左下隅から右上に向かって上昇する青い階段状の曲線。破線の灰色のコイントス対角線よりかなり上にある。オレンジ色の点はしきい値0.8、0.5、0.2を示し、右上へ移動している。曲線の下の領域は塗りつぶされている:AUC = 0.914

横軸は偽陽性率、つまり陽性と判定された健康な患者の割合です。縦軸は再現率です。しきい値を下げると (1, 1) に近づきます。

from sklearn.metrics import roc_curve, roc_auc_score

proba = model.predict_proba(X_test)[:, 1]
fpr, tpr, thresholds = roc_curve(y_test, proba)  # tpr は再現率
ax.plot(fpr, tpr)
print(f"{roc_auc_score(y_test, proba):.3f}")

これは0.914、つまりAUC(曲線下面積)を出力します。1なら完璧、0.5ならコイントス程度です。曲線が高いほど、同じ誤警報数でより多くを捉えます。

challenge icon

チャレンジ

中級

サクランボ農園では、霜が降りる可能性のある夜に防霜ファンを稼働させます。スターターコードでは、logistic と knn の2つの霜予測モデルを学習させ、グラフを準備しています。

  1. draw_roc(model, name) を記述します。この関数は、ax にモデルのROC曲線を描画し、name をラベルとして付け、以下のようにAUCを出力します。
  2. 両方のモデルについてこの関数を呼び出し、破線の対角線に coin toss というラベルを付けて凡例を追加し、グラフを表示します。

地滑りモデルの場合:

logistic AUC: 0.869
k-NN AUC: 0.924

その後、Coddyがあなたのグラフを説明します。Coddyのグラフは次のようになります。

「地滑り警報」というタイトルのROC曲線:段階状の青いlogistic曲線と、角が少ないオレンジ色のk-NN曲線。どちらも破線の緑色のコイントス対角線を大きく上回り、凡例が付いている

自分で試してみよう

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import roc_curve, roc_auc_score

# サクランボ農園の春の夜ごとに1行:frost の 1 は夜明け前に霜が降りたことを意味する
nights = pd.read_csv("frost.csv")
features = ["temp_6pm_c", "humidity_pct", "wind_kmh", "cloud_pct"]
X_train, X_test, y_train, y_test = train_test_split(
    nights[features], nights["frost"], test_size=0.25, random_state=0, stratify=nights["frost"])
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 2つの霜予測モデル
logistic = LogisticRegression(max_iter=1000)
logistic.fit(X_train, y_train)
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)

fig, ax = plt.subplots()
ax.set_title("Frost Warnings")
ax.set_xlabel("False positive rate")
ax.set_ylabel("Recall")

# 以下にコードを書いてください
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

教師あり学習のすべてのレッスン

自分で練習してみよう: Pythonオンラインコンパイラ