🙄 다중 선형 회귀
➡ 다중 선형 회귀 (Multiple Linear Regression)
- 여러 입력 변수를 갖고 하는 선형 회귀
- 시각적으로 표현하기 힘듦
- 여러 개의 입력값과 결과값 간의 관계 확인 가능
- 어떤 입력값이 결과값에 어떠한 영향을 미치는지 알 수 있음
- 여러 개의 입력값 사이 간의 상관 관계가 높을 경우 결과에 대한 신뢰성을 잃을 가능성이 있음
➡ 다중 선형 회귀 표현법
- 입력 변수는 속성 (feature)이라고도 함
- 입력 변수 개수는 n으로 표현
- 입력 변수 각각을 x1, x2, x3, x4와 같이 표현
- x(3)은 하나의 값이 아니라 여러 값을 담은 하나의 벡터
- 하나의 데이터를 나타내고 싶다면 x2(3)와 같이 표현
- i번 째 데이터의 j번 째 속성 : xj(i)
🙄 가설 함수
➡ 다중 선형 회귀 가설 함수
- 다중 선형 회귀 가설 함수는 아래와 같은 모양
- 입력 변수만 n개 있을 뿐 일차 함수
- θ1은 x1이 목표 변수에 미치는 영향, θ2은 x2가 목표 변수에 미치는 영향
- 목적은 세타 값들을 조금씩 조율하면서 학습 데이터에 가장 잘 맞는 세타값들을 찾아내는 것
hθ(x)=θ0+θ1x1+θ2x2+....+θnxn
➡ 행렬 표현
- 길고 복잡한 함수를 벡터를 이용하면 간결하게 표현 가능
θ = ⎣⎢⎢⎢⎢⎢⎢⎢⎡θ0θ1θ2..θn⎦⎥⎥⎥⎥⎥⎥⎥⎤
x = ⎣⎢⎢⎢⎢⎢⎢⎢⎡1x1x2..xn⎦⎥⎥⎥⎥⎥⎥⎥⎤
hθ(x)=θTx
🙄 다중 선형 회귀 경사 하강법
➡ 다중 선형 회귀 경사 하강법
-
단지 아래와 같이 업데이트할 θ값이 많아지는 것
-
θ0=θ0−αm1∑i=1m(hθ(x(i))−y(i))∗x0(i)
θ1=θ1−αm1∑i=1m(hθ(x(i))−y(i))∗x1(i)
θ2=θ2−αm1∑i=1m(hθ(x(i))−y(i))∗x2(i)
.............
θn=θn−αm1∑i=1m(hθ(x(i))−y(i))∗xn(i)
➡ 다중 선형 회귀 구현 쉽게 표현
입력 변수와 파라미터 표현
X=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡x0(1)x0(2)x0(3)..x0(m)x1(1)x1(2)x1(3)x1(m)............xn(1)xn(2)xn(3)xn(m)⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤
- 아래와 같이 입력 변수들을 행렬로 표현한 것을 설계행렬,
Design Matrix라고 함
θ = ⎣⎢⎢⎢⎢⎢⎢⎢⎡θ0θ1θ2..θn⎦⎥⎥⎥⎥⎥⎥⎥⎤
모든 데이터 예측 값
- 이렇게 표현하면 모든 데이터에 대한 예측 값은 두 행렬의 곱으로 나타낼 수 있음
Xθ=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡x0(1)x0(2)x0(3)..x0(m)x1(1)x1(2)x1(3)x1(m)............xn(1)xn(2)xn(3)xn(m)⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤∗⎣⎢⎢⎢⎢⎢⎢⎢⎡θ0θ1θ2..θn⎦⎥⎥⎥⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡θ0x0(1)θ0x0(2)θ0x0(3)..θ0x0(m)θ1x1(1)θ1x1(2)θ1x1(3)θ1x1(m)............θnxn(1)θnxn(2)θnxn(3)θnxn(m)⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤
Xθ=⎣⎢⎢⎢⎢⎢⎢⎢⎡hθ(x(1))hθ(x(2))hθ(x(3))..hθ(x(m))⎦⎥⎥⎥⎥⎥⎥⎥⎤
예측 오차
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)⎦⎥⎥⎥⎥⎥⎥⎥⎤
error=Xθ−y=⎣⎢⎢⎢⎢⎢⎢⎢⎡hθ(x(1))−y(1)hθ(x(2))−y(2)hθ(x(3))−y(3)..hθ(x(m))−y(m)⎦⎥⎥⎥⎥⎥⎥⎥⎤
경사 하강법
θ=θ−αm1(XT∗(Xθ−y))
θ=θ−αm1(XT∗error)
🙄 정규 방정식
➡ 정규 방정식 (Nomal equation)
- 경사 하강법이 아니라 방정식을 통해 극소점을 찾는 방법
- 매번 방정식을 풀긴 곤란, 식은 아래와 같다
θ=(XTX)−1∗XTy
➡ 경사 하강법 vs 정규 방정식
| 경사 하강법 | 정규 방정식 |
|---|
| 적합한 학습율 α를 찾거나 정해야 한다 | 학습율 α를 정할 필요가 없다 |
| 반복문을 사용해야 한다 | 한 단계로 계산을 끝낼 수 있다 |
| 입력 변수의 개수 n이 커도 효율적으로 연산을 할 수 있다 | 입력 변수의 개수 n이 커지면 커질수록 월등히 비효율적이다 (행렬 연산을 하는 비용이 경사 하강법을 하는 것보다 크다) |
| 역행렬 (XTX)−1이 존재하지 않을 수도 있다 (이때는 pseudo inverse를 이용해서 다르게 계산하는 방법이 있기 때문에 큰 문제는 안 됨) |
❓ 어느 것을 선택해야 할까
👉 절대적으로 정해진 건 없지만 입력 변수의 수가 엄청 많을 때는 경사 하강법을 (1000개를 넘느냐를 기준으로 사용할 때가 많음), 적을 때는 정규 방정식을 사용
➡ Convex 함수
- 아래로 볼록한 함수, 2차 방정식 함수
non-convex 함수 : 극소점, 극대점이 많은 함수
convex 함수만이 경사 하강법과 정규 방정식을 이용해서 최소점을 구할 수 있다
- 선형 회귀에서는 평균 제곱 오차(MSE)를 손실 함수로 사용
- 선형 회귀 손실 함수로 사용하는
MSE는 항상 convex 함수
- 선형 회귀를 할 때는 경사 하강법, 정규 방정식으로 항상 최적의 θ 값들을 구할 수 있음
🙄 scikit-learn으로 다중 선형 회귀
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()
X = pd.DataFrame(diabetes_dataset.data, columns=diabetes_dataset.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