1. 보스턴 주택 가격 데이터셋
1970년 중반 보스턴 외곽 지역의 범죄율, 방 개수, 지방세율 등 총 14개의 변수로 이루어진 데이터셋으로, 이를 통해 주택 가격을 예측할 수 있다. 변수에 대한 자세한 내용은 kaggle: boston housing에서 확인할 수 있다.
데이터 수는 총 506개로, 훈련 샘플 404개, 테스트 샘플 102개로 나뉘어 있어 비교적 개수가 적은 데이터셋이다. 따라서 K-fold cross validation을 이용하여 좀 더 정확한 평가를 할 것이다.
데이터셋 로드
from keras.datasets import boston_housing
(train_data, train_targets), (test_data, test_targets) = boston_housing.load_data()
데이터 전처리
boston housing 데이터셋은 데이터가 vector 형태로 주어지므로 데이터 벡터화(data vectorization)을 할 필요가 없다. 다만, 각 변수들의 값 범위가 다 다르므로 정규화(normalization)가 필요하다.
위 공식에 따라 데이터를 정규화함으로써 평균이 0, 표준편차가 1인 표준정규분포를 얻을 수 있다.
xmean = train_data.mean(axis=0)
train_data -= mean
std = train_data.std(axis=0)
train_data /= std
test_data -= mean
test_data /= std
각 열에 대해 평균, 표준편차를 구해 변수별로 값을 정규화시킨다. 이 때 주의해야 될 점은 모델 평가를 할 때 test data에 대해 어떠한 정보도 모른다는 가정 하에 진행해야 하기 때문에, 훈련 데이터에서 구한 평균, 표준편차를 이용하여 정규화시킨다.
2. 모델 구성
xxxxxxxxxx
from keras import models
from keras import layers
def build_model():
model = models.Sequential()
model.add(layers.Dense(64, activation='relu', input_shape=(train_data.shape[1],)))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(1))
model.compile(optimizer='rmsprop', loss='mse', metrics=['mae'])
return model
K-fold cross validation을 진행할 때는 계속해서 새 모델을 생성해야 하므로 모델 생성을 함수화시켜야 한다. 모델은 단순하게 2개 hidden layer만 사용했다. 훈련 데이터가 적을 때는 overfitting이 더 잘 발생하므로 작은 모델을 사용하여 overfitting을 피한다. 마지막 layer는 Dense(1)로 하여 자유로운 범위 내 하나의 값을 출력하도록 한다.
3. 모델 학습 및 검증
xxxxxxxxxx
import numpy as np
k=4
num_val_samples = len(train_data) // k
num_epochs = 100
all_scores = []
all_mae_histories = []
for i in range(k):
print("processing fold #", i)
# 검증 데이터 분리
val_data = train_data[i * num_val_samples: (i+1) * num_val_samples]
val_targets = train_targets[i * num_val_samples: (i+1) * num_val_samples]
# 훈련 데이터 분리
partial_train_data = np.concatenate([train_data[:i*num_val_samples], train_data[(i + 1) * num_val_samples:]], axis=0)
partial_train_targets = np.concatenate([train_targets[:i*num_val_samples], train_targets[(i + 1) * num_val_samples:]], axis=0)
# 모델 학습
model = build_model()
history = model.fit(partial_train_data, partial_train_targets, validation_data=(val_data, val_targets), epochs=num_epochs, batch_size=1, verbose=0)
mae_history = history.history['val_mean_absolute_error']
all_mae_histories.append(mae_history)
val_mse, val_mae = model.evaluate(val_data, val_targets, verbose=0)
all_scores.append(val_mae)
K-fold cross validation에 대해서는 [keras] 정확한 평가를 위한 검증(validation) 데이터 나누기 글에서 다루고 있다. mean squared error 손실 함수는 예측과 타깃 사이 거리의 제곱으로, Regression 문제에서 주로 사용된다. 또한, 예측 값과 실제 값 사이가 실제로 얼마나 차이나는지 확인하기 위해 MAE(Mean Absolute Error)를 측정한다. MAE는 예측과 타깃 사이 거리의 절댓값으로 여기서 MAE가 0.5면 예측이 평균적으로 500달러 정도 차이가 난다는 것이다. MAE를 지표로 사용하기 위해 모델을 compile할 때 metrics 값을 ['mae']로 한 것을 볼 수 있다.
4. MAE 그래프 그리기
xxxxxxxxxx
average_mae_history = [np.mean([x[i] for x in all_mae_histories]) for i in range(num_epochs)]
import matplotlib.pyplot as plt
plt.figure(1)
plt.plot(range(1, len(average_mae_history) + 1), average_mae_history, 'r', label='aver_mae')
plt.title('MAE')
plt.xlabel('Epochs')
plt.ylabel('Validation MAE')
plt.legend()
plt.show()
xxxxxxxxxx
average_mae_history = [np.mean([x[i] for x in all_mae_histories]) for i in range(num_epochs)]
이 부분은 매 epoch마다 K번 검증한 것의 평균을 구한다.
참고 : 케라스 창시자에게 배우는 딥러닝
'A·I' 카테고리의 다른 글
DSP를 이용한 음성 인식 (speech recognition) 구현 1편 : 음성 데이터 분석 (9) | 2019.03.12 |
---|---|
Regularization과 딥러닝의 일반적인 흐름 정리 (0) | 2019.01.13 |
[keras] 정확한 평가를 위한 검증(validation) 데이터 나누기 (0) | 2019.01.05 |
[keras] tensorflow-gpu ImportError 해결 및 keras 간단 설치 (0) | 2019.01.04 |
[Keras] 뉴스 기사 토픽 분류로 보는 다중 분류(multi-classification) (0) | 2018.12.26 |
댓글