LoginSignup
4
2

More than 5 years have passed since last update.

# scikit-learnで多項式回帰を行う

Last updated at Posted at 2018-08-19

やること

  • ElasticNetを用いた多項式回帰
  • 多項式回帰モデルよるの予測(プロット含む) # 学習データ

データ生成に用いた式としては

y = 2x^2 + 3x + 1

にガウスノイズを加えたものを用いる。

学習データ数は100である。

予測用に用いたデータは同じ式を用いて新たに生成し,
50個用意した

xb2 =  10 * np.random.rand(100, 1)
yb2 =  xb2**2 + 3.05*xb2 + 1.1 + np.random.randn(100,1) 

plt.scatter(xb2,yb2,c = "b")

04-1.png

多項式回帰のための準備

データX(説明変数)の次元は1だが、データを観る限り、
2次多項式から生成されているっぽい。

sklearnのPolinomialFeaturesの機能を用いて、
元のデータを二乗したものを新たな特徴量として加える。

from sklearn.preprocessing import PolynomialFeatures as PF

pf = PF(degree=2, include_bias = False)
xb2_poly = pf.fit_transform(xb2)


Elastic-Netによる学習

今回使うモデルは、リッジ回帰、Lasso回帰等とならび、
基本的は学習で最小化すべきコスト関数に正則化項(制約)
を加えることで、過学習を防ぐ。
Elastic Netは、リッジ回帰とLasso回帰どちらにも用いられる

今回は単純なデータなので、2次多項式で回帰すべきだという判断がつけやすいが、
実際はより特徴量がもっと多いことが殆どなので、これは役立つ。


J(\theta) = MSE(θ) + r\alpha \sum_i^n|\theta_i| + \frac{1- r}{2} \alpha \sum_i^n \theta^2_i
\\

*MSE(\theta):最小二乗法誤差。
\\
制約を加えない場合によく用いられるコスト関数。

このElastic Netでは、パラメータとして、制約の程度を表すαと、
リッジ回帰、lasso回帰のどちらを重視すべきかを決めるrを
定める必要がある。これは、グリッドサーチなどを用いて、
実際にどのパラメータを用いた時に予測性能が良いかを探る必要がある。

今回はElastic Netを用いたが、以下のチートシート等を用いて、
どのモデルを用いるべきかの判断を行う。

cheet.png


from sklearn.linear_model import ElasticNet


e_net = ElasticNet(alpha = 0.1, l1_ratio = 0.5)
e_net.fit(xb2_poly, yb2)


予測

あとは、前述した予測用データを用いて予測を行う。
この際、numpyのソート等を用いて、説明変数の順番を昇順にしておく必要がある。

xb2_t = 10* np.random.rand(50, 1)
print("xb2_t\n",xb2_t.shape)
#np.sortの使い方注意
xb2_t = np.array([np.sort(xb2_t[:,0])]).reshape(50,1)
print("xb2_t after\n", xb2_t.shape)
xb2t_poly = pf.fit_transform(xb2_t)
yb2_pred = e_net.predict(xb2t_poly)

plt.scatter(xb2,yb2,color = "blue")
plt.plot(xb2_t,yb2_pred,"red")
plt.show()

04-2.png

参考

scikit-learnとTensorFlowによる実践機械学習
Aurélien Géron 著、下田 倫大 監訳、長尾 高弘 訳
https://www.oreilly.co.jp/books/9784873118345/

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2