機械学習2:非線形回帰モデル

要点まとめ

線形では表現しきれない現象に対して、非線形回帰モデリングを実施する。代表的な非線形関数には、多項式関数、ガウス型基底関数等があるが、非線形関数を一般的に  \phi をすると、線形モデルのパラメータが \hat{\boldsymbol{w}} = (\boldsymbol{X}^{(train)T} \boldsymbol{X}^{(train)})^{-1} \boldsymbol{X}^{(train)T} \boldsymbol{y}^{(train)} と表されたのと同様に、非線形回帰モデルのパラメータも  (\boldsymbol{\Phi}^{(train)T} \boldsymbol{\Phi}^{(train)})^{-1} \boldsymbol{\Phi}^{(train)T}  \boldsymbol{y}^{(train)}と表すことができる。

また、非線形化で表現力が高いモデルを使用したときに発生する問題として過学習(Overfitting)があるが、正則化項を導入することで表現力を抑止することで表現力を抑止することが可能。

Pythonで実装する場合

alpha で重みをつける。

from sklearn.metrics.pairwise import rbf_kernel
from sklearn.linear_model import Lasso

kx = rbf_kernel(x_train, y_train, gamma=5)
lasso_clf = Lasso(alpha=0.0001, max_iter=1000)
lasso_clf.fit(x_train, y_train)
y_predict = ctf.predict(x_valid)

'rbf' ガウス基底カーネル, 重み =0.0002 重みを下げるとオーバーフィッティング、上げると未学習。

from sklearn.kernel_ridge import KernelRidge

# kernel
clf = KernelRidge(alpha=0.0002, kernel='rbf')
clf.fit(x_train, y_train)
y_predict = clf.predict(x_valid)
  • Reidge正則化 + rbf の別実装 こちらは rbf_kernel に データのサイズを渡さなければならない。
from sklearn.metrics.pairwise import rbf_kernel
from sklearn.linear_model import Ridge
kx = rbf_kernel(X=data, Y=data, gamma=50)
# K(x, y) = exp(-gamma ||x-y||^2)

clf = Ridge(alpha=30)
clf.fit(x_train, y_train)

y_predict= clf.predict(x_valid)
  • 多項式関数を次数を1~9まで振る Pipeline というのを使うと簡潔に書けるようだ。
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline
deg = [1,2,3,4,5,6,7,8,9,10]
for d in deg:
    regr = Pipeline([
        ('poly', PolynomialFeatures(degree=d)),
        ('linear', LinearRegression())
    ])
    regr.fit(x_train, y_train)
    y_predict = regr.predict(y_valid)
  • サポートベクタ回帰というのもあるらしい

金子先生が資料を公表してくださっている。

datachemeng.com

コードはまだ咀嚼できていない。

from sklearn import model_selection, preprocessing, linear_model, svm

# SVR-rbf
clf_svr = svm.SVR(kernel='rbf', C=1e3, gamma=0.1, epsilon=0.1)
clf_svr.fit(data, target)
y_rbf = clf_svr.fit(data, target).predict(data)
 
# plot

plt.scatter(data, target, color='darkorange', label='data')
plt.plot(data, y_rbf, color='red', label='Support Vector Regression (RBF)')
plt.legend()
plt.show()

演習実施

f:id:yui-gen-ron:20211112011334p:plain

非線形回帰モデルの数式

非線形関数を\phiとすると、非線形モデルはこの様に表現できる。

 
  \displaystyle 
    \boldsymbol{y}_i = f(\boldsymbol{x}_i) + \varepsilon_i \\
    = w_0 + \sum_{j=1}^m w_j \phi_j(\boldsymbol{x}_i) + \varepsilon_i

代表的な非線形関数

 
  \displaystyle 
  \phi_j(x) = x^j

 
  \displaystyle 
  \phi_j(x) = \exp \Bigl( \frac{(x-\mu_j)^2}{2h_j} \Bigr)

パラメータは線形回帰モデルと同様な形で求められる。

  • 説明変数
 
  \displaystyle 
  \boldsymbol{x}_i = (x_{i1}, x_{i2}, \cdots , x_{im}) \in \mathbb{R}

 
  \displaystyle 
  \boldsymbol{\phi}(x_i) = (\phi_1(\boldsymbol{x}_i), \phi_2(\boldsymbol{x}_i), \cdots, \phi_k(\boldsymbol{x}_i))^T \in \mathbb{R}^k

 
  \displaystyle 
  \boldsymbol{\Phi}^{(train)} = (\boldsymbol{\phi}(\boldsymbol{x}_1), \boldsymbol{\phi}(\boldsymbol{x}_2),  \cdots , \boldsymbol{\phi}(\boldsymbol{x}_n))^T \in \mathbb{R}^{n \times k}

  • 最尤法による予測値
 
  \displaystyle 
  \hat{\boldsymbol{y}} = (\boldsymbol{\Phi}^{(train)T} \boldsymbol{\Phi}^{(train)})^{-1} \boldsymbol{\Phi}^{(train)T} \boldsymbol{y}^{(train)}

未学習と過学習

基本的な概念は略す。対策だけ列挙する。

未学習が発生したときの対策

  • モデルの表現力が低いため、表現力の高いモデルを利用する。

過学習が発生したときの対策

  • 学習データの数を増やす

  • 不要な基底関数(変数)を削除して表現力を抑止

  • 正則化法を利用して表現力を抑止

正則化

「モデルの複雑さに伴って、その値が大きくなる正則化項(罰則項)を課した関数」を最小化する。

一次正則化

 
  \displaystyle 
  \lambda \sum_{i=1}^n |w_i|

  • Lasso推定量
  • 0になるパラメータを増やす、 スパース推定

二次正則化

 
  \displaystyle 
  \frac{\lambda}{2} \sum_{i=1}^n |w_i|^2

  • Ridge推定量
  • パラメータを0に近づける、 縮小推定

バイアス・バリアンス分解

バイアス-バリアンス分解:機械学習の性能評価 - HELLO CYBERNETICS

検証方法

ホールドアウト法の特性
  • 学習用を多くすればテスト用が減り学習精度は良くなるが、性能評価の精度は悪くなる
  • 逆にテスト用を多くすれば学習用が減少するので、学習そのものの精度が悪くなることになる。
  • 手元にデータが大量にある場合を除いて、良い性能評価を与えないという欠点がある。
クロスバリデーション (CV) 法の特性
  • 時間がかかる
グリッドサーチとは
  • 全てのチューニングパラメータの組み合わせで評価値を算出

  • 最も良い評価値を持つチューニングパラメータを持つ組み合わせを、「いいモデルのパラメータ」として採用