サポートベクターマシンによる回帰 | 回帰アルゴリズム | Pythonによる機械学習を学ぶ

スポンサーリンク
スポンサーリンク

サポートベクターマシン(SVM)による回帰

サポートベクターマシン(SVM)は、主に分類タスクでよく使われるアルゴリズムですが、回帰タスクにも利用できます。これをサポートベクター回帰(Support Vector Regression: SVR)と呼びます。SVMの基本的な概念は、データをできるだけ分ける最適な超平面を見つけることですが、回帰タスクでは、データの分布を最もよく表す線(または曲線)を見つけるのが目的です。本記事では、SVRの基本概念とPythonでの実装を紹介します。

サポートベクター回帰(SVR)の基本概念

SVRでは、データの予測に対して許容できる誤差の範囲を設定し、その範囲内に収まるような最適な回帰モデルを作成します。このとき、SVMと同様にサポートベクターというデータポイントが決定的な役割を果たします。

  • データの誤差を一定範囲内に収めることを目指す。
  • 範囲外のデータに対してペナルティを与える。
  • 柔軟に非線形なデータにも対応できる。

この手法は、特に高次元データや非線形データの処理に向いています。カーネル関数を用いることで、データの非線形性を捉えることが可能です。

Pythonでのサポートベクター回帰(SVR)の実装

PythonでSVRを実装するには、scikit-learnライブラリを使用します。まず、必要なライブラリをインポートして、サンプルデータを作成します。

サンプルデータの作成

import numpy as np
import matplotlib.pyplot as plt
from sklearn.svm import SVR
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

# サンプルデータの作成
np.random.seed(0)
X = np.sort(5 * np.random.rand(100, 1), axis=0)
y = np.sin(X).ravel()
y[::5] += 3 * (0.5 - np.random.rand(20))  # ノイズを加える

# 訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

上記のコードでは、sin(x)に基づいたデータを作成し、一部のデータにノイズを加えています。これを訓練データとテストデータに分割します。

SVRモデルの構築

次に、SVRクラスを使用してSVRモデルを構築します。ここでは、線形カーネルを使用します。

# SVRモデルの構築
svr_model = SVR(kernel='rbf', C=100, gamma=0.1, epsilon=0.1)
svr_model.fit(X_train, y_train)

# 予測
y_pred = svr_model.predict(X_test)

# モデルの評価
mse = mean_squared_error(y_test, y_pred)
print(f'SVRのMSE: {mse:.3f}')

この例では、kernel='rbf'(Radial Basis Functionカーネル)を使用して、SVRモデルを構築しています。カーネルには線形やポリノミアルなど他の選択肢もありますが、RBFカーネルは非線形データによく適応します。

結果のプロット

予測結果と実際のデータをプロットし、モデルのパフォーマンスを視覚化します。

# 結果の可視化
plt.figure(figsize=(10, 6))
plt.scatter(X_test, y_test, color='blue', label='True values')
plt.scatter(X_test, y_pred, color='red', label='Predicted values')
plt.xlabel('X')
plt.ylabel('y')
plt.title('Support Vector Regression')
plt.legend()
plt.show()

このコードでは、青が実際の値、赤が予測値を示しています。SVRは非線形なデータにも適応できるため、結果が滑らかに近似されていることが確認できます。

SVRのパラメータ調整

SVRにはいくつかの重要なハイパーパラメータがあり、それらを調整することでモデルの性能を最適化できます。

パラメータ 説明
C マージン違反に対するペナルティの大きさを制御します。大きな値にするとマージンを狭め、精度を高めますが、過学習のリスクも高まります。
epsilon 許容する誤差の範囲を定義します。この範囲内であれば誤差として扱われません。
gamma RBFカーネルのパラメータで、データポイントの影響範囲を制御します。小さな値にすると、広範囲のデータに影響が及びます。

SVRを使う上での注意点

  • パラメータの調整: SVRは他の回帰モデルに比べて、ハイパーパラメータの調整が結果に大きな影響を与えます。特にCgammaの値に敏感です。
  • 計算コスト: 大規模なデータセットでは、SVRは計算コストが高くなるため、データが多い場合には別のアルゴリズムの方が適していることがあります。
  • 非線形データへの対応: カーネル関数をうまく選択することで、SVRは非線形なデータにも対応できます。

まとめ

サポートベクター回帰(SVR)は、非線形な回帰問題に対して有効な手法であり、柔軟なカーネル関数を用いることで、様々なデータに対応できます。パラメータの調整が結果に大きな影響を与えるため、GridSearchCVなどの手法を使って最適なパラメータを見つけることが推奨されます。