演習:scikit-learnを用いた多項式回帰

演習:多項式回帰では, 理解のために自分でプログラムを作成したが, scikit-learnという便利な機械学習ライブラリを使えば簡単に線形回帰を行うことができるので, 使い方を覚える目的でここでも同じ多項式回帰を行う.

下記のようにライブラリのインポートが必要

#%matplotlib inline    # jupyter notebookでは必要.JupyterLabでは不要
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression    # LinearRegressionのインポート
from sklearn.preprocessing import PolynomialFeatures # PolynomialFeaturesのインポート

参考

演習1:データの準備

演習:多項式回帰と同様にsin関数にガウスノイズを加えたデータを10点用意してプロットせよ. ただの復習.

xa = ???
yt = ???
x = ???
tt = ???
err = ???
t = tt + err
plt.plot(xa, yt)
plt.plot(x, t, 'o')

演習2:計画行列

まず復習と比較のために演習:多項式回帰と同様に計画行列を作成して表示する. 多項式の次数はとりあえず$M = 3$を用いる.

# ---------- 計画行列dmatを返す関数
def design_matrix(x, M):
    ???? # ここにコードを書く
    ????
    return dmat
# ---------- 多項式の次数を指定
M = 3
# ---------- 計画行列を上で作った関数を使って計算
phi = design_matrix(x, M)
phi    # jupyterで表示用

scikit-learnのPolynomialFeatures の簡単な使い方をここで確認する.

N行1列の2次元配列を入力にした例(列が1列だけじゃない場合も扱えるがここでは触れない)

test_x = np.array([1, 2, 3])      # これは1行3列
test_x = test_x.reshape(-1, 1)    # 3行1列の2次元配列にreshape
test_x    # ノートブックで表示用
test_pf = PolynomialFeatures(degree=3)    # インスタンス化
test_phi = test_pf.fit_transform(test_x)  # fitしてtransform
test_phi     # jupyterで表示用

この例を参考に,実際に計画行列を作成せよ.

# ---------- 計画行列を返す関数
def polymat(x, m):
    pf = ???
    dmat = ????
    return dmat

$M = 3$で実際に計画行列を作成し,上記手動で計算したものと比較する.

M = 3
phi = design_matrix(x, M)
phi    # ノートブックで表示用

演習3:LinearRegressionを用いた回帰

演習2で計算した計画行列,LinearRegressionを用いて回帰を行い予測モデルをプロットせよ.

sklearn.linear_model.LinearRegression(fit_intercept=True, normalize=False, copy_X=True, n_jobs=None)

fit_intercept=はintercept,つまり切片(定数項)をいれるか入れないかの指定.他のオプションで規格化するかしないかなどの指定もあるが,ここでは触れない. 例えば,$x_1$と$x_2$という特徴量(記述子)を用意した場合,

  • fit_intercept=True –> $y = w_0 + w_1 x_1 + w_2 x_2$
  • fit_intercept=False –> $y = w_1 x_1 + w_2 x_2$

となる.

簡単な使い方を述べると,計画行列とターゲット(目的変数)ベクトルを LinearRegression.fit()の引数にするだけ.

lr = LinearRegression()    # インスタンス化
lr.fit(X, t)    # 計画行列とターゲットベクトルを入れてフィッティング

これで係数(上の式で言うと$w$)が決まる. このときの係数と切片(定数項)は,それぞれ

  • lr.coef_
  • lr.intercept_

に入っている.また,係数が計算されてインスタンスに保存されているので, あたらしい入力(X2とする)からLinearRegression.predict()を用いてモデル予測ができる.

lr.predict(X2)

演習2で計算した3次多項式の計画行列およびLinearRegressionを用いて回帰を行う. 今回の計画行列は定数項($x^0$の項)を含んでいるので,fit_intercept=Falseにして使う.

lr = ???    # インスタンス化
lr.fit(???) # fit

フィッティング後,係数と切片(今回はfit_intercept=Falseにしたので当然ゼロ)を確認する.

lr.coef_    # jupyterで表示用
lr.intercept_    # jupyterで表示用

予測モデルができたので,プロットする.

phi2 = ???    # xaの計画行列phi2
y = ???       # predict

plt.plot(xa, yt)    # 元になるsin関数をプロット
plt.plot(x, t, 'o') # データ10点をプロット
plt.plot(xa, y)     # 予測モデルをプロット

演習4:0次,1次,3次,9次の多項式回帰

3次の回帰ができたら,0次,1次,3次,9次で同様に回帰を行い, まとめてグラフにプロットせよ.

前へ
次へ