본문 바로가기
자연어 처리

[딥러닝을 이용한 자연어 처리 입문] 선형 회귀와 로지스틱 회귀

by 나연하야 2023. 4. 16.

선형 회귀

1. 선형 회귀

1) 단순 선형 회귀 분석

y=wx+b

w: 가중치(weight)

b: 편향(bias)

 

2) 다중 선형 회귀 분석

y=w_1*x_1+w_2*x_2+...+w_n*x_n+b

 

2. 가설(hypothesis) 세우기

-x와 y의 관계를 유추하기 위해 수학적으로 식을 세워보게 되는데 머신러닝에서는 이러한 식을 가설이라고 함

 

3. 비용함수(cost function): 평균 제곱 오차(Mean Squared Error, MSE)

- w와 b를 찾기 위해서 실제값과 가설로부터 얻은 예측값의 오차를 계산하는 식을 세우고, 이 식의 값을 최소화하는 최적의 w와 b를 찾아냄

- 이때 실제값과 예측값에 대한 오차에 대한 식을 목적 함수(objective function, 함수의 값을 최소화하거나 최대화하는 목적을 가진 함수) 또는 비용 함수(cost function) 또는 손실 함수(loss function)이라고 함

예시) 어떤 학생의 공부 시간에 따라서 다음과 같은 점수를 얻었음

- 예측 값은 목적 함수가 y=13x+1이라고 가정

공부 시간 2 3 4 5
실제 값(점수) 25 50 42 61
예측 값(점수) 27 40 53 66
오차 -2 10 -9 -5

- MSE를 구하는 식은 다음과 같음. MSE = (실제 값-예측 값)^2/데이터의 수

- MSE의 식을 위의 데이터에 적용해보면 MSE = (4+100+81+25)/4=52.5

 

4. 옵티마이저(Optimizer): 경사하강법(Gradient Descent)

- 머신러닝에서 비용함수를 최소화하는 매개변수인 w와 b를 찾기 위한 작업을 수행하는데 이때 사용되는 알고리즘을 옵티마이저 또는 최적화 알고리즘이라고 함

- 아래의 그래프에서 초록색 선은 y=x, 주황색 선은 y=20x이며, ↕는 각 점에서 오차임

- 아래의 그래프는 w와 cost의 관계임(w가 무한대로 커지거나 작아지면 cost의 값이 무한대로 커짐)

- cost가 최소화가 되는 지점은 접선의 기울기가 0이 되는 지점이며, 이는 미분값이 0이 되는 지점임

- 경사하강법의 아이디어는 비용함수를 미분하여 현재 w에서의 접선의 기울기를 구하고, 접선의 기울기가 낮은 방향으로 w의 값을 변경하고 다시 미분하고 이 과정을 접선의 기울기가 0인 곳을 향해 w의 값을 변경하는 작업을 반복하는 것

- 비용을 최소화하는 w를 구하기 위해 w를 업데이트하는 식은 다음과 같음

- 아래의 식에서 알파는 학습률(learning rate)을 의미함(얼마나 큰 폭으로 이동할지를 결정)

- 실제 경사 하강법은 w와 b에 대해서 동시에 경사하강법을 수행하면서 최적의 w와 b를 찾음

 

5. 텐서플로우를 활용한 선형 회귀 실습

import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras import optimizers

x = [1, 2, 3, 4, 5, 6, 7, 8, 9]
y = [11, 22, 33, 44, 53, 66, 77, 87, 95]

model = Sequential()
model.add(Dense(1, input_dim=1, activation='linear')) # y와 x의 차원은 1, 선형 회귀이므로 activation은 'linear'
sgd = optimizers.SGD(lr=0.01) # sgd는 경사하강법을 의미
model.compile(optimizer=sgd, loss='mse', metrics=['mse']) # 손실함수는 mse 사용
model.fit(x, y, epochs=300)

print(model.predict([9])) # 9.5시간 공부했을 때 점수를 예측할 수 있음

 

로지스틱 회귀

1.  이진 분류

- 시험을 봤는데 이 시험 점수가 합격인지, 불합격인지 궁금할 수 있으며, 이와 같이 둘 중 하나를 결정하는 문제를 이진 분류라고 함

- 예를 들어, 시험 성적이 x라면 합불 결과는 y라고 할 때 아래와 같은 데이터를 통해 합격과 불합격 여부를 판정하는 모델을 만들고자 함

score(x) result(y)
45 불합격
50 불합격
55 불합격
60 합격
65 합격
70 합격

- 위의 그래프와 같이 출력이 0과 1 사이의 값을 가지면서 S자 형태로 그려지는 함수로 시그모이드 함수를 활용할 수 있음

 

2. 시그모이드 함수

- 시그모이드 함수의 식과 그래프는 아래와 같음

- 시그모이드 함수에서 w가 1일 때는 초록색 선, 0.5일 때는 빨간색 선, 2일 때는 파란색 선

- 시그모이드 함수에서 b가 1일 때는 초록색 선, 0.5일 때는 빨간색 선, 1.5일 때는 파란색 선

 

3. 비용 함수

- 로지스틱 회귀에서 비용함수로 평균 제곱 오차를 사용할 경우 로컬 미디엄에 빠질 가능성이 지나치게 높음

-> 로컬 미디엄에 안 빠지기 위해서 비용함수 다르게 정의!!!

- 따라서 로지스틱 회귀에서는 평균 제곱 오차가 아닌 새로운 비용함수가 필요함

- y의 실제값이 1과 0일 때 각각 비용함수 식과 그래프는 아래와 같음(실제값 y가 1일 때는 파란색 선, 0일 때는 빨간색 선)

- 위에서 y의 실제값이 0과 1일 때 다른 비용함수를 사용하였는데 하나의 식으로 표현하면 아래와 같음

 

4. 텐서플로우를 활용한 로지스틱 회귀 실습

import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras import optimizers

x = np.array([-50, -40, -30, -20, -10, -5, 0, 5, 10, 20, 30, 40, 50])
y = np.array([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1]) 

model = Sequential()
model.add(Dense(1, input_dim=1, activation='sigmoid')) # y와 x의 차원은 1, 로지스틱 회귀이므로 activation은 'sigmoid'
sgd = optimizers.SGD(lr=0.01) # sgd는 경사하강법을 의미
model.compile(optimizer=sgd, loss='binary_crossentropy', metrics=['binary_crossentropy']) # 손실함수는 binary_crossentropy 사용
model.fit(x, y, epochs=300)

 

다중 회귀

- 독립변수 x가 2개 이상인 경우가 있으며, 분석 코드에서 input과 model에서 input_dim을 수정해야 함

import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras import optimizers

x = np.array([[70,85,11], [71,89,18], [50,80,20], [99,20,10], [50,10,10]]) # 독립변수가 3개일 때 input
y = np.array([73, 82 ,72, 57, 34])

model = Sequential()
model.add(Dense(1, input_dim=3, activation='linear')) # y의 차원을 3으로 수정
sgd = optimizers.SGD(lr=0.01)
model.compile(optimizer=sgd, loss='mse', metrics=['mse'])
model.fit(x, y, epochs=300)

출처: 유원준/안상준, 딥러닝을 이용한 자연어 처리 입문-1권, p181-p208.