728x90
# 또 다른 데이터셋을 이용해서 예측해 보자!
#주택가격예측 오렌지, 사이킷런, 딥러닝... 여러 가지 방법으로 할 수 있다

import keras
import numpy as np
import matplotlib.pyplot as plt

#보스턴 주택 가격 데이터셋

from keras.datasets import boston_housing
(train_data, train_labels), (test_data, test_data_labels) = boston_housing.load_data()

train_data.shape

test_data.shape

mean = train_data.mean(axis=0)

train_data -= mean
#train_data = train_data - mean 와 같은 표현

# 표준 편차를 구한다. 0번축을 기준으로 한다. 
std = train_data.std(axis=0)

train_data / train_data / std
train_data = train_data / std

print(train_data)

mean = test_data.mean(axis=0)
test_data -= mean
std = test_data.std(axis=0)
test_data /= std

print(test_data)

#신경망 만들기 #mae 절대평균오차

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-forder 검증. 테스트(검증), 학습용(훈련)
# k가 3개이면, 검증 결과가 1, 2, 3으로 나온다
#---->데이터가 부족할 때 사용하는 방법

k = 4

num_val_samples = len(train_data) // k #폴더의 사이즈

#반복할 때마다 []에 요소 추가하기
all_scores = []

for i in range(k):
  print('처리중인 폴드 #', i, '번째')

  #검증 데이터 준비: k번째 분할
  #슬라이싱
  val_data = train_data[i * num_val_samples : (i+1) * num_val_samples]
  val_labels = train_labels[i * num_val_samples : (i+1) *num_val_samples]

  #훈련 데이터 준비 #검증용 데이터 빼고 다 가져오기 #0에서부터 가져온다. 0은 값X
  #1번부터 나머지 다 가져오기
  partial_train_data = np.concatenate(
    [train_data[: i* num_val_samples],
    train_data[(i+1)*num_val_samples:]], axis=0)
  
  partial_train_labels = np.concatenate(
    [train_data[: i * num_val_samples],
    train_data[(i+1)*num_val_samples:]], axis=0)  
  
  model = build_model()
  model.fit(partial_train_data,
            partial_train_labels,
            epochs=20,
            batch_size=1,
            verbose=0)
  
  val_mse, val_mae = model.evaluate(val_data, val_labels, verbose=0)
  all_scores.append(val_mae)

print(all_scores)

np.mean(all_scores)

# K-folder 검증
k = 4
num_epochs = 500

num_val_samples = len(train_data) // k #폴더의 사이즈
all_scores = []

for i in range(k):
  print('처리중인 폴드 #',i)

  # 검증 데이터를 준비: k번째 분할
  val_data = train_data[i * num_val_samples : (i+1) * num_val_samples]
  val_labels = train_labels[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_labels = np.concatenate(
    [train_labels[: i * num_val_samples],
    train_labels[(i+1)*num_val_samples:]], axis=0)

  model = build_model()
  history = model.fit(partial_train_data,
              partial_train_labels,
              epochs=num_epochs,
              batch_size=1,
              validation_data=(val_data, val_labels),
              verbose=0)
  mae_history = history.history['mae']
  
  all_scores.append(mae_history)

print(all_scores)

#x의 i번째
average_mae_history = [np.mean([x[i] for x in all_scores]) for i in range(num_epochs)]

plt.plot(range(1, len(average_mae_history)+1), average_mae_history)
plt.xlabel('Epochs')
plt.ylabel('Validation MAE')
728x90

+ Recent posts