티스토리 뷰

Machine Learning에서의 Regression

  • y = ax + b => H = Wx + b
  • a 기울기, b 절편 => W Weight, b bias

Machine Learning에서의 Regression

 

Hypothesis와 최소 제곱법

  • y = Wx + b 에서, 초기 w, b 값은 랜덤으로 추출한다.
  • 오차 (error)를 이용해서, 해당 직선이 데이터를 잘 표현하고 있는지 수치화한다.
    • 오차 : 실제 값에서 예측값을 뺀다.
    • 오차의 합이 작으면 좋은 직선
  • 최소 제곱법 (least squared method) 이용
    • 오차들을 각각 제곱해서 평균을 구한다.

최소제곱법

 

loss function (손실 함수)

  • loss function y = Wx + b의 값이 작을 수록 좋다.
    • loss function의 값을 최소로 만드는 W, b값을 찾는다.
    • 이때의 W, b가 만드는 Hypothesis를 구한다.
    • 이를 위해 미분과 경사하강법을 사용한다. -> 기울기가 최소일 때의 W 값을 찾는다.

기울기 최소일 때의 W 값을 찾는다. 
경사 하강법과 learning rate (학습율)

 

Linear Regression Model을 Python으로 구현

1. Training Data Set

  • 머신러닝에 입력으로 사용될 데이터를 NumPy array (ndarray) 형태로 준비

2. Linear Regression Model을 정의

  • y = Wx + b => model을 프로그램적으로 표현
  • W와 b에 대한 변수 선언한 후 초기값은 랜덤값으로 이용한다.

3. loss function을 정의

  • 손실함수 (loss function)에 대한 코드를 작성
  • matrix(행렬) 처리해야 한다.

4. learning rate 정의

  • 일반적으로 customizing이 되는 값으로,
  • 초기에는 0.001정도로 설정해서 사용하고
  • loss 값을 보고 조절한다.

5. 학습을 진행

  • 반복적으로 편미분을 이용해서 W와 b를 update하는 방식으로 구현
# 1. Training Data Set

import numpy as np
import matplotlib.pyplot as plt

# Training Data Set
x_data = np.array([1,2,3,4,5,7,8,10,12,13,14,15,18,20,25,28,30]).reshape(-1,1)
t_data = np.array([5,7,20,31,40,44,46,49,60,62,70,80,85,91,92,97,98]).reshape(-1,1)

# 데이터의 분포를 scatter로 확인
plt.scatter(x_data.ravel(), t_data.ravel())
plt.show()

Training Set 준비

 

행렬 곱으로 처리하기 위해 y = X*w + b로 처리한다.

# 2. Linear Regression Model을 정의
W = np.random.rand(1, 1) # matrix
b = np.random.rand(1) # scalar

# H = W * x + b 

# 3.loss function을 정의
def loss_func(x, t):
    y = np.dot(x, W) + b   # Hypothesis = Wx + b
    return np.mean(np.power((t-y), 2))  # 최소제곱법


# 미분 함수
def numerical_derivative(f, x):
    # f: 미분하려고 하는 다변수 함수
    # x : 모든 변수를 포함하고 있어야 한다. ndarray (차원 상관 없이)

    delta_x = 1e-4
    derivative_x = np.zeros_like(x) # 미분한 결과를 저장하는 ndarray

    # iterator를 이용해서 입력변수 x에 대해 편미분을 수행
    it = np.nditer(x, flags=['multi_index'])

    while not it.finished:
        idx = it.multi_index # iterator의 현재 index를 추출
        # 현재 칸의 값을 어딘가에 잠시 저장한다.
        tmp = x[idx]

        x[idx] = tmp + delta_x
        fx_plus_delta = f(x)    # f(x + delta_x)

        x[idx] = tmp - delta_x
        fx_minus_delta = f(x)   # f(x - delta_x)

        derivative_x[idx] = (fx_plus_delta - fx_minus_delta) / (2 * delta_x)

        x[idx] = tmp # 데이터 원상 복구

        it.iternext()

    return  derivative_x


# 학습 종료 후 임의의 데이터에 대한 예측값을 알아오는 함수
# prediction
def predict(x):
    return np.dot(x, W) + b   # Hypothesis, Linear Regression Model


# 4. learning rate 상수가 필요, 정의
learning_rate = 0.0001

# 미분을 진행할 loss_func()에 대한 lambda 함수를 정의
f = lambda x : loss_func(x_data, t_data)
# 5. 학습을 진행
# W와 b를 update하면서 반복적으로 학습 진행
for step in range(90000):
    W = W - learning_rate * numerical_derivative(f,W)  # W의 편미분
    b = b - learning_rate * numerical_derivative(f,b)  # b의 편미분

    if step % 9000 == 0:
        print('W : {}, b : {}, loss : {}'.format(W, b, loss_func(x_data, t_data)))

# 학습 종료 후 예측
print(predict(19))

# 데이터의 분포를 scatter로 확인
plt.scatter(x_data.ravel(), t_data.ravel())
plt.plot(x_data.ravel(), np.dot(x_data,W) + b)  # 직선
plt.show()

 

회귀모델

  • 어떠한 모델에 의해, 그 값에 영향을 주는 조건을 고려해서
  • 데이터의 평균을 구하기 위한 함수
  • 즉, 회귀 (Regression) => 평균으로의 회귀

 

이러한 모델을 왜 만드느냐?

  • 해결해야 할 현실을 좀 더 단순한 형태로 표현하기 위해서
  • 현실 세계의 문제를 단순화시켜 Regression model을 만들면
    • 독립변수와 종속변수의 인과관계를 수식화/수치화 시켜 미래의 측정치를 구할 수 있다.
    • cf) 공분산은 두 변수간의 인과관계를 구할 수는 없다.

 

해결하려는 정보를 단순화 하려면?

  • 불필요한 정보들을 버린다.
  • 이때 근거는, 회귀모델의 assumption (가정)
  • 회귀모델을 만들 때, "실제 데이터는 이러이러한 특징을 가지고 있다." 라는 가정이 많을 수록
    • 모델이 단순화된다.
    • 이러한 가정에 따라 다양한 회귀 모델이 존재한다.
      • Linear Regression Model
      • Non-linear Regression Model

 

회귀모델이 [선형인지/ 비선형]인지 구별하는 기준은,

  • 독립/ 종속 변수와의 관계가 아니다.
    • y = ax + b
    • y = ax^2 + bx + c
    • 이러한 모양을 가지고 말하는게 아니다.

 

Linear Regreesion Model

회귀 계수가 선형적(+, -) 으로 결합되는 모델이다.
- 반대 : Non-Linear Regression

  • 장점
    • 회귀 계수를 추정하기 쉽고, 해석하기 쉽다. 새로운 특성 (feature)를 추가하기 쉽다.
  • 종속 변수의 갯수에 따라 나뉜다.
  • 단병량 회귀 모델
  • 다변향 회귀 모델

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함