Tensorflow - 딥러닝 모델과 퍼셉트론(보스턴 집값 예측)
[강의 출처] 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가 충분히 줄어들 때까지 위 과정을 반복