TIL_47 : 다항 회귀

JaHyeon Gu·2021년 10월 17일
0

Machine Learning

목록 보기
5/15
post-thumbnail

🙄 다항 회귀


➡ 다항 회귀 (Polynomial Regression)

  • 일차 함수나 직선을 구하는 게 아니라 다항식이나 곡선을 구해서 학습하는 것
  • 함수의 차수가 더 높을수록 굴곡이 많은 곡선
  • 데이터를 보고 적합할 것 같은 모양을 골라야 함
  • 목표는 선형 회귀랑 마찬가지로, 학습 데이터에 가장 잘 맞는 θ\theta값을 찾아내는 것
  • 2차항 회귀 가설 함수 : hθ(x)=θ0+θ1x+θ2x2h_\theta(x)=\theta_0+\theta_1x+\theta_2x^2
  • 3차항 회귀 가설 함수 : hθ(x)=θ0+θ1x+θ2x2+θ3x3h_\theta(x)=\theta_0+\theta_1x+\theta_2x^2+\theta_3x^3

➡ 단일 속성 다항 회귀

  • 속성이 하나인 다항 회귀
  • 3차항 회귀의 경우 단일 속성2^2, 단일 속성3^3 데이터로 다중 선형 회귀를 하는 것과 같음

➡ 다중 다항 회귀

  • 속성이 많은 다항 회귀
  • 입력 변수가 x1,x2,x3x_1, x_2, x_3 총 3개, 가설 함수가 이차 함수일 때 3개의 변수로 가능한 모든 이차항은
    x1x2x_1x_2, x2x3x_2x_3, x3x1x_3x_1, (x1)2(x_1)^2, (x2)2(x_2)^2, (x3)2(x_3)^2 으로 총 6개
  • 가설 함수는 아래와 같음
    hθ(x)=θ0+θ1x1+θ2x2+θ3x3+θ4x1x2+θ5x1x3+θ6x2x3+θ7(x1)2+θ8(x2)2+θ9(x3)2h_\theta(x)=\theta_0+\theta_1x_1+\theta_2x_2+\theta_3x_3+\theta_4x_1x_2+\theta_5x_1x_3+\theta_6x_2x_3+\theta_7(x_1)^2+\theta_8(x_2)^2+\theta_9(x_3)^2
  • 다항 회귀가 아닌 다중 선형 회귀 취급하고 문제 해결

➡ 다항 회귀의 힘

  • 다항 회귀를 사용하면 복잡한 고차식에 데이터를 맞추는 것을 넘어 모델 성능을 극대화할 수 있음
  • 속성들을 곱해서 차항을 높여주면, 선형 회귀 문제를 다항 회귀 문제로 만들어주면
    속성들 사이에 있을 수 있는 복잡한 관계들을 프로그램에 학습시킬 수 있음
  • 단순 선형 회귀를 쓰면 속성 하나하나가 다 독립적이기 때문에 이런 변수들 사이의 관계를 최종 예측 결과에 반영하지 못함

➡ scikit-learn으로 다항 회귀

# 필요한 라이브러리 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()  

# 몇차 함수인지 써준다 : 2차 함수
polynomial_transformer = PolynomialFeatures(2)

# 데이터 셋을 다항 회귀에 맞게 변환
polynomial_data = polynomial_transformer.fit_transform(diabetes_dataset.data)

# polynomial_data의 이름 설정
polynomial_feature_names = polynomial_transformer.get_feature_names(diabetes_dataset.feature_names)

# 판다스 데이터 프레임화
X = pd.DataFrame(polynomial_data, columns = polynomial_feature_names)

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

# 데이터 셋 학습용, 테스트용으로 분리
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 5)

# 트레이닝 셋의 입력 변수와 목표 변수로 학습
model = LinearRegression()
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


# 57.87704902724856
profile
IWBAGDS

0개의 댓글

관련 채용 정보