인공지능/Deep Learning

[Deep Learning] DNN TensorFlow Regression 수치 예측 문제 모델링

건휘맨 2024. 4. 17. 17:53

모델링 전 데이터 전처리부터 한다.

 

1. 데이터 확인

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 데이터 통계 확인
>>> df.describe()

# nan값 확인
>>> df.isna().sum()

# 학습을 위해 X,y값 지정
>>> X = df.loc[ : ,  '컬럼' : '컬럼' ]
>>> y = df['컬럼']

 

2. 피처 스케일링

from sklearn.preprocessing import MinMaxScaler

# X값 피처스케일링
>>> scaler_X = MinMaxScaler()
>>> X = scaler_X.fit_transform(X.values)

# y값 피처스케일링
>>> scaler_y = MinMaxScaler()

# y는 2차원 데이터가 아닌 1차원 데이터이기 때문에 에러 발생
# 시리즈는 reshape가 없기 때문에 또 에러 발생
# y.values를 입력해 1차원 넘파이로 바꿔서 reshape
>>> y.values.reshape(500, 1)
# >>> y.values.reshape(-1, 1)
# >>> y = scaler_y.fit_transform(y.to_frame())
# 다 같은 결과이다.

# reshape한 결과를 scaler_y에 입혀 새로운 변수로 저장해 사용
>>> y_scaled = scaler_y.fit_transform( y.values.reshape(500, 1) )

 

3. 트레이닝셋과 테스트셋으로 분리

from sklearn.model_selection import train_test_split

>>> X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=50)

 

4. 딥러닝을 이용한 모델링

import tensorflow.keras
from keras.models import Sequential
from keras.layers import Dense
from sklearn.preprocessing import MinMaxScaler

>>> def build_model():
      model = Sequential()
      model.add(Dense(10, 'relu', input_shape=(X_train.shape[1],)))
      model.add(Dense(10, 'relu'))
      model.add(Dense(5, 'relu'))
      model.add(Dense(1, 'linear')) # 수치 예측은 linear
      # 옵티마이저는 'adam', 로스펑션은 'mean_squared_error'로 셋팅하여 컴파일
      model.compile(optimizer='adam', loss='mse', metrics=['mse', 'mae'])
      return model
      
>>> model = build_model()

>>> model.summary()
Model: "sequential_1"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense_4 (Dense)             (None, 10)                60        
                                                                 
 dense_5 (Dense)             (None, 10)                110       
                                                                 
 dense_6 (Dense)             (None, 5)                 55        
                                                                 
 dense_7 (Dense)             (None, 1)                 6         
                                                                 
=================================================================
Total params: 231 (924.00 Byte)
Trainable params: 231 (924.00 Byte)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________

 

5. 학습, 평가 (Evaluating)

# 학습
>>> model.fit(X_train, y_train, batch_size= 10, epochs= 20)

# 평가
>>> model.evaluate(X_test, y_test)

>>> y_pred = model.predict(X_test)
>>> ((y_test - y_pred)**2).mean()

# 실제값과 예측값을 plot 으로 나타내기
>>> df_test = pd.DataFrame(y_test, columns=['y_test'])
>>> df_test['y_pred'] = y_pred

>>> df_test.plot()
>>> plt.show()

 

실제 예측 해보기

# 고객은 여자이고, 나이는 38, 연봉은 90000, 카드빚은 2000, 순자산은 500000
# 어느 정도의 차량을 구매할 수 있을지 예측하시오.

>>> new_data = [{'Gender':0, 'Age':38, 'Annual Salary':90000, 'Credit Card Debt':2000, 'Net Worth':50000}]

>>> new_data = pd.DataFrame(new_data)

# 피처 스케일링
>>> new_data = scaler_X.transform(new_data)

>>> y_pred = model.predict(new_data)
array([[0.31696528]], dtype=float32)

# 예측값을 기존값으로 반환
>>> scaler_y.inverse_transform(y_pred)
array([[31504.535]], dtype=float32)