Scikit-learn SVRの使い方|ハイパーパラメータ調整から評価までをコードで学ぶ

Python

PythonのScikit-learnで回帰モデルを構築する際、SVR(サポートベクター回帰)は非常に強力な選択肢です。しかし、いざ使ってみると「どのパラメータをどう設定すればいいの?」「作ったモデルの良し悪しをどう判断するの?」といった疑問に突き当たる方も多いのではないでしょうか。

この記事では、そんな悩みを解決するために、SVRの実装から一歩進んだハイパーパラメータ調整、そしてモデルの性能評価までの一連の流れを、具体的なコードを交えながらステップバイステップで解説します。

この記事を読み終える頃には、SVRをただ使うだけでなく、データに合わせてチューニングし、その性能を客観的に評価できるようになっているはずです。

はじめに:SVR(サポートベクター回帰)の基本

SVR(Support Vector Regression)は、分類問題で有名なSVM(サポートベクターマシン)を回帰問題に応用したアルゴリズムです。

SVRの最大の特徴は**「ε-許容マージン」**という考え方です。これは、モデルが予測した線から一定の幅(εの幅)に収まる誤差は許容し、そのマージンから外れたデータ点に対してのみペナルティを課して学習を進める仕組みです。

この仕組みにより、外れ値やノイズに対して比較的強い(ロバストな)モデルを構築できます。

Step 1: 準備 – データとライブラリ

まずは、SVRを動かすための準備をしましょう。必要なライブラリをインポートし、分析に使うサンプルデータを生成します。

必要なライブラリのインポート

今回はSVR本体に加え、ハイパーパラメータ調整を自動化するGridSearchCVも使います。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.svm import SVR
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.datasets import make_regression
from sklearn.preprocessing import StandardScaler

サンプルデータの作成と分割

Scikit-learnmake_regressionで、回帰用のランダムなデータを生成します。SVRは特徴量のスケールに影響を受けやすいため、StandardScalerを使って標準化(スケーリング)も行いましょう。

# 1. サンプルデータの生成
X, y = make_regression(n_samples=100, n_features=1, noise=15, random_state=42)

# 2. データの分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 3. データの前処理(スケーリング)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

Step 2: SVRの基本的な実装

準備ができたので、まずはデフォルトのパラメータでSVRを動かしてみましょう。ここをベースラインとして、後ほどチューニングでどれだけ改善されるかを確認します。

デフォルト設定でモデルを学習・予測

SVR()をインスタンス化し、fit()で学習、predict()で予測します。この流れはScikit-learnの他のモデルと全く同じです。

# デフォルトのSVRモデルを作成
default_svr = SVR()

# モデルを学習
default_svr.fit(X_train_scaled, y_train)

# テストデータで予測
y_pred_default = default_svr.predict(X_test_scaled)

結果を可視化

学習したモデルがどのような予測線を描くか、グラフで確認してみましょう。

# 元のスケールに戻してプロットするために、テストデータ全体を予測
X_scaled = scaler.transform(X)
y_pred_all = default_svr.predict(X_scaled)

# 結果のプロット
plt.scatter(X, y, color='blue', label='元データ', alpha=0.6)
# 予測結果をソートして線としてプロット
sort_idx = X.flatten().argsort()
plt.plot(X[sort_idx], y_pred_all[sort_idx], color='red', label='SVR (Default)')
plt.title('デフォルト設定でのSVR予測')
plt.xlabel('特徴量 (X)')
plt.ylabel('目的変数 (y)')
plt.legend()
plt.grid(True)
plt.show()

デフォルト設定でも、ある程度データに追従した予測ができていることがわかります。

Step 3: ハイパーパラメータ調整で精度を上げる

ここからが本題です。SVRの性能を最大限に引き出すために、ハイパーパラメータを調整していきます。

SVRの主要ハイパーパラメータ

特に重要なのは以下の3つです。

  • C (正則化パラメータ): 誤差に対するペナルティの大きさを決めます。値が大きいほど、訓練データに厳密にフィットしようとします(過学習のリスク増)。
  • gamma (カーネル係数): 1つのデータが影響を及ぼす範囲を決めます(rbfカーネルの場合)。値が大きいほど、影響範囲が狭くなり、より複雑な決定境界を作ります。
  • epsilon (ε): 誤差を許容するマージンの幅を決めます。

これらのパラメータを網羅的に探索し、最適な組み合わせを見つけるためにGridSearchCVを使います。

GridSearchCVを使った最適なパラメータ探索

GridSearchCVは、指定したパラメータの組み合わせをすべて試し(クロスバリデーション)、最も性能が良かったものを自動で見つけてくれる便利なツールです。

# 1. 探索するハイパーパラメータの候補を辞書で定義
param_grid = {
    'C': [0.1, 1, 10, 100, 1000],
    'gamma': [1, 0.1, 0.01, 0.001],
    'epsilon': [0.1, 0.05, 0.01]
}

# 2. GridSearchCVオブジェクトを作成
# cv=5は5分割交差検証を意味する
grid_search = GridSearchCV(SVR(kernel='rbf'), param_grid, cv=5, 
                           scoring='neg_mean_squared_error', verbose=1, n_jobs=-1)

# 3. グリッドサーチを実行
grid_search.fit(X_train_scaled, y_train)

# 4. 最適なパラメータの表示
print("最適なハイパーパラメータ:", grid_search.best_params_)

# 最適なモデルを取得
best_svr = grid_search.best_estimator_

最適なパラメータでモデルを再学習・予測

GridSearchCVが見つけてくれた最適なパラメータを使って、予測を行います。grid_search.best_estimator_には、最適なパラメータで再学習済みのモデルが格納されています。

# 最適なモデルで予測
y_pred_best = best_svr.predict(X_test_scaled)

Step 4: モデルの性能を評価する

最後に、チューニングによってモデルの性能が本当に向上したのかを、客観的な数値指標で評価します。

回帰モデルの代表的な評価指標

  • 平均二乗誤差 (MSE: Mean Squared Error): 予測値と実際の値の差の二乗の平均。0に近いほど良いモデルです。
  • 決定係数 (R² Score): モデルがデータのばらつきをどれだけ説明できているかを示す指標。1に近いほど良いモデルです。

チューニング前後でのスコア比較

デフォルトモデルと、チューニング後の最適モデルのスコアをそれぞれ計算して比較してみましょう。

# デフォルトモデルの評価
mse_default = mean_squared_error(y_test, y_pred_default)
r2_default = r2_score(y_test, y_pred_default)

# 最適モデルの評価
mse_best = mean_squared_error(y_test, y_pred_best)
r2_best = r2_score(y_test, y_pred_best)

print("--- デフォルトモデル ---")
print(f"MSE: {mse_default:.2f}")
print(f"R2スコア: {r2_default:.2f}")

print("\n--- チューニング後モデル ---")
print(f"MSE: {mse_best:.2f}")
print(f"R2スコア: {r2_best:.2f}")

多くの場合、GridSearchCVによるチューニングでMSEが減少し、R2スコアが1に近づくはずです。これにより、ハイパーパラメータ調整の有効性を確認できます。

まとめ

本記事では、Scikit-learnのSVRについて、基本的な使い方からハイパーパラメータ調整、性能評価までの一連のプロセスをコードと共に解説しました。

  • Step 1: 準備: データを読み込み、必要に応じてスケーリングを行う。
  • Step 2: 基本実装: まずはデフォルト設定でモデルを動かしてみる。
  • Step 3: 調整: GridSearchCVを使い、C, gamma, epsilonなどの主要パラメータの最適な組み合わせを探す。
  • Step 4: 評価: MSEやR2スコアなどの指標を用いて、チューニング前後の性能を客観的に比較する。

SVRは強力なアルゴリズムですが、その真価は適切なハイパーパラメータ調整によって発揮されます。この流れをマスターすれば、SVRをより効果的に活用できるだけでなく、他の機械学習モデルを扱う上でも応用が効くはずです。ぜひ、ご自身のデータでこの手順を試してみてください。

コメント

タイトルとURLをコピーしました