2021년 보스턴 집값 예측 Study blog
머신러닝 야학, 캐글 데이터, 이수안컴퓨터연구소 실습 노트북
import tensorflow as tf
import pandas as pd
- row : 506
- col : 14
- 보스턴 주택 가격 데이터(1000달러 기준)와 주택 가격에 영향을 미칠만한 데이터
- CRIM : 범죄율
- ZN : 25,000 평방피트를 초과하는 거주지역의 비율
- INDUS : 비소매상업지역이 점유하고 있는 토지의 비율
- CHAS : 찰스강에 대한 더미변수(강의 경계에 위치한 경우는 1, 아니면 0)
- NOX : 10ppm 당 농축 일산화질소
- RM : 주택 1가구당 평균 방의 개수
- AGE : 1940년 이전에 건축된 소유주택의 비율
- DIS : 5개의 보스턴 직업센터까지의 접근성 지수
- RAD : 방사형 도로까지의 접근성 지수
- TAX : 10,000 달러 당 재산세율
- PTRATIO : 자치시(town)별 학생/교사 비율
- B : 1000(Bk-0.63)^2, 여기서 Bk는 자치시별 흑인의 비율을 말함.
- LSTAT : 모집단의 하위계층의 비율(%)
- MEDV : 본인 소유의 주택가격(중앙값) (단위: $1,000)
출처: https://ai-times.tistory.com/431 [ai-times]
파일경로 = 'https://raw.githubusercontent.com/blackdew/tensorflow1/master/csv/boston.csv'
보스턴 = pd.read_csv(파일경로)
print(보스턴.columns)
보스턴.head()
보스턴.tail()
보스턴.info()
보스턴.age.mean() # 1940년 이전에 건축된 소유주택의 비율
보스턴[['crim']].mean()
보스턴[['crim']].max()
보스턴[['crim']].min()
보스턴.boxplot(column=['crim']) # 이상치 제거 필요
독립 = 보스턴[['crim', 'zn', 'indus', 'chas', 'nox', 'rm', 'age', 'dis', 'rad', 'tax', 'ptratio', 'b', 'lstat']]
종속 = 보스턴[['medv']]
print(독립.shape, 종속.shape)
X = tf.keras.layers.Input(shape=[13]) # 독립에서의 col
Y = tf.keras.layers.Dense(1)(X) # 종속에서의 col
model = tf.keras.models.Model(X, Y)
model.compile(loss='mse')
model.fit(독립, 종속, epochs=10000, verbose=0)
model.fit(독립, 종속, epochs=10)
# 예측값
print(model.predict(독립[0:5]))
# 실제값(종속변수 확인)
print(종속[0:5])
예측값 = model.predict(독립)
실제값 = 종속
오차값 = (예측값 - 실제값)**2
오차값.head()
오차값.mean() #MSE
model.get_weights()
예측값[0]
독립.iloc[0]
'''
crim 0.00632 * -0.09769897
zn 18.00000 * 0.04758811
indus 2.31000 * -0.01014985
chas 0.00000 * 2.6305165
nox 0.53800 * -5.6234183
rm 6.57500 * 5.012733
age 65.20000 * -0.00839883
dis 4.09000 * -1.1512003
rad 1.00000 * 0.2200571
tax 296.00000 * -0.01184279
ptratio 15.30000 * -0.6021571
b 396.90000 * 0.01250572
lstat 4.98000 * -0.47408003 + 13.713469
[array([[-0.09769897],
[ 0.04758811],
[-0.01014985],
[ 2.6305165 ],
[-5.6234183 ],
[ 5.012733 ],
[-0.00839883],
[-1.1512003 ],
[ 0.2200571 ],
[-0.01184279],
[-0.6021571 ],
[ 0.01250572],
[-0.47408003]], dtype=float32), array([13.713469], dtype=float32)]
'''
0.00632 * -0.09769897 +\
18.00000 * 0.04758811 +\
2.31000 * -0.01014985 +\
0.00000 * 2.6305165 +\
0.53800 * -5.6234183 +\
6.57500 * 5.012733 +\
65.20000 * -0.00839883 +\
4.09000 * -1.1512003 +\
1.00000 * 0.2200571 +\
296.00000 * -0.01184279 +\
15.30000 * -0.6021571 +\
396.90000 * 0.01250572 +\
4.98000 * -0.47408003 + 13.713469
예측값 = model.predict(독립)
예측값
예측값 = pd.DataFrame(예측값)
예측값.to_csv('result.csv')
X = tf.keras.layers.Input(shape=[13]) # 독립변수의 col
H = tf.keras.layers.Dense(200, activation='swish')(X) # 노드의 수는 천천히 늘려감! (2 ~ 200)
H = tf.keras.layers.Dense(5, activation='swish')(H) # 처음에는 주석처리!
H = tf.keras.layers.Dense(5, activation='swish')(H) # 처음에는 주석처리!
H = tf.keras.layers.Dense(5, activation='swish')(H) # 처음에는 주석처리!
H = tf.keras.layers.Dense(5, activation='swish')(H) # 처음에는 주석처리!
Y = tf.keras.layers.Dense(1)(H) # 종속변수의 col
model = tf.keras.models.Model(X, Y)
model.compile(loss='mse') # MSE(Mean squared error)
model.summary()
plot_model(model)
model.fit(독립, 종속, epochs=1000, verbose=0)
model.fit(독립, 종속, epochs=10)
# 예측값
print(model.predict(독립[0:5]))
# 실제값(종속변수 확인)
print(종속[0:5])
고도화 작업 - 2
- 출처 : 이수안컴퓨터연구소, 케라스 보스턴 주택 가격 모델
- 유튜브 영상 : https://youtu.be/utP3gh9DZI8
import tensorflow as tf
from tensorflow.keras.datasets.boston_housing import load_data
from tensorflow.keras.layers import Dense
from tensorflow.keras.models import Sequential
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.utils import plot_model
from sklearn.model_selection import train_test_split
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.style.use('seaborn-white')
import random
random.randint(1, 10)# 1부터 10까지의 값을 가짐
import random
random.seed(5)
random.randint(1, 10)# 1부터 10까지의 값을 가짐
tf.random.set_seed(111)
(x_train_full, y_train_full), (x_test, y_test) = load_data(path='boston_housing.npz',
test_split=0.2,
seed=111)
x_train_full # 집값의 독립변수
y_train_full # 집값의 정답값(종속변수)
x_train_full.shape
y_train_full.shape
# 'crim', 'zn', 'indus', 'chas', 'nox', 'rm', 'age', 'dis', 'rad', 'tax', 'ptratio', 'b', 'lstat', 'medv'
# x_train_full.shape : 'crim'(범죄율), 'zn', 'indus', 'chas', 'nox', 'rm', 'age', 'dis', 'rad', 'tax', 'ptratio', 'b', 'lstat'
# y_train_full.shape : 'medv'(집값, 1000 달러 단위)
(x_test.shape, y_test.shape)
arr = [[10, 20, 30],
[3, 50, 5],
[70, 80, 90],
[100, 110, 120]]
print("Two Dimension array :", arr)
print("Mean with no axis :", np.mean(arr))
print("Mean with axis along column :", np.mean(arr, axis=0)) # row 평균을 구함, 값은 col으로 구해짐
print("Mean with axis aong row :", np.mean(arr, axis=1)) # col 평균을 구함, 값은 row으로 구해짐
np.sum(arr) / 12
mean = np.mean(x_train_full, axis=0)
std = np.std(x_train_full, axis=0)
x_train_preprocessed = (x_train_full - mean) / std # 데이터의 스케일을 줄이기 위해 사용하는 것
x_test = (x_test - mean) / std
x_train, x_val, y_train, y_val = train_test_split(x_train_preprocessed, y_train_full,
test_size=0.3, random_state=111)
x_train.shape, x_val.shape, y_train.shape, y_val.shape
- 학습 데이터가 매우 적은 경우 모델의 깊이를 깊게 할수록 과대적합(Overfitting)이 일어날 확율이 높음
'''
# 히든레이어 모델 준비
X = tf.keras.layers.Input(shape=[13]) # 독립변수의 col
H = tf.keras.layers.Dense(200, activation='swish')(X) # 노드의 수는 천천히 늘려감! (2 ~ 200)
H = tf.keras.layers.Dense(5, activation='swish')(H) # 처음에는 주석처리!
H = tf.keras.layers.Dense(5, activation='swish')(H) # 처음에는 주석처리!
H = tf.keras.layers.Dense(5, activation='swish')(H) # 처음에는 주석처리!
H = tf.keras.layers.Dense(5, activation='swish')(H) # 처음에는 주석처리!
Y = tf.keras.layers.Dense(1)(H) # 종속변수의 col
model = tf.keras.models.Model(X, Y)
model.compile(loss='mse') # MSE(Mean squared error)
'''
model = Sequential([Dense(100, activation='relu', input_shape=(13, ), name='dense1'),
Dense(64, activation='relu', name='dense2'),
Dense(32, activation='relu', name='dense3'),
Dense(1, name='output')])
model.summary()
plot_model(model)
model.compile(loss='mse', optimizer=Adam(learning_rate=1e-2), metrics=['mae'])
# MAE는 절대 평균 오차로 MSE처럼 제곱을 하지 않고 절대값을 씌어 평균을 냄
# MSE와 MAE : https://wooono.tistory.com/99
# Adam은 파라미터마다 다른 크기의 업데이트를 적용하는 방법!
# Adam에 대한 보다 상세한 글 : https://hiddenbeginner.github.io/deeplearning/2019/09/22/optimization_algorithms_in_deep_learning.html
# 잘 모르겠으면 일단 아담을 사용하라는 글 : https://sacko.tistory.com/42
## 각각 옵션에 대한 상세한 글 :
## https://wikidocs.net/36033
## https://onesixx.com/optimizer-loss-metrics/
history = model.fit(x_train, y_train, epochs=300, validation_data=(x_val, y_val))
model.evaluate(x_test, y_test)
history.history.keys()
history_dict = history.history
loss = history_dict['loss']
val_loss = history_dict['val_loss']
epochs = range(1, len(loss) + 1)
fig = plt.figure(figsize=(12, 6))
ax1 = fig.add_subplot(1, 2, 1)
ax1.plot(epochs, loss, color='blue', label='train_loss')
ax1.plot(epochs, val_loss, color='red', label='val_loss')
ax1.set_title('Train and Validation Loss')
ax1.set_xlabel('Epochs')
ax1.set_ylabel('Loss')
ax1.grid()
ax1.legend()
mae = history_dict['mae']
val_mae = history_dict['val_mae']
ax2 = fig.add_subplot(1, 2, 2)
ax2.plot(epochs, mae, color='blue', label='train_mae')
ax2.plot(epochs, val_mae, color='red', label='val_mae')
ax2.set_title('Train and Validation MAE')
ax2.set_xlabel('Epochs')
ax2.set_ylabel('MAE')
ax2.grid()
ax2.legend()
plt.show()