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で重回帰をやってみます。。

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

ではまた。