본문 바로가기
(책) 머신러닝, 딥러닝/핸즈온 머신러닝

Chapter4 모델 훈련

by 탶선 2020. 9. 17.
반응형

선형회귀

  • 일반적으로 선형 모델은 입력 특성의 가중치 합과 편향을 더해 예측한다
    • 선형 회귀 모델 예측 식
      •  $\hat y = \theta_0 + \theta_1 x_1 + \theta_2 x_2 + ... + \theta_n x_n $
        • $\hat y $ : 예측값 
        • n : 특성 수
        • $x_i : i번째 특성값 $
        • $\theta_j : j번째 파라미터 $
    • 선형 회귀 모델의 벡터형태 예측식
      • $ \hat y = h_\theta (x) = \theta^T \cdot x $

 

모델 훈련

  • 모델이 훈련 세트에 가장 잘 맞도록 모델 파라미터를 설정하는 것

 

정규방정식(normal equation)

  • 비용 함수를 최소화하는 $\theta$ 값을 찾기 위한 해석적인 방법
  • 바로 결과를 얻을 수 있는 수학공식
  • $ \hat \theta = (X^T \cdot X)^{-1} \cdot X^T \cdot y $
    • $\hat \theta $ : 비용 함수를 최소화 하는 $\theta $ 값
    • $y : y^{(1)}부터 y^{(m)} 까지 포함하는 타겟 벡터 $
import numpy as np
import matplotlib.pyplot as plt

X = 2 * np.random.rand(100,1)
y = 4 + 3 * X + np.random.randn(100,1)

fig = plt.figure()

scatter = plt.scatter(X,y)
plt.show()

무작위로 생성한 선형 데이터셋

X_b = np.c_[np.ones((100,1)) , X]
theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
print(theta_best)

# 출력
#[[3.94905756] $\theta_0 =4$ 
# [2.97976129]] $\theta_1 = 3$ 
# 노이즈 때문에 정확히 재현x

 

  • 정규방정식을 활용
X_new = np.array([[0],[2]])
X_new_b = np.c_[np.ones((2,1)), X_new]
y_predict = X_new_b.dot(theta_best)
y_predict

plt.plot(X_new,y_predict,"r-")
plt.plot(X,y,"b.")
plt.axis([0,2,0,15])
plt.show()

선형 회귀 모델의 예측

 

경사 하강법(Gradient Descent)

  • 여러 종류의 문제에서 최정의 해법을 찾는 최적화 알고리즘
  • $\theta$를 임의의 값으로 시작해서 한번에 조금씩 비용함수가 감소되는 방향으로 알고리즘이 최솟값에 수렴할 때까지 점진적 향상시킨다

출처 : https://saugatbhattarai.com.np/what-is-gradient-descent-in-machine-learning/

  • 학습률이 작으면 수렴하기위해 반복 진행 ,시간 ↑
  • 학습률이 크면 알고리즘이 더 큰 값으로 발산하여 해법을 찾지 못함

 

배치 경사 하강법

  • 매 스텝에서 훈련 데이터 전체를 사용

배치 경사 하강법 구현

learning_rate = 0.1
n_iterations = 1000
m = 100

theta = np.random.randn(2,1)

for iteration in range(n_iterations):
    gradients = 2/m * X_b.T.dot(X_b.dot(theta) - y)
    theta = theta - learning_rate * gradients

 

확률적 경사 하강법

  • 매 스텝에서 한개의 샘플을 무작위로 선택하여 그래디언트 계산
  • 적은 데이터 처리로 알고리즘 속도 향상
  • 큰 훈련 셋 훈련 가능
  • 확률적이기 때문에 배치 경사 하강법보다 불안정

확률적 경사 하강법 구현

n_epochs = 50
t0, t1 = 5, 50

def learning_schedule(t):
    return t0 / (t+t1)

theta = np.random.randn(2,1)

for epoch in range(n_epochs):
    for i in range(m):
        random_index = np.random.randint(m)
        xi = X_b[random_index: random_index+1]
        yi = y[random_index:random_index+1]
        gradients = 2*xi.T.dot(xi.dot(theta) -yi)
        eta = learning_schedule(epoch * m + i)
        theta = theta -eta *gradients

 

 

미니배치 경사 하강법

  • 미니배치라 부르는 임의의 작은 샘플 세트에 대해 그래디언트 계산
  • 임의의 작은 샘플 세트에 대해 그래디언트 계산
    • 장점 : 행렬 연산에 최적화되 하드웨어를 사용하여 얻는 성능 향상

 

다항회귀

  • 각 특성이 거듭제곱으로 추가된 특성을 포함한 데이터셋에 선형 모델을 훈련시키는 방법
  • 가지고 있는 데이터가 직선(단순)이 아닌 비선형 데이터를 학습할 때 사용 가능

비선형 데이터

 

로지스틱 회귀

  • 샘플이 특정 클래스에 속할 확률 추정에 사용

 

# 본 게시물은 핸즈온 머신러닝을 읽고 게시하였습니다.

반응형

댓글