Sklearn モデル評価とチューニング

機械学習モデルの評価とチューニングは、モデルの汎化能力と予測精度を確保するための重要なステップです。

適切な評価指標とチューニング方法を用いることで、モデルの性能を効果的に向上させ、過学習や未学習のリスクを回避できます。

この章では、交差検証、グリッドサーチ、ランダムサーチ、モデル評価方法などについて詳しく説明します。


1、交差検証

交差検証の概念の紹介

交差検証(Cross-Validation)は、モデルの性能を評価するための手法です。データセットを複数のサブセット(フォールド)に分割し、モデルを複数回トレーニングおよびテストすることで、より安定した信頼性の高い評価結果を得られます。

交差検証は、モデルが過学習しているかどうかを検出するのに役立ち、モデルの汎化能力をより正確に評価できます。

一般的な交差検証の方法には以下のものがあります:

  • K-fold 交差検証:データを K 個のフォールドに分割し、その中の 1 つをテストセット、残りの K-1 個をトレーニングセットとして選択することを K 回繰り返し、最後に K 回の結果の平均値を計算します。
  • リーブワンアウト交差検証(Leave-One-Out Cross-Validation, LOOCV):毎回 1 つのデータポイントだけをテストセットとして残し、残りをトレーニングセットとします。この方法は非常に時間がかかりますが、小さなデータセットに使用できます。
  • 層化 K-fold 交差検証:K-fold において、各フォールドのクラス分布がデータセット全体と類似するようにします。クラスの不均衡がある場合に適しています。

scikit-learn は、cross_val_score や cross_val_predict など、さまざまな交差検証の方法を提供しており、効率的に交差検証を行うのに役立ちます。

cross_val_score を使用した K-fold 交差検証の実行

cross_val_score 関数は K-fold 交差検証を実行するために使用され、各フォールドのスコア結果を返し、モデルの安定性と性能を評価するのに役立ちます。

cross_val_score を使用して K-fold 交差検証を実行する:

例

from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris

# データを読み込む
data = load_iris()
X, y = data.data, data.target

# モデルを作成する
model = RandomForestClassifier()

# K-fold 交差検証を実行する
scores = cross_val_score(model, X, y, cv=5)  # 5-fold 交差検証
print(f"Cross-validation scores: {scores}")
print(f"Mean accuracy: {scores.mean()}")
  • cv=5:5 分割の交差検証を行うことを示します。
  • scores:各フォールドのスコアを返し、最終結果はこれらのスコアの平均値で、モデルの性能を示します。

出力は以下のようになります:

Cross-validation scores: [0.96666667 0.96666667 0.93333333 0.96666667 1.        ]
Mean accuracy: 0.9666666666666668

2、グリッドサーチとランダムサーチ

GridSearchCV を使用したハイパーパラメータのチューニング

GridSearchCV は、すべてのハイパーパラメータの組み合わせを網羅的に検索して、最適なハイパーパラメータを見つける手法です。

GridSearchCV は、パラメータの候補値のセットを提供し、各組み合わせの性能を計算して、最終的に最適なパラメータの組み合わせを選択します。

GridSearchCV の一般的なパラメータ:

  • param_grid:チューニング対象のハイパーパラメータグリッド。通常は辞書で、キーはパラメータ名、値はパラメータの候補値です。
  • cv:交差検証の分割数。通常は 5 または 10 に設定します。

scikit-learn で GridSearchCV を使用する例:

例

from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
from sklearn.datasets import load_iris

# データを読み込む
data = load_iris()
X, y = data.data, data.target

# モデルを作成する
model = SVC()

# ハイパーパラメータグリッドを定義する
param_grid = {'kernel': ['linear', 'rbf'], 'C': [1, 10, 100]}

# グリッドサーチを実行する
grid_search = GridSearchCV(model, param_grid, cv=5)
grid_search.fit(X, y)

# 最適なパラメータと最適なスコアを出力する
print(f"Best parameters: {grid_search.best_params_}")
print(f"Best score: {grid_search.best_score_}")
  • grid_search.best_params_:グリッドサーチで最も良いパフォーマンスを示したハイパーパラメータの組み合わせを返します。
  • grid_search.best_score_:最適なパラメータの組み合わせにおける交差検証スコアを返します。

出力は以下のようになります:

Best parameters: {'C': 1, 'kernel': 'linear'}
Best score: 0.9800000000000001

RandomizedSearchCV を使用したチューニングプロセスの高速化

RandomizedSearchCV は、より効率的なハイパーパラメータのチューニング手法です。ハイパーパラメータ空間から一定数の組み合わせをランダムに選択して評価することで、チューニングプロセスを高速化します。

RandomizedSearchCV は、ハイパーパラメータ空間が大きい場合に適しており、計算時間を節約できます。

RandomizedSearchCV の一般的なパラメータ:

  • param_distributions:チューニング対象のハイパーパラメータ分布。通常は辞書で、値は分布オブジェクト(例:scipy.statsの分布)または離散的な値のリストにすることができます。
  • n_iter:ランダムサーチの反復回数、つまりランダムに選択されるハイパーパラメータの組み合わせの数です。

scikit-learn で RandomizedSearchCV を使用する例:

例

from sklearn.model_selection import RandomizedSearchCV
from sklearn.svm import SVC
from sklearn.datasets import load_iris
from scipy.stats import uniform

# データを読み込む
data = load_iris()
X, y = data.data, data.target

# モデルを作成する
model = SVC()

# ハイパーパラメータ分布を定義する
param_distributions = {'C': uniform(0, 10), 'kernel': ['linear', 'rbf']}

# ランダムサーチを実行する
random_search = RandomizedSearchCV(model, param_distributions, n_iter=10, cv=5)
random_search.fit(X, y)

# 最適なパラメータと最適なスコアを出力する
print(f"Best parameters: {random_search.best_params_}")
print(f"Best score: {random_search.best_score_}")
  • random_search.best_params_:ランダムサーチで最も良いパフォーマンスを示したハイパーパラメータの組み合わせを返します。
  • random_search.best_score_:最適なパラメータの組み合わせにおける交差検証スコアを返します。

出力は以下のようになります:

Best parameters: {'C': 8.355688344706016, 'kernel': 'rbf'}
Best score: 0.9866666666666667

3、モデルの評価

classification_report, confusion_matrix, roc_auc_score の使用

分類モデルの場合、通常は適合率、再現率、F1 スコアなどの指標を使用してモデルの性能を評価します。

scikit-learn は、モデルのパフォーマンスを詳しく理解するのに役立つ多くの評価ツールを提供しています。

classification_report- 適合率、再現率、F1 スコア、サポート(各クラスのサンプル数)などの情報を提供します。

例

from sklearn.metrics import classification_report

# y_test は実際のラベル、y_pred はモデルの予測結果とします
print(classification_report(y_test, y_pred))

confusion_matrix- 混同行列は、分類モデルが各クラスでどのように機能するかを示すために使用されます。特に、正のクラスを負のクラスとして予測する方法、またはその逆を示します。

例

from sklearn.metrics import confusion_matrix

# y_test は実際のラベル、y_pred はモデルの予測結果とします
print(confusion_matrix(y_test, y_pred))

roc_auc_score- ROC AUC(受信者動作特性曲線の下の面積)は、分類モデルの性能を評価する指標であり、不均衡なデータセットに特に適しています。AUC 値が高いほど、モデルの性能が優れています。

例

from sklearn.metrics import roc_auc_score

# y_test は実際のラベル、y_pred_proba はモデルが予測した確率値とします
print(f"ROC AUC Score: {roc_auc_score(y_test, y_pred_proba)}")

回帰モデルの評価:mean_squared_error, r2_score

回帰問題では、一般的な評価指標として 平均二乗誤差(MSE) と 決定係数(R²) があります。

mean_squared_error- 平均二乗誤差は回帰モデルの一般的な評価基準であり、予測値と実際の値の間の二乗誤差の平均を計算します。

例

from sklearn.metrics import mean_squared_error

# y_test は実際の値、y_pred は予測値とします
print(f"Mean Squared Error: {mean_squared_error(y_test, y_pred)}")

r2_score- 決定係数 R² は、モデルがデータにどの程度適合しているかを測定するために使用されます。値が 1 に近いほど、モデルの適合度が高いことを示します。

例

from sklearn.metrics import r2_score

# y_test は実際の値、y_pred は予測値とします
print(f"R² Score: {r2_score(y_test, y_pred)}")
その他の拡張