선형 회귀

18364 단어 sklearnPython

선형 회귀


설명 변수(예측에 사용되는 데이터)를 사용하여 목표 변수(예측된 데이터)를 예측하는 선형 함수(예측 모델)를 만드는 방법.
예측을 위해서는 예측 모형을 만드는 것을 배워야 한다.교사도 있고 공부도 있다
다음 그림의 가로축이 변수, 세로축이 목적 변수임을 설명하고 빨간색 점의 데이터를 얻으면 파란색 선은 회귀식(학습에서 얻은 예측 모델)이 된다.
이 회귀식을 만들 수 있다면 미지의 설명 변수가 있다면 그때의 목적 변수가 어떻게 될지 예측할 수 있다.

회귀식의 제작 방법은 최소 2승법(실제 목표 변수의 값과 예측 값의 차이를 제곱(제곱 오차)으로 최소화하는 방법)을 사용한다.
위의 그림에서 보듯이 빨간색 점에서 파란색 선으로 x축의 수직선을 그리면 그 길이가 오차가 된다.이것은 플러스/마이너스의 영향을 고려하여 제곱하여 모든 플러스의 값을 최소화한 그림입니다.

데이터 준비 작업


보스턴의 주택 가격 데이터를 사용하다.
get_boston_house_price_dataset.py
import numpy as np
import pandas as pd
from pandas import Series, DataFrame

import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('whitegrid')
%matplotlib inline

from sklearn.datasets import load_boston
boston = load_boston() # ボストンの住宅価格データの取得

# データフレームに変換
boston_df = DataFrame(boston.data)
boston_df.columns = boston.feature_names
boston_df['Price'] = boston.target

데이터 개요


describe_boston_house_price_dataset.py
boston_df[['RM', 'Price']].describe()

RM은 방의 수량이다.가격은 프라이스입니다.
가격(목적 변수)을 예측하기 위해 방의 수량을 설명 변수로 설정합니다.

방의 수량과 가격의 관계를 간단히 살펴보다.


scatter_plot_boston_house_price_dataset.py
# RM:部屋の数を横軸、Price:価格を縦軸に散布図を書いてみる
plt.scatter(boston_df['RM'], boston_df['Price'])
plt.xlabel('Number of rooms')
plt.ylabel('Price($1,000)')
plt.title('Scatter Plot')

산포도는 위와 같다.상관관계가 있다.
거기서 상관수를 제시해 보자.
calculate_correration.py
np.corrcoef (boston_df['RM'], boston_df['Price'])[0,1]
> 0.69535994707153925
상관수 0.695 강화.
따라서 설명 변수에 RM을 사용하면 스토리도 나쁘지 않다.

해봐 (솔로 컴백)


1. seaburn의lmplot에서 회귀식을 동시에 관찰


make_lmplot.py
sns.lmplot('RM', 'Price', data = boston_df) 

아주 간단합니다.seabrn의lmplot 옵션: DataFrame을 데이터에 건네주고 X축과 Y축에 DataFrame의 열 이름을 지정하면 라인을 만들 수 있습니다.

2. 넘비로 해보기


calcurate_single_regression.py
# numpyに喰わせるためにデータを変形 【※1】
X = np.vstack(boston_df.RM) 
X = np.array([[value, 1] for value in X])
# 目的変数を用意
Y = boston_df.Price

# 線形回帰(np.linalg.lstsq)を実行してa:傾き、b:切片を取得。【※2】
a, b = np.linalg.lstsq(X, Y)[0] 

# 散布図を書いて、そこに、得られた結果から回帰式を追記してみる。
plt.plot(boston_df.RM, boston_df.Price, 'o')
x = boston_df.RM
# 回帰式は、y = a * x + bで表現できるので、x軸にxを、y軸に a * x + bを指定。
plt.plot(x, a * x + b, 'r')
# xとy軸のラベル付与
plt.xlabel('Number of Room')
plt.ylabel('Price($1,000)')
numby 선형 회귀 결과도.붉은 선의 회귀식을 얻다.

해봐 (다시 컴백)


sckit-learn을 이용하다


단회귀는 하나의 설명 변수를 이용하고 다시 회귀는 여러 개의 설명 변수를 이용한다.
boston_df에서 RM: 방의 수를 포함해 13개의 변수가 존재하기 때문에 이를 이용하여 가격을 예측하는 모델을 만들어 보려고 합니다.
예측 모형을 제작할 때 학습용과 테스트용으로 나누는 방법을 사용한다.
분리된 이유는 "학습 데이터의 정확도만 보고 알 수 없는 데이터를 예측하는 데 쓸 수 있을지 판단할 수 없다"는 것이다.
do_multiple_regression.py
import sklearn
from sklearn.linear_model import LinearRegression # 線形回帰用

# 利用データの確認(CRIM〜Priceまでの14個のデータがある。Priceは目的変数なので、それ以外の13個を説明変数として利用してみる)
boston_df.info()
> <class 'pandas.core.frame.DataFrame'>
> Int64Index: 506 entries, 0 to 505
> Data columns (total 14 columns):
> CRIM       506 non-null float64
> ZN         506 non-null float64
> INDUS      506 non-null float64
> CHAS       506 non-null float64
> NOX        506 non-null float64
> RM         506 non-null float64
> AGE        506 non-null float64
> DIS        506 non-null float64
> RAD        506 non-null float64
> TAX        506 non-null float64
> PTRATIO    506 non-null float64
> B          506 non-null float64
> LSTAT      506 non-null float64
> Price      506 non-null float64
> dtypes: float64(14)

# Price以外の説明変数用DataFrame作成
X_multi = boston_df.drop('Price', 1) 
X_multi.shape
> (506, 13)

# データをtrain用とtest用に分ける。
# sklearn.cross_validation.train_test_split(X, Y) でXを説明変数、Yを目的変数で指定するとサクッとわけてくれる。
X_train, X_test, Y_train, Y_test = sklearn.cross_validation.train_test_split(X_multi, boston_df.Price) 

# 分割されたデータの数を確認
print(X_train.shape, X_test.shape, Y_train.shape, Y_test.shape)
> (379, 13) (127, 13) (379,) (127,)
# train用に379個、test用に127個に分割したことがわかる

# インスタンス生成
lreg = LinearRegression()
# 重回帰のモデル作成実施
lreg.fit(X_train, Y_train)
# 学習データとテストデータに対する予測実施
pred_train = lreg.predict(X_train)
pred_test = lreg.predict(X_test) 

# 学習データとテストデータの平均二乗誤差を確認[average(実際の価格 - 予測値]^2)]
np.mean((Y_train - pred_train) ** 2)
> 20.5592370941859
np.mean((Y_test - pred_test) ** 2) 
> 28.169312238554202

# 実際の正解と予測の残差をグラフで確認する。
# 横軸にtrainの結果、縦軸に誤差を表示
train = plt.scatter(pred_train, (pred_train - Y_train), c= 'b', alpha=0.5)  
# 横軸にtestの結果、縦軸に誤差を表示
test = plt.scatter(pred_test, (pred_test - Y_test), c ='r', alpha=0.5)

# グラフの整え
# 誤差0の線を引く。
plt.hlines(y = 0, xmin = -1.0, xmax = 50)
# 凡例
plt.legend((train, test), ('Training', 'Test'), loc = 'lower left') # 凡例
# タイトル
plt.title('Residual Plots')
오차도 결과

검은색 가로줄은 오차=0을 나타내고 그 위에는 오차가 조금 더해지고 아래는 오차가 줄어든다는 것을 나타낸다.만약 이 오차가 상하로 고르게 분포된다면 선형 회귀로 이 예측을 구하기에 적합하다고 할 수 있다.
그러나 이 오차가 편차의 결과라면 선형 회귀 자체에 적응하는 것을 다시 고려하는 것이 좋다.

보태다


[※ 1] npmpy에 사용되는 데이터 성형


단회귀의 직선 공식은 y=ax+b로 표시할 수 있지만 벡터 표시로 바꾸면
Ap와 다시 쓸 수 있습니다.
A와 p는 각각 이하이고 이 내적은 y이다.(y = a * x + b * 1)


나는 이 모양을 정돈했다.
# boston_df.RMだと、1次元配列。
X = boston_df.RM
# Xの行列の形を確認(506行だけの1次元配列)
X.shape
> (506,)
X
>0     6.575
>1     6.421
>2     7.185
>...
>504    6.794
>505    6.030
>Name: RM, Length: 506, dtype: float64
numby에서 이걸 이용하기 위해서는 2차원 배열로 바꿔야 합니다.
# そこで二次元配列に変換するためにnp.vstackを使う。
X = np.vstack(boston_df.RM)
# Xの行列の形を確認(506行,1列の2次元配列)
X.shape
>(506, 1)
X
>array([[ 6.575],
>       [ 6.421],
>       [ 7.185],
>       ・・・
>       [ 6.794],
>       [ 6.03 ]])
# さらにこれをA = [x, 1]に変換。Xの値を1次元目に、2次元目に固定値で1をセット
X = np.array([[value, 1] for value in X])
# Xの行列の形を確認(506行,2列の2次元配列)
X.shape
> (506, 2)
X
>array([[array([ 6.575]), 1],
>       [array([ 6.421]), 1],
>       [array([ 7.185]), 1],
>       ..., 
>       [array([ 6.976]), 1],
>       [array([ 6.794]), 1],
>       [array([ 6.03]), 1]], dtype=object)
이렇게 하면 변수 X가 [x1]의 형상이 되어 numby로 처리할 수 있다는 것을 설명한다.

【※2】 np.linalg.lstsq 정보


linalg은 linear Algebra(선형 대수)의 약칭이고, lstsq는 Least Square(최소 제곱법)의 약칭이다.
반환 값은 0행: 기울기와 슬라이스, 1행: 잔차, 2행: 변수를 설명하는 Rank, 3행: 변수를 설명하는 특이값(Singlar value).이번에는 기울이고 슬라이스하려고 [0]를 지정했습니다.

좋은 웹페이지 즐겨찾기