다항식 회귀 분석

0. 소개



처음 뵙겠습니다. Qiita 첫 투고입니다.

현재 엔지니어로의 전직을 향해 파이썬에 의한 데이터 분석 등을 학습하고 있습니다.

자신의 비망록으로서 쓰고 있으므로, 실수나 신경이 쓰이는 곳 등 있으면 지적 받을 수 있으면 고맙습니다.

1. 단회귀 분석과 다항식 회귀 분석



둘 다 양적 데이터의 관계를 예측하는 분석 기법이지만,

・단회귀 분석 1차식을 이용하여 직선적으로 예측

· 다항식 회귀 분석 다항식을 이용한 곡선 예측


차이가 있습니다.

식으로 쓰면,

단일 회귀 분석 ... y = wx + b
다항식 회귀 분석 ... y = w0x0 + w1x1 + w2x2 + ... + b0

2.python에서 구현



1. 데이터 로드



sklearn의 데이터 세트 boston.data를 사용하여 구현해 보겠습니다.
(참고 【데이터 분석】 보스턴 주택 가격 데이터 세트를 사용하여 데이터 분석 )

우선, 데이터를 읽은 후,
import pandas as pd
from sklearn.datasets import load_boston

#説明変数となるデータ
boston = load_boston()
boston_df = pd.DataFrame(boston.data, columns=boston.feature_names)

#目的変数の追加
boston_df['MEDV'] = boston.target

2. 데이터 시각화



설명 변수에 RM(평균 방수), 목적 변수에 MEDV(주택 가격)를 사용하고 있습니다.
import matplotlib.pyplot as plt

#平均部屋数RMと住宅価格MEDVの散布図
x = boston_df['RM']
y = boston_df['MEDV']
plt.scatter(x, y)
plt.title('boston.data')
plt.xlabel('RM')
plt.ylabel('MEDV')
plt.show()



3. 학습용 데이터와 테스트 데이터로 분할


from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=0)

4. 모델 만들기



PolynomialFeatures의 인수 degree에 임의의 값을 지정함으로써, N항의 다항식으로 할 수 있다.
이하에서는, degree=1(1항이므로 단회귀 분석), degree=4(4항의 다항식 분석)를 시험하고 있다.
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline

x_train = np.array(x_train).reshape(-1, 1)
y_train = np.array(y_train)

#degree=1で単回帰分析
model_1 = Pipeline([
    ('poly', PolynomialFeatures(degree=1)),
    ('linear', LinearRegression())
])
model_1.fit(x, y)

#degreeの値に任意の値を指定することで、多項式分析に(以下は4項)
model_2 = Pipeline([
    ('poly', PolynomialFeatures(degree=4)),
    ('linear', LinearRegression())
])
model_2.fit(x, y)

5. 산포도와 회귀 모델의 시각화


fig, ax = plt.subplots()
ax.scatter(x_train, y_train, color='blue', label='train')
ax.scatter(x_test, y_test, color='gray', label='test')

x_ = np.linspace(3, 9, 100).reshape(-1, 1)
plt.plot(x_, model_1.predict(x_), color='red', label='degree=1')
plt.plot(x_, model_2.predict(x_), color='yellow', label='degree=4')
plt.legend()
plt.show()



degree의 값을 늘리면, 좀 더 구냐그냐의 선이 되어, 학습 데이터에 대해서 적합한 선이 되어 가지만, 너무 늘리면 과학습이 되어 버리므로, 조정이 필요.

이 외 정규화에 의해 과학습을 억제하는 방법도 있다.

좋은 웹페이지 즐겨찾기