0Pricing
Python Academy · レッスン

モデル評価と交差検証

正解率、F1、ROC-AUC、k 分割交差検証でモデルを評価します。

「モデル評価と交差検証」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。

訓練・検証・テスト分割

3つに分割します。訓練用データで学習し、検証用データでハイパーパラメーターを調整し、テスト用データで最終的な性能を報告します。開発中にテストセットを使ってはいけません。

from sklearn.model_selection import train_test_split
import numpy as np

X = np.random.rand(1000, 10)
y = (X[:,0] > 0.5).astype(int)

X_tr, X_rest, y_tr, y_rest = train_test_split(X, y, test_size=0.3)
X_val, X_te, y_val, y_te = train_test_split(X_rest, y_rest, test_size=0.5)

正解率

accuracy_scoreは、正しく予測できた割合です。クラスの分布が均衡している場合に使用し、不均衡なデータにはF1スコアまたはAUCを使用します。

from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

X, y = make_classification(random_state=0)
X_tr, X_te, y_tr, y_te = train_test_split(X, y, random_state=0)
model = LogisticRegression().fit(X_tr, y_tr)
print("Accuracy:", accuracy_score(y_te, model.predict(X_te)))

適合率・再現率・F1

クラスが不均衡な場合、適合率 = TP/(TP+FP)、再現率 = TP/(TP+FN)、F1 = 適合率と再現率の調和平均です。

from sklearn.metrics import precision_score, recall_score, f1_score, classification_report

# Use classification_report for a full summary:
print(classification_report(y_te, model.predict(X_te)))
# shows precision, recall, f1 for each class

混同行列

混同行列は、真陽性、偽陽性、真陰性、偽陰性を示します。

from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
import matplotlib.pyplot as plt

cm = confusion_matrix(y_te, model.predict(X_te))
print(cm)
# [[TN FP]
#  [FN TP]]

ROC曲線とAUC

roc_auc_scoreは、ROC曲線の下の面積を測定します。AUC = 1.0は完全な性能、0.5はランダムな予測を意味します。

from sklearn.metrics import roc_auc_score, roc_curve

y_prob = model.predict_proba(X_te)[:,1]
print("AUC:", roc_auc_score(y_te, y_prob))

fpr, tpr, thresholds = roc_curve(y_te, y_prob)
# plot fpr vs tpr for the full ROC curve

回帰の評価指標

回帰タスクには、mean_squared_error(MSE)、root_mean_squared_error(RMSE)、r2_scoreを使用します。

from sklearn.metrics import mean_squared_error, r2_score

y_pred = regression_model.predict(X_te)
mse = mean_squared_error(y_te, y_pred)
print("RMSE:", mse**0.5)
print("R²:", r2_score(y_te, y_pred))

k分割交差検証

cross_val_scoreはデータをk個のフォールドに分割し、k-1個で学習して1個で評価する処理をk回繰り返します。1回だけ分割する方法より堅牢です。

from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification

X, y = make_classification(random_state=0)
scores = cross_val_score(LogisticRegression(), X, y, cv=10, scoring="accuracy")
print(f"{scores.mean():.3f} ± {scores.std():.3f}")

StratifiedKFold

StratifiedKFoldを使うと、各フォールドのクラス分布を同じにできます。不均衡なデータセットでは特に重要です。

from sklearn.model_selection import StratifiedKFold, cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification

X, y = make_classification(weights=[0.9,0.1], random_state=0)
cv = StratifiedKFold(n_splits=5)
scores = cross_val_score(LogisticRegression(), X, y, cv=cv, scoring="f1")
print("Stratified F1:", scores.mean())

バイアスと分散のトレードオフ

バイアスが高いと過少適合になります。つまり、モデルが単純すぎます。分散が高いと過学習になります。つまり、モデルが複雑すぎます。交差検証によって、どちらの問題が起きているかを確認できます。

# Underfitting: low train score AND low val score
# → increase model complexity, add features

# Overfitting: high train score, low val score
# → regularise, reduce complexity, get more data

from sklearn.model_selection import validation_curve
import numpy as np

train_sc, val_sc = validation_curve(DecisionTreeClassifier(), X, y, param_name="max_depth", param_range=range(1,10))

ネストされた交差検証

偏りのないハイパーパラメーター調整と評価を行うには、ネストされたCVを使用します。内側のループで調整し、外側のループで評価します。

from sklearn.model_selection import cross_val_score, GridSearchCV
from sklearn.svm import SVC
from sklearn.datasets import make_classification

X, y = make_classification(random_state=0)
gs = GridSearchCV(SVC(), {"C":[0.1,1,10]}, cv=5)
outer_scores = cross_val_score(gs, X, y, cv=5)
print("Nested CV accuracy:", outer_scores.mean())

キャリブレーション

分類器が出力する確率の推定値は、適切にキャリブレーションされていない場合があります。より適切な確率推定値を得るには、CalibratedClassifierCVを使用します。

from sklearn.calibration import CalibratedClassifierCV
from sklearn.svm import SVC
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

X, y = make_classification(random_state=0)
X_tr, X_te, y_tr, y_te = train_test_split(X, y)

cal = CalibratedClassifierCV(SVC(), cv=5).fit(X_tr, y_tr)
print(cal.predict_proba(X_te[:3]))

確認問題

モデルの評価で、単一の訓練・テスト分割より交差検証が推奨されるのはなぜですか。

まとめ

クラスが均衡している問題には正解率、不均衡な問題にはF1またはAUCを使用します。k分割のcross_val_scoreで評価し、不均衡なデータにはStratifiedKFoldを使用します。ハイパーパラメーターを調整する場合は、偏りのない最終推定値を得るためにネストされたCVを使用します。開発中にテストセットを決して覗いてはいけません。

よくある質問

「モデル評価と交差検証」レッスンは無料ですか?

はい。「モデル評価と交差検証」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。

「モデル評価と交差検証」で何を学びますか?

正解率、F1、ROC-AUC、k 分割交差検証でモデルを評価します。 ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Python Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「モデル評価と交差検証」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPython Academyレッスンでコードを書いて実行できますか?

はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. scikit-learn API: fit、transform、predict
  2. 線形モデル: 回帰と分類
  3. 木ベースモデル: 決定木とランダムフォレスト
  4. モデル評価と交差検証
← Python Academyに戻る