Created
January 30, 2018 04:20
-
-
Save ryoen/34501fc62a6e61e34229494ef7ea6b5d to your computer and use it in GitHub Desktop.
"Deep Learning with Python" ボストンの住宅価格予測のサンプル
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from keras.datasets import boston_housing | |
(train_data, train_targets), (test_data, test_targets) = boston_housing.load_data() | |
# 前処理 | |
# データを標準化(平均0、分散1に変換)する | |
mean = train_data.mean(axis=0) | |
train_data -= mean | |
std = train_data.std(axis=0) | |
train_data /= std | |
test_data -= mean | |
test_data /= std | |
print(train_data) | |
from keras import models | |
from keras import layers | |
# モデル定義 | |
#KFCV用に同じモデルを複数回作成するため、関数にする | |
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 | |
import numpy as np | |
k = 4 | |
num_val_samples = len(train_data) // k | |
num_epochs = 100 | |
all_scores = [] | |
# K-fold cross validation (K-分割交差検証; KFCV) | |
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() | |
model.fit(partial_train_data, partial_train_targets, | |
epochs=num_epochs, batch_size=1, verbose=0) | |
val_mse, val_mae = model.evaluate(val_data, val_targets, verbose=0) | |
all_scores.append(val_mae) | |
num_epochs = 500 | |
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=1) | |
mae_history = history.history['val_mean_absolute_error'] | |
all_mae_histories.append(mae_history) | |
average_mae_history = [np.mean([x[i] for x in all_mae_histories]) for i in range(num_epochs)] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment