ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Tensorflow - 딥러닝 모델과 퍼셉트론(보스턴 집값 예측)
    생활코딩/머신러닝야학 2020. 8. 17. 20:36

    [강의 출처] opentutorials.org/module/4966/28976

     

    두번째 딥러닝 - 보스턴 집값 예측 - Tensorflow 1

    수업소개 보스턴 집값을 예측하는 딥러닝 모델을 텐서플로우를 이용하여 만들어 보고, 모델을 구성하는 퍼셉트론에 대해 이해합니다. 강의  수식과 퍼셉트론  실습  소스코드 colab |  backend.

    opentutorials.org


    대푯값

    -평균값(Mean or Average): 일반적인 경우에 대푯값으로 많이 사용되는 값. 다만 평균 연봉처럼 이상치(outlier)에 영향을 많이 받는 데이터의 경우, 평균값이 대표성을 띠지 못할 수 있음

    -중앙값(Median): 값들을 순서대로 정렬했을 때 중앙에 위치한 값

    -최빈값(Mode): 값 중에서 가장 자주 등장하는 값

     

    보스턴 집값 예측

    행은 타운(Town), 열은 아래의 컬럼명과 같은 정보로 이루어진 데이터가 있다고 할 때, 1~13열의 정보를 통해 14열의 집값을 예측하는 공식을 알아내는 작업

    아래 식에서 a~m에 해당하는 상관계수를 알아낸다면, 1~13열의 정보가 주어졌을 때 MEDV 값을 예측할 수 있음

     

    MEDV(24) = CRIM(0.00632)*a + ZN(18)*b + INDUS(2.31)*c + CHAS(0)*d + NOX(0.538)*e + RM(6.575)*f + AGE(65.2)*g + DIS(4.09)*h + RAD(1)*i + TAX(296)*j + PTRATIO(15.3)*K + B(396.9)*l + LSTAT(4.98)*m

    1 2 3 4 5 6 7 8 9 10 11 12 13 14
    CRIM ZN INDUS CHAS NOX RM AGE DIS RAD TAX PTRATIO B LSTAT MEDV
    범죄율     강변 여부   평균 방 수 노후주택 비율     재산세 비율 학생/교사 비율   하위계층 비율 집값의 중앙값
    0.00632 18 2.31 0 0.538 6.575 65.2 4.09 1 296 15.3 396.9 4.98 24

     

    # 라이브러리 사용
    import tensorflow as tf
    import pandas as pd
    
    
    # 1.과거의 데이터를 준비합니다.
    파일경로 = 'https://raw.githubusercontent.com/blackdew/tensorflow1/master/csv/boston.csv'
    보스턴 = pd.read_csv(파일경로)
    print(보스턴.columns) # Index(['crim', 'zn', 'indus', 'chas', 'nox', 'rm', 'age', 'dis', 'rad', 'tax', 'ptratio', 'b', 'lstat', 'medv'], dtype='object')
    # 이대로 아래에서 독립/종속변수 분리
    보스턴.head()
    
    
    # 독립변수, 종속변수 분리 
    독립 = 보스턴[['crim', 'zn', 'indus', 'chas', 'nox', 'rm', 'age', 'dis', 'rad', 'tax',
                'ptratio', 'b', 'lstat']]
    종속 = 보스턴[['medv']]
    print(독립.shape, 종속.shape) # shape가 안 맞으면 버그가 날 수 있으므로 꼭 확인해야함
    
    
    # 2. 모델의 구조를 만듭니다
    X = tf.keras.layers.Input(shape=[13]) # 독립변수가 13열. 13개의 입력층 구성
    Y = tf.keras.layers.Dense(1)(X) # 종속변수는 1열. 출력층은 1개
    model = tf.keras.models.Model(X, Y)
    model.compile(loss='mse')
    
    """
    13개의 입력층과 1개의 출력층은 아래 수식으로 구성 가능
    y(출력층) = w1x1 + w2x2 + ... + w13x13 + b (입력층)
    퍼셉트론(Perceptron): 위의 수식은 출력층이 하나인 퍼셉트론을 가리킴
    가중치(Weight): w1 ~ w13
    편향(bias): b
    """
    
    # 3.데이터로 모델을 학습(FIT)합니다.
    model.fit(독립, 종속, epochs=1000, verbose=0)
    model.fit(독립, 종속, epochs=10)
    # loss가 매 학습마다 조금씩 줄어든다면 더 학습시킬 여력이 있는 상황이므로 추가 학습 진행해도 됨
    
    
    # 4. 모델을 이용합니다
    print(model.predict(독립[5:10])) # 6번째부터 11번째 열에 해당하는 데이터로 테스트
    # 종속변수 확인
    print(종속[5:10])
    """
    [[26.83134 ]
     [21.571602]
     [18.461823]
     [ 9.755964]
     [18.098982]]
     
        medv
    5  28.7
    6  22.9
    7  27.1
    8  16.5
    9  18.9
    
    근접한 정도 확인. 선형회귀에서 100% 일치는 사실상 어렵고, 차이를 줄이는 것이 목표
     """
    
    # 모델의 수식 확인
    print(model.get_weights())
    """
    [array([[-0.08650918],
           [ 0.08076939],
           [-0.05519128],
           [ 3.3360822 ],
           [ 1.4669524 ],
           [ 3.7811213 ],
           [ 0.02130296],
           [-0.87434626],
           [ 0.14586656],
           [-0.0088202 ],
           [ 0.08197837],
           [ 0.01700737],
           [-0.59813136]], dtype=float32), array([2.4205594], dtype=float32)]
    
    위에서 봤던 y = 수식처럼 작성하면 아래와 같은 모양
    y = -0.08650918 * x1 +  0.08076939 * x2 + -0.05519128 * x3 +  3.3360822  * x4 +  1.4669524  * x5 +  3.7811213  * x6 +  0.02130296 * x7 + -0.87434626 * x8 +  0.14586656 * x9 + -0.0088202  * x10 +  0.08197837 * x11 +  0.01700737 * x12 + -0.59813136 * x13 * x+ 2.4205594
    """

     

    *Colab에서 로컬파일을 읽어오고 싶다면

    -왼쪽의 폴더 메뉴 바에서 Colab 서버에 파일 업로드를 한 다음, 경로복사( /content/sample_data/boston.csv 형태)하면 로컬데이터 읽어올 수 있음

     

    *학습의 실제(딥러닝 워크북)

    -매 학습 epochs 마다 Weight와 Bias 값을 조금씩 변화시켜가면서, loss 값을 확인해서 앞으로 변해가야 하는 방향을 체크.

    -Weight를 키웠을 때 loss가 증가했다면, 이후 Weight는 감소해야 함을 의미(+- 방향성 체크)

    -미분을 통해 Weight, Bias 값을 변화시켜가면서 loss가 충분히 줄어들 때까지 위 과정을 반복

     

    댓글

Designed by Tistory.