Skip to content

기계학습 Regression #
Find similar titles

Regression #

회귀 Regression 분석 방법은 기계학습의 가장 기초적이고 다른 기계학습 분석방법의 중심이 되는 핵심 내용이다.

  • 회귀 분석 : 주어진 데이터에 가장 적절한 식을 찾는 방법.

    1. '1, 2, 3, 4, 5 '처럼 1부터 5까지 1씩 증가하는 수가 있다고 가정.
    2. 각 숫자를 (1, 1)처럼 좌표로 변환하여 좌표평면으로 그림.
    3. 좌표 평면을 보면 x축의 값이 y축의 값과 같으므로 $ y = x $ 관계를 알 수 있음.
    4. 이때 회귀선이 y=x가 되며, 회귀값은 기울기인 1이 됨.

    img

    그림 1.

Hypothesis #

회귀 분석은 방정식 형태로 나오며 이런 방정식을 가설(Hypothesis)이라고 한다. 그래서 가설은 방정식의 차수에 따라 다양한 형태가 나올 수 있으며 입력한 데이터에 가장 잘 맞는 식을 찾는 것이 목적이 된다.

  • 해당 설명에서는 1차 방정식만 다룸.
  • 가설을 줄여서 H(x)라고 쓰며 H(x) = Wx + b 형태로 나타냄.
  • W는 기울기(=가중치) Weight, b는 잔차(오차값) Cost, x는 입력값, H(x)는 결과값을 의미.

Cost #

회귀 분석에 사용하는 방정식을 가설(Hypothosis)이라고 하며 이런 가설의 결과값을 예측값 (Predict)이라고 한다. 이런 예측값과 실제값의 차이를 비용(Cost)이라고 하며 비용값이 작을수록 좋은 가설이라고 할 수 있다.

  • 비용(Cost)는 손실(Loss)이라고도 하며 Cost를 구하는 식을 손실함수라고 함.
  • 예측값과 실제값의 차이는 음수일 수도 있으므로 제곱하여 사용.
  • 가장 비용이 적은 회귀함수를 찾기 위해 최소자승법을 사용.

    1. 입력값을 x, 결과값을 y 라고 하며, x에 1, 2, 3, 4, 5를 대입하였더니 각각 y값으로 1, 3, 2, 5, 4이 나왔다고 가정.
    2. x, y를 (x, y) 식으로 바꾸어 좌표평면에 표현.
    3. 하지만 주어진 좌표를 모두 지나는 1차 식을 찾을 수 없음.
    4. 그래서 결과값 y과 예측값 H(x)의 차이(=Cost)가 가장 적은 가설을 찾는 것이 목표
    5. 비용은 결과값과 예측값의 차이의 제곱값이며 해당 예에서는 (2, 3)과 가설 y=x와의 비용값은 1이 됨.

    img

    그림 2.

    Cost Function #

    해당 원리를 파이썬 코드로 구현. 가설의 기울기(=가중치)인 Weight값에 따라 비용값(Cost값)이 어떻게 변하는지 그래프를 통해 알아본다.

  • 입력값과 결과값은 위의 예에 사용한 값을 그대로 입력.

  • 가중치 값을 -10 부터 13까지 반복 입력하면서 cost 값을 계산하여 그래프로 출력.
  • 아래 코드를 실행하면 기울기와 비용을 계산한 그래프가 출력됨.
  • 비용함수는 아래로 볼록한 모양의 그래프로 그려져야 최적화가 가능.
  • 최적화가 가능한 볼록한 모양을 볼록한 그래프(Convex Graph) 라고 함.

    import matplotlib.pyplot as plt
    x = [1., 2., 3., 4., 5.]  # 입력값
    y = [1., 3., 2., 5., 4.]  # 결과값
    W_val, Cost_val = [], []  # 각 계산 결과를 담을 리스트
    
    for i in range(-10, 13):  # -10 부터 12까지 반복
        W = i
        sum_val = 0
    
        for j in range(len(x)):
            sum_val = (W * x[j] - y[j])**2   # 비용의 합계
        C = sum_val / len(x)   # 비용을 평균값
    
        W_val.append(W)       # 기울기를 리스트에 저장
        Cost_val.append(C)    # 비용을 리스트에 저장
    
        if i % 2 == 0:
            plt.annotate(C, xy=(i, C), xytext=(i-.5, C+20), size=15 )  #  비용값을 그래프에 출력
            plt.scatter(i, C, s=50)
    
    plt.plot(W_val, Cost_val)
    
    plt.xlabel('Weight')
    plt.ylabel('Cost')
    plt.show()
    

    img

    그림 3.

Gradient Descent #

점진적인 하강(=경사하강법)이라는 의미이며 위에서 그린 비용함수에서 가장 적은 비용일 때의 위치를 찾는 방법이다. 가장 비용이 적은 곳이 주어진 데이터에 가장 잘 맞는 회귀모델의 기울기를 의미한다.

  • 어떤 점에서 시작해도 제일 최저점으로 점진적으로 이동한다고 해서 점진적이라고 함.
  • 경사도(Gradient)는 가설의 기울기를 의미하며 최저점일 때 경사도가 제일 낮음.
  • 학습 비율(learning rate)는 한번 훈련할 때마다 이동하는 정도를 의미.
  • 비용함수 그래프가 볼록한 모양이어야 알맞은 최저점을 구할 수 있음.

    import matplotlib.pyplot as plt
    import pandas as pd
    
    x = [1., 2., 3., 4., 5.]  # 입력값
    y = [1., 3., 2., 5., 4.]  # 결과값
    Step_val, Weight_val, Gradient_val, Cost_val = [], [], [], []
    
    weight = -80    #  시작 위치를 임의로 지정
    learning_rate = 0.01  # 학습비율, 경사를 이동하는 정도
    
    for step in range(0, 101):
        sum_cost, sum_gradient = 0, 0
    
        for i in range(len(x)):
            sum_cost += (weight * x[i] - y[i])**2   # 비용은 잔차의 제곱
            sum_gradient += (weight * x[i] - y[i]) * x[i]  # 경사도는 잔차에 x값을 곱함.
    
        cost = sum_cost / len(x)
        gradient = sum_gradient / len(x)
        weight = weight - gradient * learning_rate  # 기울기를 새로 계산
    
        if step % 20 == 0:
            Step_val.append(step)
            Gradient_val.append(gradient)
            Weight_val.append(weight)
            Cost_val.append(cost)
    
    data={'Gradient':Gradient_val, 'Weight':Weight_val, 'Cost':Cost_val}
    df = pd.DataFrame(data, columns=['Gradient', 'Cost', 'Weight'], index=Step_val).T
    df
    

    img

    그림 4.

    경사하강법 Gradient Descent 을 100번 반복한 결과이며 반복할수록 경사도가 낮아지는 것을 볼 수 있다. 경사도가 음수나 양수에 상관없이 정상적으로 작동하는데 좌우가 대칭인 그래프이기 때문에 계산할 수 있다.

    • Gradient는 경사도이며 결과값이 클수록 더 많이 움직임.
    • Cost는 비용이며 클수록 예측값과 실제값의 차이가 크다는 것을 의미.
    • Weight는 회귀모델의 기울기이며 경사도와 비용값에 따라 달라짐.

Gradient Graph #

위 과정에서 경사도와 그에 따른 비용과 기울기의 변화를 구해보았는데 각각의 값을 그래프로 그려서 어떤 변화를 나타내는지 살펴보자.

    import matplotlib.pyplot as plt
    import pandas as pd
    import numpy as np

    x = [1., 2., 3., 4., 5.]  # 입력값
    y = [1., 3., 2., 5., 4.]  # 결과값
    Step_val, Weight_val, Gradient_val, Cost_val = [], [], [], []

    # 그래프 설정
    plt.figure(figsize=(10,10))
    plt.xlabel('x축', fontsize=15)
    plt.ylabel('y축', fontsize=15)
    plt.xlim(xmin=0, xmax=max(x)+1)
    plt.ylim(ymin=0, ymax=max(y)+1)
    plt_x = np.arange(0, 6.0, 0.01)

    # x,y 좌표를 출력
    plt.scatter(x, y, s=100)
    for i in range(len(x)):
    ax = str(int(x[i]))
    ay = str(int(y[i]))
    annotation = '(' + ax + ',' + ay + ')'
    plt.annotate(annotation, xy=(x[i] - .1, y[i] + .2), size=20 )


    weight = -80    #  시작 위치를 임의로 지정
    learning_rate = 0.01  # 학습비율, 경사를 이동하는 정도

    for step in range(0, 101):
    sum_cost, sum_gradient = 0, 0

    for i in range(len(x)):
    sum_cost += (weight * x[i] - y[i])**2   # 비용은 잔차의 제곱
    sum_gradient += (weight * x[i] - y[i]) * x[i]  # 경사도는 잔차에 x값을 곱함.

    cost = sum_cost / len(x)
    gradient = sum_gradient / len(x)
    weight = weight - gradient * learning_rate  # 기울기를 새로 계산

    Step_val.append(step)
    Gradient_val.append(gradient)
    Weight_val.append(weight)
    Cost_val.append(cost)

    plt.plot(plt_x, weight * plt_x, alpha=step / 100)  #반복하면서 그래프를 출력

    plt.show()

img

그림 5.

위 그래프는 100번을 반복하면서 기울기 값을 그래프로 그린 것이다. 위 결과표에서 처음 기울기 값은 -71이었지만 훈련이 반복되면서 최종적으로 0.96이 나와 거의 1에 가까워진 것을 볼 수 있다. 이는 기울기가 0.96일 때 비용값이 가장 적었다는 의미이다.

  • 가장 나중에 그려진 그래프일수록 진하며 처음에 그린 그래프일수록 흐림.
  • 시작값이 -80인 음수이기 때문에 기울기에 밑에서부터 증가함.
  • 기울기가 0.96일 때가 가장 비용이 적으며 주어진 데이터에서 가장 잘 맞는 회귀모델의 가중치임을 알 수 있음.

Finish #

지금까지 회귀모델에 대해 살펴보았다. 이는 아주 간단한 예제이지만 실제 기계학습에서 회귀 모델이 어떤 식으로 예측값을 구하고 비용값을 구하는지 원리를 파악하기 위해 사용하였다. 마지막으로 정리하면 회귀모델은 주어진 데이터에 가장 잘 맞는 가설을 구하는 것을 의미하며 그렇기 위해서는 최소의 비용값을 찾는 것이 중요하다는 것을 알 수 있다.

  • 잔차 : 예측값과 실제값의 차이.
  • 비용 : 잔차의 제곱값의 평균 (잔차가 음수일 경우 평균계산이 되지 않으므로 제곱처리)
  • 가설 : 회귀모델을 방정식, (가중치 x 입력값 + 오차값)
    • 위 예제에서는 단순한 1차식이라 오차값을 계산하지 않음.
  • 예측값 : 가설 공식의 결과값
  • 실제값 : 주어진 데이터의 실제 값(y값에 해당)
  • 경사타기 알고리즘 : 최소의 비용값을 찾기 위한 알고리즘

참고문헌 #

0.0.1_20140628_0