마지막으로 신경망(Neural Network) 알고리즘의 기본 방법인 Multi-Layer Perceptron 으로 예측을 진행해보자.

 

뉴럴네트워크란 인간 두뇌의 뉴런 구조를 모방하여 데이터를 학습하고 데이터에 내제되어 있는 관계, 함수 등을 추론하여 모델을 만드는 기계학습 알고리즘이다. 데이터 간의 상관관계가 복잡하고, 기존에 알려진 수학적 물리적 함수로 예측하기에 어려운 경우에 내제된 관계를 해석하는데 강점이 있다.

복잡한 데이터를 다루는 영상처리, 음성인식 등에서는 필수적으로 사용되는 방식으로 간단히 이해하고 넘어가자.

신경망 알고리즘 도식화

위 그림에서 Hidden(은닉층)과 Output 모두 layer 라고 부르며, 여러개의 은닉층을 구성할수도 있고 해당 latent value 의 개수도 여러개로 구성할 수 있다. 또한 각 화살표는 activation 함수로 생각하면 되는데 relu, softmax, sigmoid 등 분석하는 목적과 최종 예측하고자 하는 값의 종류에 따라 정하면 된다.

 

이전 포스팅과 마찬가지로 동일한 boston 집값 예측 예제를 적용해 보았다.

from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow import keras
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import warnings
warnings.filterwarnings('ignore')

# boston 집값 dataset 불러오기
train = pd.read_csv('train.csv')

# 수치형데이터 취합
train_data = train[['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE',
                    'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV']]

# 주어진 데이터에서 input 데이터와 output(추정하는 값) 으로 구분
X = np.array(train_data.iloc[:, 0:13])
y = np.array(train_data.iloc[:, 13])

# 주어진 데이터에서 train set 과 test set 으로 데이터를 구분
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 뉴럴네트워크 모델 생성 (신경망)
model = Sequential()
model.add(Dense(128, input_dim=13, activation='relu'))
model.add(Dense(128, activation='relu'))
model.add(Dense(1, activation='linear'))

# compile model
model.compile(
    optimizer=keras.optimizers.Adam(learning_rate=1e-3),
    loss=keras.losses.MeanSquaredError(),
    metrics=[keras.metrics.RootMeanSquaredError(), keras.metrics.MeanAbsoluteError()]
)

# train 데이터 훈련
model.fit(X_train, y_train, epochs=300, batch_size=30, validation_data=(X_test, y_test), verbose=0)

# 예측값 도출
y_pred = model.predict(X_test)

# R-squared value 계산
y_test_1d = np.squeeze(y_test)
y_pred_1d = np.squeeze(y_pred)
r_squared = r2_score(y_test_1d, y_pred_1d)

# 실측치와 예측치에 대한 scatter plot
plt.figure(figsize=(5,4)) 
plt.scatter(y_test_1d, y_pred_1d)

# 추세선 및 r-squared value 표시
z = np.polyfit(y_test_1d, y_pred_1d, 1)
p = np.poly1d(z)
plt.plot(y_test_1d, p(y_test_1d), "r--")
plt.text(20, 62, "R-squared = {:.3f}".format(r_squared))

# label 붙이기
plt.xlabel("Actual MEDV values")
plt.ylabel("Predicted MEDV values")
plt.title("Predicted MEDV values by Neural Network")
plt.grid(True)
plt.show()

# 모델 성능 평가
mse = mean_squared_error(y_test_1d, y_pred_1d)
mae = mean_absolute_error(y_test_1d, y_pred_1d)
r2 = r2_score(y_test_1d, y_pred_1d)

print("Mean Squared Error: {:.2f}".format(mse))
print("Mean Absolute Error: {:.2f}".format(mae))
print("R-squared Score: {:.2f}".format(r2))

r-squared value 0.83 수준으로 예측 성능이 우수한 것으로 확인되었다.

신경망 모델의 각 layer 의 units 의 크기, layer 의 수 및 model 학습의 batch 사이즈와 횟수 등에 따라 결과는 달라지고

많이 학습할수록, layer 가 많을수록 성능을 올라가나 과적합되는 경우도 있으니 많은 공부가 필요한 부분이라 생각된다.

BELATED ARTICLES

more