부동산 가격 예측 데이터 분석
- 아이오와주 에임스 지역에서 2006년부터 2010년까지 거래된 실제 부동산 판매 기록을 보고 집의 가격 예측
- 빠진 부분, 범위에서 너무 벗어난 부분, 가격과는 관계 없는 정보 포함
1. 환경 및 데이터 준비
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
# 데이터를 불러 옴
df = pd.read_csv("./data/house_train.csv")
2. 데이터 파악
# 데이터를 미리 살펴 봄
df
# 데이터가 어떤 유형으로 이루어져 있는지 알아봄
df.dtypes
3. 결측치 처리
- isnull()
: 결측치가 있는지 알아보는 함수
: pandas에 존재
# 속성별로 결측치가 몇 개인지 확인
df.isnull().sum().sort_values(ascending=False).head(20)
- 원 - 핫 인코딩(카테고리형 변수 처리)
# 카테고리형 변수를 0과 1로 이루어진 변수로 바꿈
df = pd.get_dummies(df)
- fillna()
: 결측치를 채워 주는 함수
: 괄호 안에 들어간 값으로 결측치 채워줌
: pandas에 존재
# 결측치를 전체 칼럼의 평균으로 대체하여 채움
df = df.fillna(df.mean())
# 업데이트된 데이터프레임을 출력
df
4. 속성별 관련도 추출
- 집 값과 관련도가 가장 큰 10개의 속성 파악
# 데이터 사이의 상관 관계 저장
df_corr=df.corr()
# 집 값과 관련이 큰 것부터 순서대로 저장
df_corr_sort=df_corr.sort_values('SalePrice', ascending=False)
# 집 값과 관련도가 가장 큰 10개의 속성들 출력
df_corr_sort['SalePrice'].head(10)
- 상관도 그래프로 파악
# 집 값과 관련도가 가장 높은 속성들을 추출해서 상관도 그래프를 그려봄
cols=['SalePrice','OverallQual','GrLivArea','GarageCars','GarageArea','TotalBsmtSF']
sns.pairplot(df[cols])
plt.show();
5. 부동산 가격 예측 모델
1. 학습셋과 테스트셋 지정
# 집 값을 제외한 나머지 열 저장
cols_train=['OverallQual','GrLivArea','GarageCars','GarageArea','TotalBsmtSF']
X_train_pre = df[cols_train]
# 집 값 저장
y = df['SalePrice'].values
# 전체의 80%를 학습셋으로, 20%를 테스트셋으로 지정
X_train, X_test, y_train, y_test = train_test_split(X_train_pre, y, test_size=0.2)
2. 모델 실행
- loss : 선형 회귀이므로 평균 제곱 오차(mean_squared_error) 사용
# 모델의 구조 설정
model = Sequential()
model.add(Dense(10, input_dim=X_train.shape[1], activation='relu'))
model.add(Dense(30, activation='relu'))
model.add(Dense(40, activation='relu'))
model.add(Dense(1))
model.summary()
# 모델 실행
model.compile(optimizer ='adam', loss = 'mean_squared_error')
3. 학습 자동 중단
# 20회 이상 결과가 향상되지 않으면 자동으로 중단되게끔 함
early_stopping_callback = EarlyStopping(monitor='val_loss', patience=20)
# 모델의 이름 결정
modelpath="./data/model/Ch15-house.hdf5"
# 최적화 모델을 업데이트하고 저장
checkpointer = ModelCheckpoint(filepath=modelpath, monitor='val_loss', verbose=0, save_best_only=True)
# 전체의 20%를 검증셋으로 설정
history = model.fit(X_train, y_train, validation_split=0.25, epochs=2000, batch_size=32, callbacks=[early_stopping_callback, checkpointer])
4. 결과 시각화
# 예측 값과 실제 값, 실행 번호가 들어갈 빈 리스트를 만듦
real_prices =[]
pred_prices = []
X_num = []
# 25개의 샘플을 뽑아 실제 값, 예측 값을 출력
n_iter = 0
Y_prediction = model.predict(X_test).flatten()
for i in range(25):
real = y_test[i]
prediction = Y_prediction[i]
print("실제가격: {:.2f}, 예상가격: {:.2f}".format(real, prediction))
real_prices.append(real)
pred_prices.append(prediction)
n_iter = n_iter + 1
X_num.append(n_iter)
# 그래프를 통해 샘플로 뽑은 25개의 값을 비교
plt.plot(X_num, pred_prices, label='predicted price')
plt.plot(X_num, real_prices, label='real price')
plt.legend()
plt.show()
'모두의 딥러닝 개정 3판'의 내용과 https://github.com/taehojo/deeplearning의 코드 참고
'AI > 모두의 딥러닝' 카테고리의 다른 글
[모두의 딥러닝] 21. 컨볼루션 신경망(CNN), 풀링(Pooling), 드롭아웃(drop out), 플래튼(flatten) - MNIST 데이터 (0) | 2023.06.02 |
---|---|
[모두의 딥러닝] 20. 이미지 인식, 데이터 전처리 - MNIST 데이터 (2) | 2023.05.29 |
[모두의 딥러닝] 18. 에포크(epochs), 과적합 그래프, 학습 자동 중단 - 와인 품질 예측 데이터 (0) | 2023.05.29 |
[모두의 딥러닝] 17. k겹 교차 검증(k-fold cross validation) - 초음파 광물 예측 데이터 (2) | 2023.05.26 |
[모두의 딥러닝] 16. 과적합(overfitting), 테스트셋 구분, 모델 저장과 재사용 - 초음파 광물 예측 데이터 (0) | 2023.05.26 |