はじめに
サポートベクター回帰(Support Vector Regression, SVR)は、サポートベクターマシン(SVM)を基にした強力な回帰分析手法です。SVRは、特に非線形な関係性を持つデータセットに対して高い予測精度を提供します。この手法は、データの中からサポートベクターと呼ばれる重要なデータ点を選び出し、それらを使って予渲モデルを構築します。SVRの特徴は、訓練データの外れ値に強く、複雑な非線形関係をモデル化できる点にあります。ここでは、Pythonを使用してSVRモデルを実装する過程を、初心者にもわかりやすく詳細に説明します。
SVRの基本概念
データセットの準備
分析に用いる架空のデータセットを生成します。例えば、ある地域における月ごとの平均気温とアイスクリームの販売数の関係を示すデータセットを考えましょう。気温の上昇がアイスクリーム販売数の増加につながるという直感的な非線形関係を示すデータセットです。
import numpy as np
import pandas as pd
# 架空のデータセットの生成
X = np.array(range(1, 13)).reshape(-1, 1) # 月(1月から12月)
y = np.array([40, 42, 50, 75, 100, 120, 130, 125, 100, 80, 60, 45]).reshape(-1, 1) # アイスクリーム販売数
このデータセットでは、夏にかけてアイスクリームの販売数が増加し、冬になると減少するという季節性のある非線形のパターンを示しています。
特徴量のスケーリング
SVRを適用するにあたって、特徴量と目的変数のスケーリングは非常に重要です。これは、SVRが距離ベースのアルゴリズムであるため、異なるスケールの特徴量を適切に扱うために必要とされます。
from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
sc_y = StandardScaler()
X_scaled = sc_X.fit_transform(X)
y_scaled = sc_y.fit_transform(y)
スケーリングを行うことで、全ての特徴量が同じスケールになり、モデルの学習効率が向上します。
SVRモデルのトレーニング
SVRモデルのトレーニングは、選択したカーネルに基づいて行います。ここでは、非線形データセットによく使用されるRBF(Radial Basis Function)カーネルを用いています。
from sklearn.svm import SVR
regressor = SVR(kernel='rbf')
regressor.fit(X_scaled, y_scaled.ravel())
RBFカーネルは、データセット内の複雑な非線形パターンを捉えるのに適しています。
新しい結果の予測
モデルをトレーニングした後、新しいデータポイントでの予測を行うことができます。予測された値はスケーリングされた値であるため、実際のスケールに戻す必要があります。
y_pred = sc_y.inverse_transform(regressor.predict(sc_X.transform([[7]])).reshape(-1, 1))
print(y_pred)
出力:
[[125.90079203]] #約126個の売り上げがあると予測
このコードは、7月のアイスクリーム販売数の予測を行っています。
SVR結果の可視化
トレーニングデータとSVRモデルによる予測結果を可視化することで、モデルの性能を評価します。
import matplotlib.pyplot as plt
plt.scatter(sc_X.inverse_transform(X_scaled), sc_y.inverse_transform(y_scaled), color='red')
plt.plot(sc_X.inverse_transform(X_scaled), sc_y.inverse_transform(regressor.predict(X_scaled).reshape(-1, 1)), color='blue')
plt.title('Temperature vs Ice Cream Sales (SVR)')
plt.xlabel('Month')
plt.ylabel('Ice Cream Sales')
#目盛りを設定
plt.xticks(np.arange(1, 13, 1))
plt.yticks(np.arange(0, 150, 10))
plt.show()
出力:

このグラフは、トレーニングデータとSVRモデルによる予測の間の関係を示しています。さらに、より滑らかな曲線を得るために、データポイントを細分化してプロットします。
X_grid = np.arange(min(sc_X.inverse_transform(X_scaled)), max(sc_X.inverse_transform(X_scaled)), 0.1)
X_grid = X_grid.reshape((len(X_grid), 1))
plt.scatter(sc_X.inverse_transform(X_scaled), sc_y.inverse_transform(y_scaled), color='red')
plt.plot(X_grid, sc_y.inverse_transform(regressor.predict(sc_X.transform(X_grid)).reshape(-1, 1)), color='blue')
plt.title('Temperature vs Ice Cream Sales (SVR)')
plt.xlabel('Month')
plt.ylabel('Ice Cream Sales')
#目盛りを設定
plt.xticks(np.arange(1, 13, 1))
plt.yticks(np.arange(0, 150, 10))
plt.show()
出力:

まとめ
このホームページでは、サポートベクター回帰(SVR)の基本から始めて、Pythonを使用した実装方法について詳細に説明しました。特徴量のスケーリングからモデルのトレーニング、新しいデータポイントでの予測、結果の可視化までの一連のステップを通じて、SVRの使用方法を学びました。SVRは、非線形関係を持つデータセットに対して強力な予測モデルを提供し、特に外れ値に対する強靭さを持っています。この知識を基に、より複雑なデータセットへの応用や、異なるカーネル関数の試用など、さらなる分析に挑戦してみましょう。
本コンテンツへの意見や質問