人工知能してみる

人工知能の中の人が機械学習とか統計とかAI的なことを書き連ねます

SVR: サポートベクター回帰を使ってみる

回帰の問題を解く機会があったので非線形な回帰を解けるSVR: サポートベクター回帰を触ったのでメモします。

SVR: サポートベクター回帰とは?

サポートベクター回帰サポートベクターマシンの回帰版で、カーネルトリックを使って回帰式を解くことで非線形な問題を解決します。
SVMがマージンの最大化と誤推計サンプルを減らすように学習するように、重みの最小化と誤差の最小化で学習します。
誤差の小さい部分を無視することでロバスト性を向上させているようです。

SVRを使ってみた

SVRを使うのは簡単でscikit-learnから呼びだすことができます。

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, cross_validation

# sinカーブにノイズを加えた教師データの作成
x = np.sort(np.random.uniform(-np.pi, np.pi, 1000))
y = np.sin(x) + 0.1 * np.random.normal(size=len(x))
x = x.reshape((len(x), 1))

# 8:2で訓練と評価データに分割
x_train, x_test, y_train, y_test = cross_validation.train_test_split(x, y, test_size=0.2)

# 学習
reg = svm.SVR(kernel='rbf', C=1).fit(x_train, y_train)
y_rbf = reg.fit(x, y).predict(x)

# グラフにプロット
plt.plot(x, y, 'o')
plt.plot(x, y_rbf, color='red', label='SVR(RBF)')
plt.plot(x, np.sin(x), color='yellow', label='sin')
plt.show()

得られたグラフはこんな感じです。赤線がSVRで黄色線が実際のsinカーブです。 f:id:Grahamian:20180321211541p:plain

実際の問題を解く際はパラメータをGrid Searchする必要あるようです。
回帰というと重回帰分析が有名ですが非線形問題を解決する手段のベーシックな方法として使いたいですね。