DeepLearning - 다중 선형 회귀

Q. 이거 얼마가 될까? - 다만, 변인이 여러 개야!

복습

평균제곱오차는 왜 나왔었을까

오차를 그냥 더해버리면 양수 오차와 음수 오차가 서로 상쇄되어 ‘틀린 크기’를 정확히 알 수 없다. 그러므로, 그 오차를 제곱시킴으로써 양수로 평균을 내버리는 방법을 택한다.
그래서 나온 평균제곱오차(MSE, Mean Squared Error)가 아래의 수식을 가졌었다.

MSE=1n(yy^)2 MSE = \frac{1}{n}\sum(y-\hat{y})^2

다중 선형 회귀에 대하여

앞서 선형 회귀에서 오차가 있음을 확인했으니, 더 정교한 예측을 위하여 변수의 개수를 늘려야 한다

예시

  • 다이어트 과정에서, 운동시간에 대한 변수를 추가한다
    y=a1x1+a2x2+by = a_1*x_1 + a_2*x_2 + b

코드화


x1 = np.array([1, 2, 3, 4, 5])  # 다이어트 경과일
x2 = np.array([30, 60, 60, 40, 50]) # 운동 시간(m)
y = np.array([46.0, 46.2, 45.9, 45.8, 45.7])  # 몸무게

x2x_2 를 Z축으로 생각하여 3차원의 세상을 생각해도 좋다.

  • 예측값을 구하는 식
predY = (a1*x1) + (a2*x2) + b
error = y - predY  # 오차 = 실제값(Y) - 예측값(predY)
  • 편미분 값(경사하강법의 평균제곱 오차 편미분 식 참고))
n = len(x1) # 변수 개수(n)
pDiff_a1 = (2/n) * sum(-x1 * (error)) # a1에 대한 편미분
pDiff_a2 = (2/n) * sum(-x2 * (error)) # a2에 대한 편미분
pDiff_b = (2/n) * sum(-(error)) # b에 대한 편미분

a1 = a1 - lr*pDiff_a1 // 학습률(lr) 곱하기
a2 = a2 - lr*pDiff_a2
b = b - lr*pDiff_b

2. 선형 회귀, 다중 선형 회귀 모델 in 텐서플로

가중치(w, weight)

  • 기울기 a: 변수 x에 어느 정도의 가중치를 곱할지를 결정

편향(bias)

  • 절편 b: 데이터의 특성에 따라 부여된 값

머신러닝에서의 용어

  1. y=ax+b y = ax + b &nbsp >H(x)=w\*x+b-> H(x) = w\*x + b

  2. 평균제곱오차 ⊃ 손실 함수(loss function)

  3. 경사하강법 ⊃ 옵티마이저(Optimizer)

텐서플로에서 선형회귀 실행하기

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

x = np.array([1, 2, 3, 4, 5])  # 다이어트 경과일
y = np.array([46.0, 46.2, 45.9, 45.8, 45.7])  # 몸무게

# 모델 선언
model = Sequential()
model.add(Dense(1, input_dim=1, activation='linear')) # 출력값: 1개, 입력변수: 1개, 선형회귀방식

# 학습 방법 설정
model.compile(optimizer='sgd', loss='mse') # sgd:경사하강법, mse: 평균제곱오차

# 학습수행
model.fit(x, y, epochs=100, verbose=0)  #, ephochs: 반복횟수, verbose: 진행상황에 대한 자세한 정도

# 예측
model.predict(np.array([[8]])) # 8일차에 대한 예측

텐서플로에서 다중선형회귀 실행하기

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

x = np.array([ [1, 30],[2, 60], [3, 60],[4, 40],[5, 50]]) # 경과일, 운동시간
y = np.array([46.0, 46.2, 45.9, 45.8, 45.7])  # 몸무게

# 모델 선언
model = Sequential()
model.add(Dense(1, input_dim=2, activation='linear')) # 출력값: 1개, 입력변수: 2개, 선형회귀방식

# 학습 방법 설정
model.compile(optimizer='sgd', loss='mse') # sgd:경사하강법, mse: 평균제곱오차

# 학습수행
model.fit(x, y, epochs=100)  #, ephochs: 반복횟수

# 예측
model.predict(np.array([[6, 45]]))) # 6일차, 45분 운동에 대한 예측