Building Machine Learning System with Python ch.1.2

적절한 모델과 학습 알고리즘 선택

모델을 만들기에 앞서 현실의 이론적 근사치에는 항상 현실과 차이가 있다.
이를 근사치 오차라고 한다. 
이는 모델이 예측한 예상 값과 실제 값 사이의 거리 제곱으로 계산한다.

우선 단순한 직선으로 시작해보자.
어떻게 하면 근사치 오차가 가장 작도록 차트에 직선을 그을 수 있을까?
Scipy 의 polyfit() 함수가 정확히 이런 일을 수행한다.
이 함수는 x,y,우리가 원하는 다항 함수의 차수를 고려해 모델 함수를 찾는다.

fp1, res1, rank1, sv1, rcond1 = sp.polyfit(x, y, 1, full=True)
print("Model parameters of fp1: %s" % fp1)
print("Error of the model of fp1:", res1)
f1 = sp.poly1d(fp1)

polyfit() 함수는 적합화된 모델 함수 fp1의 매개변수를 반환한다.
또한 full=True 옵션을 설정하면 추가적인 정보를 얻을 수 있다. 
정확히 근사치 오차를 나타내는 잔차(res1)가 관심거리이다.

출력값은 
Model parameters of fp1:  [2.59619213 989.02487106]
[3.17389767e+08]
이다.

그렇다면 가장 적합한 직선은 
f( x ) = 2.59619213*x 989.02487106
이다.

모델 매개변수로부터 모델을 생성하려면 poly1d() 함수를 사용한다.

f1 = sp.poly1d(fp1)

아래와 같은 함수를 그려주는 함수를 작성하고 기존 데이터 플롯에 그려본다.

def plot_models(x, y, models, fname, mx=None, ymax=None, xmin=None):

    plt.figure(num=None, figsize=(8, 6))
    plt.clf()
    plt.scatter(x, y, s=3)
    plt.title("Web traffic over the last month")
    plt.xlabel("Time")
    plt.ylabel("Hits/hour")
    plt.xticks(
        [w * 7 * 24 for w in range(10)], ['week %i' % w for w in range(10)])

    if models:
        if mx is None:
            mx = sp.linspace(0, x[-1], 1000)
        for model, style, color in zip(models, linestyles, colors):
            # print "Model:",model
            # print "Coeffs:",model.coeffs
            plt.plot(mx, model(mx), linestyle=style, linewidth=2, c=color)

        plt.legend(["d=%i" % m.order for m in models], loc="upper left")

    plt.autoscale(tight=True)
    plt.ylim(ymin=0)
    if ymax:
        plt.ylim(ymax=ymax)
    if xmin:
        plt.xlim(xmin=xmin)
    plt.grid(True, linestyle='-', color='0.75')
    plt.savefig(fname)

plot_models(x, y, [f1], os.path.join(CHART_DIR, "1400_01_02.png"))

x,y 의 데이터와 f1을 이용해 그래프를 그리고 png 확장자로 저장한다.
실행해보면 아래와 같은 그래프가 나온다.

차수를 늘려서 한 그래프에 그리다 보면 아래와 같은 그래프도 그릴 수 있다.
차수에 따른 오차들을 한번 측정해보면 아래와 같다.

Errors for only the time after inflection point
Error d=1: 22143941.107618
Error d=2: 19768846.989176
Error d=3: 19766452.361027
Error d=10: 18949296.731184
Error d=53: 18300718.983703 

주요 데이터뿐만 아니라 노이즈까지 반영됐는데, 이를 과적합화라 한다.
이쯤에서 다음을 선택해야 한다.

1. 적합화된 다항식 모델 중 하나를 선택해야 할지
2. 스플라인 같은 좀 더 복잡한 모델로 바꿔야할지
3. 데이터를 다르게 분석하고 다시 시작해야할지

다음에는 데이터를 다시 보고 새로운 방법을 생각해내는 방법에 대해 써야겠다.

댓글

이 블로그의 인기 게시물

윈도우 설치에서 파티션 설정 오류(NTFS)

[exploit writing] 1_스택 기반 오버플로우 (1) First

하둡 설치 오류 정리