MLDL

다항 회귀

DEVDAE828 2022. 2. 8. 17:19

출처:코드잇

선형 회귀를 사용해서 찾은 직선은 입력 변수와 목표 변수의 관계를 잘 나타내지 못하고 있다.

출처:코드잇

곡선을 사용해서 더 나은 함수를 찾았다. 

1차 함수, 출처: 코드잇

곡선은 1차 함수인 직선과 다르게 2차 함수이다. 아래는 2차 함수 식이다. 

2차 함수, 출처: 코드잇

함수가 높아질수록 굴곡이 많은 곡선이 되고 이런식으로 데이터에 잘 맞는 일차 함수나 직선이 아닌 다항식이나 곡선을 수하는걸 다항 회귀 영어로는 polynomial regression이라고 한다. 

 

다항 회귀는 다중 선형 회귀와 매우 비슷하다. 다음 식은 위에는 다항 회귀 밑은 다중 선형 회귀이다. 

출처:코드잇
출처:코드잇
출처:코드잇

이 테이블에 가상의 열 두개를 추가한다. 크기를 제곱한 열과 세제곱한 열이다. 

출처:코드잇

그러면 이 데이터를 입력 변수가 3개인 것처럼 취급해 다중 선형 회귀를 하면 된다. 

이것은 입력변수가 하나일때 하는 방법이다. 

 

이번에는 입력변수가 여려개 있을때 하는방법을 보겠다.

출처:코드잇

이차 함수라는 가정하에 크기 방 수 지하철까지의 거리 이 3개의 변수로 가능한 모든 이차항을 만든다. 

출처:코드잇

그러면 이 문제를 입력 변수가 9개인 다중 선형 회귀라고 생각하고 문제를 풀면 된다. 

속성들을 서로 곱해서 차항을 높여주면, 그러니까 선형 회귀 문제를 다항 회귀 문제로 만들어주면 속성들 사이에 있을 수 있는 복잡한 관계들을 프로그램에 학습시킬 수 있다.

 

다항 회귀로 당뇨병 예측하기 (코드)

 

# 필요한 라이브러리 import
from sklearn import datasets
from sklearn.preprocessing import PolynomialFeatures
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

import pandas as pd  

diabetes_dataset = datasets.load_diabetes()  # 데이터 셋 갖고오기

# 코드를 쓰세요
polynomial_transformer = PolynomialFeatures(2)
polynomial_data = polynomial_transformer.fit_transform(diabetes_dataset.data)
polynomial_featurenames = polynomial_transformer.get_feature_names(diabetes_dataset.feature_names)

X = pd.DataFrame(polynomial_data, columns=polynomial_featurenames)
X.head()

# 목표 변수
y = pd.DataFrame(diabetes_dataset.target, columns=['diabetes'])

model = LinearRegression()

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=5)
model.fit(X_train, y_train)
y_test_predict = model.predict(X_test)

mse = mean_squared_error(y_test, y_test_predict)
mse ** 0.5