TIL_46 : 다중 선형 회귀

JaHyeon Gu·2021년 10월 16일
0

Machine Learning

목록 보기
4/15
post-thumbnail

🙄 다중 선형 회귀


➡ 다중 선형 회귀 (Multiple Linear Regression)

  • 여러 입력 변수를 갖고 하는 선형 회귀
  • 시각적으로 표현하기 힘듦
  • 여러 개의 입력값과 결과값 간의 관계 확인 가능
  • 어떤 입력값이 결과값에 어떠한 영향을 미치는지 알 수 있음
  • 여러 개의 입력값 사이 간의 상관 관계가 높을 경우 결과에 대한 신뢰성을 잃을 가능성이 있음

➡ 다중 선형 회귀 표현법

  • 입력 변수는 속성 (feature)이라고도 함
  • 입력 변수 개수는 nn으로 표현
  • 입력 변수 각각을 x1x_1, x2x_2, x3x_3, x4x_4와 같이 표현
  • x(3)x^{(3)}은 하나의 값이 아니라 여러 값을 담은 하나의 벡터
  • 하나의 데이터를 나타내고 싶다면 x2(3)x_2^{(3)}와 같이 표현
  • ii번 째 데이터의 jj번 째 속성 : xj(i)x_j^{(i)}



🙄 가설 함수


➡ 다중 선형 회귀 가설 함수

  • 다중 선형 회귀 가설 함수는 아래와 같은 모양
  • 입력 변수만 nn개 있을 뿐 일차 함수
  • θ1\theta_1x1x_1이 목표 변수에 미치는 영향, θ2\theta_2x2x_2가 목표 변수에 미치는 영향
  • 목적은 세타 값들을 조금씩 조율하면서 학습 데이터에 가장 잘 맞는 세타값들을 찾아내는 것
    hθ(x)=θ0+θ1x1+θ2x2+....+θnxnh_\theta(x)=\theta_0+\theta_1x_1+\theta_2x_2+....+\theta_nx_n

➡ 행렬 표현

  • 길고 복잡한 함수를 벡터를 이용하면 간결하게 표현 가능

θ\theta = [θ0θ1θ2..θn]\begin{bmatrix}\theta_0\\\theta_1\\\theta_2\\.\\.\\\theta_n \end{bmatrix}

xx = [1x1x2..xn]\begin{bmatrix}1\\x_1\\x_2\\.\\.\\x_n \end{bmatrix}

hθ(x)=θTxh_\theta(x)=\theta^Tx



🙄 다중 선형 회귀 경사 하강법


➡ 다중 선형 회귀 경사 하강법

  • 단지 아래와 같이 업데이트할 θ\theta값이 많아지는 것

  • θ0=θ0α1mi=1m(hθ(x(i))y(i))x0(i)\theta_0=\theta_0-\alpha\frac{1}{m}\sum_{i=1}^m (h_\theta(x^{(i)})-y^{(i)})*x_0^{(i)}
    θ1=θ1α1mi=1m(hθ(x(i))y(i))x1(i)\theta_1=\theta_1-\alpha\frac{1}{m}\sum_{i=1}^m (h_\theta(x^{(i)})-y^{(i)})*x_1^{(i)}
    θ2=θ2α1mi=1m(hθ(x(i))y(i))x2(i)\theta_2=\theta_2-\alpha\frac{1}{m}\sum_{i=1}^m (h_\theta(x^{(i)})-y^{(i)})*x_2^{(i)}
    .............
    θn=θnα1mi=1m(hθ(x(i))y(i))xn(i)\theta_n=\theta_n-\alpha\frac{1}{m}\sum_{i=1}^m (h_\theta(x^{(i)})-y^{(i)})*x_n^{(i)}


➡ 다중 선형 회귀 구현 쉽게 표현

입력 변수와 파라미터 표현

  • 다중 선형 회귀에서의 입력 변수

X=[x0(1)x1(1)...xn(1)x0(2)x1(2)...xn(2)x0(3)x1(3)...xn(3)..x0(m)x1(m)...xn(m)]X=\begin{bmatrix}x_0^{(1)}&x_1^{(1)}&...&x_n^{(1)}\\x_0^{(2)}&x_1^{(2)}&...&x_n^{(2)}\\x_0^{(3)}&x_1^{(3)}&...&x_n^{(3)}\\.\\.\\x_0^{(m)}&x_1^{(m)}&...&x_n^{(m)} \end{bmatrix}

  • 아래와 같이 입력 변수들을 행렬로 표현한 것을 설계행렬, Design Matrix라고 함

θ\theta = [θ0θ1θ2..θn]\begin{bmatrix}\theta_0\\\theta_1\\\theta_2\\.\\.\\\theta_n \end{bmatrix}


모든 데이터 예측 값

  • 이렇게 표현하면 모든 데이터에 대한 예측 값은 두 행렬의 곱으로 나타낼 수 있음

Xθ=[x0(1)x1(1)...xn(1)x0(2)x1(2)...xn(2)x0(3)x1(3)...xn(3)..x0(m)x1(m)...xn(m)][θ0θ1θ2..θn]=[θ0x0(1)θ1x1(1)...θnxn(1)θ0x0(2)θ1x1(2)...θnxn(2)θ0x0(3)θ1x1(3)...θnxn(3)..θ0x0(m)θ1x1(m)...θnxn(m)]X\theta=\begin{bmatrix}x_0^{(1)}&x_1^{(1)}&...&x_n^{(1)}\\x_0^{(2)}&x_1^{(2)}&...&x_n^{(2)}\\x_0^{(3)}&x_1^{(3)}&...&x_n^{(3)}\\.\\.\\x_0^{(m)}&x_1^{(m)}&...&x_n^{(m)} \end{bmatrix}*\begin{bmatrix}\theta_0\\\theta_1\\\theta_2\\.\\.\\\theta_n \end{bmatrix}=\begin{bmatrix}\theta_0x_0^{(1)}&\theta_1x_1^{(1)}&...&\theta_nx_n^{(1)}\\\theta_0x_0^{(2)}&\theta_1x_1^{(2)}&...&\theta_nx_n^{(2)}\\\theta_0x_0^{(3)}&\theta_1x_1^{(3)}&...&\theta_nx_n^{(3)}\\.\\.\\\theta_0x_0^{(m)}&\theta_1x_1^{(m)}&...&\theta_nx_n^{(m)} \end{bmatrix}

Xθ=[hθ(x(1))hθ(x(2))hθ(x(3))..hθ(x(m))]X\theta=\begin{bmatrix}h_\theta(x^{(1)})\\h_\theta(x^{(2)})\\h_\theta(x^{(3)})\\.\\.\\h_\theta(x^{(m)}) \end{bmatrix}


예측 오차

Xθy=[hθ(x(1))hθ(x(2))hθ(x(3))..hθ(x(m))][y(1)y(2)y(3)..y(m)]=[hθ(x(1))y(1)hθ(x(2))y(2)hθ(x(3))y(3)..hθ(x(m))y(m)]X\theta-y=\begin{bmatrix}h_\theta(x^{(1)})\\h_\theta(x^{(2)})\\h_\theta(x^{(3)})\\.\\.\\h_\theta(x^{(m)}) \end{bmatrix}-\begin{bmatrix}y^{(1)}\\y^{(2)}\\y^{(3)}\\.\\.\\y^{(m)} \end{bmatrix}=\begin{bmatrix}h_\theta(x^{(1)})-y^{(1)}\\h_\theta(x^{(2)})-y^{(2)}\\h_\theta(x^{(3)})-y^{(3)}\\.\\.\\h_\theta(x^{(m)})-y^{(m)} \end{bmatrix}

error=Xθy=[hθ(x(1))y(1)hθ(x(2))y(2)hθ(x(3))y(3)..hθ(x(m))y(m)]error=X\theta-y=\begin{bmatrix}h_\theta(x^{(1)})-y^{(1)}\\h_\theta(x^{(2)})-y^{(2)}\\h_\theta(x^{(3)})-y^{(3)}\\.\\.\\h_\theta(x^{(m)})-y^{(m)} \end{bmatrix}


경사 하강법

θ=θα1m(XT(Xθy))\theta=\theta-\alpha\frac{1}{m}(X^T*(X\theta-y))

θ=θα1m(XTerror)\theta=\theta-\alpha\frac{1}{m}(X^T*error)



🙄 정규 방정식


➡ 정규 방정식 (Nomal equation)

  • 경사 하강법이 아니라 방정식을 통해 극소점을 찾는 방법
  • 매번 방정식을 풀긴 곤란, 식은 아래와 같다

θ=(XTX)1XTy\theta=(X^TX)^{-1}*X^Ty


➡ 경사 하강법 vs 정규 방정식

경사 하강법정규 방정식
적합한 학습율 α\alpha를 찾거나 정해야 한다학습율 α\alpha를 정할 필요가 없다
반복문을 사용해야 한다한 단계로 계산을 끝낼 수 있다
입력 변수의 개수 nn이 커도 효율적으로 연산을 할 수 있다입력 변수의 개수 nn이 커지면 커질수록 월등히 비효율적이다 (행렬 연산을 하는 비용이 경사 하강법을 하는 것보다 크다)
역행렬 (XTX)1(X^TX)^{-1}이 존재하지 않을 수도 있다 (이때는 pseudo inverse를 이용해서 다르게 계산하는 방법이 있기 때문에 큰 문제는 안 됨)

❓ 어느 것을 선택해야 할까
👉 절대적으로 정해진 건 없지만 입력 변수의 수가 엄청 많을 때는 경사 하강법을 (1000개를 넘느냐를 기준으로 사용할 때가 많음), 적을 때는 정규 방정식을 사용


➡ Convex 함수

  • 아래로 볼록한 함수, 2차 방정식 함수
  • non-convex 함수 : 극소점, 극대점이 많은 함수
  • convex 함수만이 경사 하강법과 정규 방정식을 이용해서 최소점을 구할 수 있다
  • 선형 회귀에서는 평균 제곱 오차(MSE)를 손실 함수로 사용
  • 선형 회귀 손실 함수로 사용하는 MSE는 항상 convex 함수
  • 선형 회귀를 할 때는 경사 하강법, 정규 방정식으로 항상 최적의 θ\theta 값들을 구할 수 있음



🙄 scikit-learn으로 다중 선형 회귀


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

# 입력 변수를 사용하기 편하게 pandas dataframe으로 변환
X = pd.DataFrame(diabetes_dataset.data, columns=diabetes_dataset.feature_names)

# 목표 변수를 사용하기 편하게 pandas dataframe으로 변환
y = pd.DataFrame(diabetes_dataset.target, columns=['diabetes'])

# 데이터 셋을 학습용, 테스트용으로 분리
# test_size = 20%를 테스트 데이터로 배당 
# random_state = 옵셔널 파라미터, 안넘기면 매번 다른 테스트 데이터 셋 구성
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)

# 학습된 model에 테스트 데이터를 이용해 y값 예측
y_test_predict = model.predict(X_test)

# 평균 제곱 오차의 루트를 통해서 테스트 데이터에서의 모델 성능 판단
mse = mean_squared_error(y_test, y_test_predict)

mse ** 0.5


# 54.603896119844421
profile
IWBAGDS

0개의 댓글