안녕하세요. 문범우입니다.
이번 포스팅은 텐서플로우의 튜토리얼 세번째 내용, Regression에 대한 내용입니다.
3. Regression¶
https://www.tensorflow.org/tutorials/keras/basic_regression?hl=ko
by doorbw (https://doorbw.tistory.com)
# TensorFlow and tf.keras
# 텐서플로우와 keras를 import한다. 이떄 tensorflow는 tf라는 별칭으로 사용할 것임.
import tensorflow as tf
from tensorflow import keras
# Helper libraries
# numpy와 matplotlib을 사용한다.
import numpy as np
import matplotlib.pyplot as plt
# jupyter notebook에서 matplotlib을 사용하기 위한 매직커맨드
%matplotlib inline
print("사용되는 tensorflow의 버전:",tf.__version__)
Regression 이란?¶
Regression(회귀분석)이란, 관찰되는 연속형 변수들에 대해서 두 변수 사이의 모형을 구한뒤 그 적합도를 측정하는 분석 방식이다.
ㄱ. 데이터 준비¶
tensorflow를 이용하여 데이터를 다운 받고 데이터를 섞어준다.(shuffle)
이후 데이터를 확인해보는데 이전과 다른점은, 그전보다 데이터의 개수가 훨씬 적다.
실제로 확인해보면 이번 실습에서 사용되는 데이터의 개수는 전체 506개이다.
boston_housing = keras.datasets.boston_housing
(train_data, train_labels), (test_data, test_labels) = boston_housing.load_data()
# Shuffle the training set
order = np.argsort(np.random.random(train_labels.shape))
train_data = train_data[order]
train_labels = train_labels[order]
print("Training set: {}".format(train_data.shape)) # 404 examples, 13 features
print("Testing set: {}".format(test_data.shape)) # 102 examples, 13 features
train_data[0]
위와 같이 하나의 데이터는 총 13개의 특징을 가지고 있다.
각 특징이 나타내는 의미는 다음과 같다.
Per capita crime rate.(1인당 범죄율)
The proportion of residential land zoned for lots over 25,000 square feet.(25,000 평방 피트가 넘는 지역에 거주하는 토지의 비율.)
The proportion of non-retail business acres per town.(마을 당 비 소매 사업 에이커의 비율.)
Charles River dummy variable (= 1 if tract bounds river; 0 otherwise).(Charles River 더미 변수 (강이 경계에 있으면 1, 그렇지 않으면 0).)
Nitric oxides concentration (parts per 10 million).(질소 산화물 농도 (1000 만 분당).)
The average number of rooms per dwelling.(주거 당 평균 객실 수.)
The proportion of owner-occupied units built before 1940.(1940 년 이전에 건설 된 소유 점령 단위의 비율.)
Weighted distances to five Boston employment centers.(5 개의 보스턴 고용 센터에 가중치 적용.)
Index of accessibility to radial highways.(방사형 고속도로 접근성 지수.)
Full-value property-tax rate per $10,000.($ 10,000 당 부당한 재산세 비율.)
Pupil-teacher ratio by town.(마을 별 학생 - 교사 비율.)
1000 (Bk - 0.63) ** 2 where Bk is the proportion of Black people by town.(1000 (Bk - 0.63) ** 2 여기서 Bk는 도시 별 흑인 비율입니다.)
Percentage lower status of the population.(인구의 낮은 지위의 백분율.)
위와 같은 데이터들은 서로 다른 범위를 가지고 있다.
어떤 데이터는 0,1 의 범위를, 어떤 데이터는 1~12의 범위를, 어떤 데이터는 0~100의 범위를 가지고 있다.
실제 데이터들은 위와 같이 서로 다른 범주를 갖는 경우가 많은데, 이를 잘 분석하고 탐색하는 것은 중요한 기술이다.
먼저 pandas를 이용해서 입력데이터를 column name과 함께 살펴본다.
import pandas as pd
column_names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD',
'TAX', 'PTRATIO', 'B', 'LSTAT']
df = pd.DataFrame(train_data, columns=column_names)
df.head()
입력 데이터에 따른 label은 house price(thousands of dollars) 이다.
print(train_labels[0:10]) # Display first 10 entries
ㄴ. 데이터 정규화¶
위에서 언급한 바와 같이 범위 등이 서로 다른 데이터들은 정규화를 시켜주는 것이 좋다.
각 특징에 대해 특징의 평균을 빼고 표준편차로 나누어준다.
정규화 없이도 모델이 훈련될 수 있지만, 정규화 되지 않은 데이터들은 훈련을 보다 어렵게 할 수 있으며
심지어 모델이 입력되는 데이터의 단위에 의존하게 될 수 있다.
# Test data is *not* used when calculating the mean and std.
mean = train_data.mean(axis=0)
std = train_data.std(axis=0)
train_data = (train_data - mean) / std
test_data = (test_data - mean) / std # test_data도 train_data의 평균과 표준편차를 이용한다.
print(train_data[0]) # First training sample, normalized
def build_model():
model = keras.Sequential([
keras.layers.Dense(64, activation=tf.nn.relu,
input_shape=(train_data.shape[1],)),
keras.layers.Dense(64, activation=tf.nn.relu),
keras.layers.Dense(1)
])
optimizer = tf.train.RMSPropOptimizer(0.001)
model.compile(loss='mse',
optimizer=optimizer,
metrics=['mae'])
return model
model = build_model()
model.summary()
# Display training progress by printing a single dot for each completed epoch.
class PrintDot(keras.callbacks.Callback):
def on_epoch_end(self,epoch,logs):
if epoch % 100 == 0: print('')
print('.', end='')
EPOCHS = 500
# Store training stats
history = model.fit(train_data, train_labels, epochs=EPOCHS,
validation_split=0.2, verbose=0,
callbacks=[PrintDot()])
history개체에 저장한 것을 그래프로 살펴본다.
def plot_history(history):
plt.figure()
plt.xlabel('Epoch')
plt.ylabel('Mean Abs Error [1000$]')
plt.plot(history.epoch, np.array(history.history['mean_absolute_error']),
label='Train Loss')
plt.plot(history.epoch, np.array(history.history['val_mean_absolute_error']),
label = 'Val loss')
plt.legend()
plt.ylim([0,5])
plot_history(history)
위의 그래프를 보면 알수 있듯이 약 200epoch부터는 모델의 성능향상이 거의 없다.
이럴때 모델이 자동적으로 stop을 하도록 수정해보자.
model.fit의 callback 부분에 earyl stop이 추가되었다.
model = build_model()
# The patience parameter is the amount of epochs to check for improvement.
early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', patience=20)
history = model.fit(train_data, train_labels, epochs=EPOCHS,
validation_split=0.2, verbose=0,
callbacks=[early_stop, PrintDot()])
plot_history(history)
실제로 test data를 통해 얼마 만큼의 평균오차를 내는지 확인해보자.
[loss, mae] = model.evaluate(test_data, test_labels, verbose=0)
print("Testing set Mean Abs Error: ${:7.2f}".format(mae * 1000))
ㅁ. 예측하기¶
test_predictions = model.predict(test_data).flatten()
print(test_predictions)
'AI & BigData > TensorFlow' 카테고리의 다른 글
텐서플로우(tensor flow) 튜토리얼 #4_Overfitting and Underfitting (0) | 2018.08.30 |
---|---|
텐서플로우(tensor flow) 튜토리얼 #2_Text Classification (0) | 2018.08.08 |
텐서플로우(tensor flow) 튜토리얼 #1_Basic Classification (0) | 2018.08.04 |