1. 다중 선형 회귀(Multiple Linear Regression)
- 여러 개의 독립 변수와 하나의 종속 변수의 선형 관계를 모델링하는 것
- 기존 단순 선형 회귀에서 정보(x값)를 추가해 새롭게 예측
- 단순 선형 회귀와의 비교
- 빈 공간이 많아짐
- 계산이 복잡해짐
- 더 많은 데이터가 필요
2. 다중 선형 회귀 예제
공부한 시간(x1) | 2 | 4 | 6 | 8 |
과외 수업 횟수(x2) | 0 | 4 | 2 | 3 |
성적(y) | 81 | 93 | 91 | 97 |
Code)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d
#공부시간 X와 성적 Y의 리스트를 만듭니다.
data = [[2, 0, 81], [4, 4, 93], [6, 2, 91], [8, 3, 97]]
x1 = [i[0] for i in data]
x2 = [i[1] for i in data]
y = [i[2] for i in data]
#그래프로 확인해 봅니다.
ax = plt.axes(projection='3d')
ax.set_xlabel('study_hours')
ax.set_ylabel('private_class')
ax.set_zlabel('Score')
ax.dist = 11
ax.scatter(x1, x2, y)
plt.show()
#리스트로 되어 있는 x와 y값을 넘파이 배열로 바꾸어 줍니다.(인덱스를 주어 하나씩 불러와 계산이 가능해 지도록 하기 위함입니다.)
x1_data = np.array(x1)
x2_data = np.array(x2)
y_data = np.array(y)
# 기울기 a와 절편 b의 값을 초기화 합니다.
a1 = 0
a2 = 0
b = 0
#학습률을 정합니다.
lr = 0.02
#몇 번 반복될지를 설정합니다.(0부터 세므로 원하는 반복 횟수에 +1을 해 주어야 합니다.)
epochs = 2001
#경사 하강법을 시작합니다.
for i in range(epochs): # epoch 수 만큼 반복
y_pred = a1 * x1_data + a2 * x2_data + b #y를 구하는 식을 세웁니다
error = y_data - y_pred #오차를 구하는 식입니다.
a1_diff = -(2/len(x1_data)) * sum(x1_data * (error)) # 오차함수를 a1로 미분한 값입니다.
a2_diff = -(2/len(x2_data)) * sum(x2_data * (error)) # 오차함수를 a2로 미분한 값입니다.
b_new = -(2/len(x1_data)) * sum(y_data - y_pred) # 오차함수를 b로 미분한 값입니다.
a1 = a1 - lr * a1_diff # 학습률을 곱해 기존의 a1값을 업데이트합니다.
a2 = a2 - lr * a2_diff # 학습률을 곱해 기존의 a2값을 업데이트합니다.
b = b - lr * b_new # 학습률을 곱해 기존의 b값을 업데이트합니다.
if i % 100 == 0: # 100번 반복될 때마다 현재의 a1, a2, b값을 출력합니다.
print("epoch=%.f, 기울기1=%.04f, 기울기2=%.04f, 절편=%.04f" % (i, a1, a2, b))
3. Tensorflow에서 실행
- 선형 회귀와 머신 러닝
- 선형 회귀는 현상을 분석하는 방법 중 하나
- 머신 러닝은 분석 방법을 이용해 예측 모델을 만들어내는 것
선형회귀 | 머신 러닝 |
y=ax+b | H(x) : 가설 함수(hypothesis) |
기울기 a | 가중치 w(weight) |
절편 b | 편향 b(bias) |
y = ax + b ➡︎ H(x) = wx + b
- 평균 제곱 오차 → 손실 함수(loss function)
- 경사 하강법 → 옵티마이저(optimizer)
- 함수 불러오기(tensorflow의 keras API)
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
1) 단순 선형 회귀
Code)
import numpy as np
import matplotlib.pyplot as plt
# 텐서플로의 케라스 API에서 필요한 함수들을 불러옵니다.
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
x = np.array([2, 4, 6, 8])
y = np.array([81, 93, 91, 97])
model = Sequential()
# 출력 값, 입력 변수, 분석 방법에 맞게끔 모델을 설정합니다.
model.add(Dense(1, input_dim=1, activation='linear'))
# 오차 수정을 위해 경사 하강법(sgd)을, 오차의 정도를 판단하기 위해
# 평균 제곱 오차(mse)를 사용합니다.
model.compile(optimizer='sgd', loss='mse')
# 오차를 최소화하는 과정을 2000번 반복합니다.
model.fit(x, y, epochs=2000)
plt.scatter(x, y)
plt.plot(x, model.predict(x), 'r') # 예측 결과를 그래프로 나타냅니다.
plt.show()
# 임의의 시간을 집어넣어 점수를 예측하는 모델을 테스트해 보겠습니다.
hour = 7
prediction = model.predict([hour])
print("%.f시간을 공부할 경우의 예상 점수는 %.02f점입니다." % (hour, prediction))
2) 다중 선형 회귀
Code)
import numpy as np
import matplotlib.pyplot as plt
# 텐서플로의 케라스 API에서 필요한 함수들을 불러옵니다.
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
x = np.array([[2, 0], [4, 4], [6, 2], [8, 3]])
y = np.array([81, 93, 91, 97])
model = Sequential()
# 입력 변수가 두 개(학습 시간, 과외 시간)이므로 input_dim에 2를 입력합니다.
model.add(Dense(1, input_dim=2, activation='linear'))
model.compile(optimizer='sgd', loss='mse')
model.fit(x, y, epochs=2000)
# 임의의 학습 시간과 과외 시간을 집어넣어 점수를 예측하는 모델을 테스트해 보겠습니다.
hour = 7
private_class = 4
prediction = model.predict([[hour, private_class]])
print("%.f시간을 공부하고 %.f시간의 과외를 받을 경우, 예상 점수는 %.02f점입니다." % (hour, private_class, prediction))
'ML > 모두의 딥러닝' 카테고리의 다른 글
6장) 퍼셉트론 (0) | 2023.07.10 |
---|---|
5장) 참 거짓 판단 장치 : 로지스틱 회귀 (0) | 2023.07.10 |
4-1장) 오차 수정하기 : 경사 하강법 (0) | 2023.07.06 |
3장) 선형 회귀 (0) | 2023.07.06 |
2장) 딥러닝을 위한 기초 수학 (0) | 2023.07.05 |