モデル評価と交差検証
正解率、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フィードバックを取得できます。ローカル設定は不要です。