sklearnによる回帰問題(線形回帰と多項式回帰)

udemyのdata science A-Zの回帰の問題が終わりましたのでその進捗と学んだことを応用して回帰してみたいと思います。

たぶんですが、この講義は原理を理解している人がやるとスムーズなのでしょうね。 原理を知った上で、じゃあプログラミングはどうやろうか知りたい人だとスムーズに進むと思います。 僕はいまいち理解していないことが多かったため、プラスαでなにをしているのか調べることに結構時間かかりました。

regression

回帰というのは従属変数yと独立変数\bf{X}の間にモデルを当てはめるということ。 \bf{X}yがあたえられたとき、y = f(\bf{X}, \beta) と表すことができるような、 \betaを探しだす。

y = \bf{X}  \beta
 \betaが未知のパラメータ、求めたいパラメータでスカラもしくはベクトルになります。

線形回帰

今回はLinearRegression 線形回帰のみ考えたいと思います。

 y= \beta_1  x_1 + \beta_0 のようなモデルは単回帰を表します。

このようにy = f(x) で表されるモデルにはあるパターンがあります。 xが2次元以上のものは重回帰と呼ぶようです。  y =  \beta_0 + \beta_1 x_1  + \beta_2 x_2

xが多項式となる場合は多項式回帰となります。  y =  \beta_0 + \beta_1 x_1  + \beta_2  {x_1}^2 このモデルをフィットさせると直線にはならないのですが、\betaに関してはLinearなためLinear Regressionだそうです。

どのモデルがうまくフィットするのか考えることが重要です。

近似方法

さてモデルを考えたら係数を求めていくわけですが、その際に使用する手法は最小2乗近似という方法をとります。

実際にやってみた

UCIのMachine Learning Repositoryからデータセットを取ってきて回帰問題を考えてみます。 今回はcomputer hardwareというデータセットを使います。

http://archive.ics.uci.edu/ml/datasets/Computer+Hardware

まずは
X:maximum main memory in kilobytes (integer)
y:estimated relative performance from the original article (integer)
として線形回帰を行っていきます。

まずライブラリとデータセットを読み込みます。

# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
# Importing the dataset
dataset = pd.read_csv('dataset.csv')

# Simple Linear Regression
X = dataset.loc[:, ['ERP']].values
y = dataset.loc[:, ['MMAX']].values

最初は単回帰を行ってみます。

# importing the Linear Model
from sklearn.linear_model import LinearRegression
reg = LinearRegression()
reg.fit(X, y)
#visualising the result 
y_pred = reg.predict(X)
plt.scatter(X,y, color='red')
plt.plot(X, y_pred, color='blue')
plt.title("MMAX(maximum main memory in kilobytes) vs \n ERP(estimated relative performance)\n(Linear Regression)")
plt.xlabel("MMAX")
plt.ylabel("ERP")
plt.show()

f:id:coldwarmer:20170724090329p:plain
こんな感じになりました。 青線が今回作ったモデルを使ってyを予測した値になります。 よくフィットしているとはいえないですね。

次は多項式を用いて回帰してみようと思います。 3次の多項式で近似してみます。

# Polynomial Regression
from sklearn.preprocessing import PolynomialFeatures
polynomial_features = PolynomialFeatures(degree = 3)
X_poly = polynomial_features.fit_transform(X)
poly_reg = LinearRegression()
poly_reg.fit(X_poly, y)


# Visualising the Polynomial Regression results 
plt.scatter(X, y, color = 'red')
plt.plot(X_grid, poly_reg.predict(polynomial_features.fit_transform(X)), color = 'blue')
plt.title("MMAX(maximum main memory in kilobytes) vs \n ERP(estimated relative performance)\n(Polinomial Regression)")
plt.xlabel('MMAX')
plt.ylabel('ERP')
plt.show()

f:id:coldwarmer:20170724090350p:plain
結構いい感じ。

最後に6次の多項式で回帰してみます。
f:id:coldwarmer:20170724091027p:plain
うまくいきませんね。 これはオーバーフィッティングしている状態ですね。

とりあえず単回帰と多項式回帰はできました。 本当は最小2乗近似の誤差を確認したいのですがやり方がわかりません。。。 分かり次第追記します。

今回重回帰をやらなかったのと、Rを使ってないのでRで重回帰をやってみます。。

また次のコンテンツは決定木の回帰ということなのでそちらもまとめていきたいと思います。

ではまた。

SOFT SKILLS ソフトウェア開発者の人生マニュアルをよんで

SOFT SKILLS ソフトウェア開発者の人生マニュアル

SOFT SKILLS ソフトウェア開発者の人生マニュアル

僕はとりあえずソフトではなくハードの会社に入社することになりましたが、将来の参考になればと思って読み始めました。

人生のマニュアルというにふさわしいほどの量。そのため話題は多岐に渡ります。 エンジニアとしてのキャリア自己のアピール論のみではなく、健康や投資、さらに恋愛にまで踏み込んでいる。(恋愛についての話いるか??って思ったけど、エンジニアの恋愛戦略はちょっとおもしろかった。)

筆者はかなりストイックな人物なようで、正直普通の人ではない。 色々エピソードが盛り込んであるが、この本の話は著者が達成した項目に対して、その過程、どんな方法を用いてそれを達成したのかを解説するような流れになっている。

この本のスタートはキャリアについての話から。 その中でもマインドセット、会社との関係性についての話から始まる。 終身雇用の時代は終わりつつある現代、ソフトウェア開発者は特にその傾向が強いだろう。そんな最中どのような心がまえで働くのか、キャリアについてどう考えていくべきか書いてある。

その次の章は自己アピールの方法について。 ここも結構参考になりました。 ブログを書こうと思ったのもここを読んだ影響が大きいです。

なにをすべきかクリアにしてくれる1冊かなと思います。

SOFT SKILLS ソフトウェア開発者の人生マニュアル