SVRのPython実装

目次

はじめに

サポートベクター回帰(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は、非線形関係を持つデータセットに対して強力な予測モデルを提供し、特に外れ値に対する強靭さを持っています。この知識を基に、より複雑なデータセットへの応用や、異なるカーネル関数の試用など、さらなる分析に挑戦してみましょう。

この記事が気に入ったら
フォローしてね!

この記事が参考になった方はシェアしてね!
  • URLをコピーしました!

本コンテンツへの意見や質問

コメントする

目次