군침이 싹 도는 코딩

텐서플로우 리그레션 문제 모델링 하는 방법 본문

Python/Deep Learning

텐서플로우 리그레션 문제 모델링 하는 방법

mugoori 2022. 12. 28. 11:31

# 자동차 구매 고객 데이터를 통해서 자동차 구매금액을 예측하는 리그레션 문제를 모델링해보자

 

 

 

 

df.isna().sum()
>>> Customer Name          0
    Customer e-mail        0
    Country                0
    Gender                 0
    Age                    0
    Annual Salary          0
    Credit Card Debt       0
    Net Worth              0
    Car Purchase Amount    0
    dtype: int64

# 비어있는 데이터를 확인해준다

 

 

 

 

 

X = df.loc[:,'Gender':'Net Worth']
y = df['Car Purchase Amount']

# X,y 를 나눠준다

 

 

 

 

 

from sklearn.preprocessing import MinMaxScaler
scaler_X = MinMaxScaler()
X = scaler_X.fit_transform(X.values)

# 피쳐 스케일링을 해주는데 X,y 각각 스케일러를 만들어줘야한다

그 후 먼저 X부터 피쳐 스케일링한다

 

 

 

scaler_y = MinMaxScaler()
scaler_y.fit_transform(y.values)

# y를 피쳐 스케일링 하는 도중에 에러가 났다

이유는 y는 1차원 데이터인데 스케일러 안에는 2차원 데이터가 들어가야하기 때문이다

해당 에러를 디버깅하기 위해서는 reshape를 사용하여 2차원으로 만들어주면 된다

 

 

 

 

y.reshape(500,1)

# 리쉐이브를 이용해서 2차원으로 만들려고 했지만 에러가 났다

이유는 판다스 시리즈에는 리쉐이브라는 함수가 없기 때문이다

이것을 넘파이로 바꿔주어야한다

 

 

 

y.values.reshape(500,1)

# 문제 없이 정상 작동하였다 이제 이것을 피쳐 스케일링 해준다

 

 

 

 

 

y_scaled = scaler_y.fit_transform(y.values.reshape(500,1))

# 에러 없이 정상 작동하였다

 

 

 

 

from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y_scaled,test_size=0.25,random_state=50)

# 트레인 테스트 셋으로 분리한다

 

 

 

 

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

# 모델링에 필요한 라이브러리를 임포트 한다.

 

 

 

 

 

from keras.engine.sequential import input_layer
def build_model() :
  model = Sequential()
  model.add( Dense(units=5, activation='relu',input_shape=(5,)) )
  model.add( Dense(units=25,activation='relu'))
  model.add( Dense(units=10, activation='relu'))
  model.add( Dense(units=1, activation='linear')) # 가격 예측을 하기 위해서 아웃풋 레이어는 리니어로 세팅한다
  model.compile(optimizer='adam', loss='mse',metrics=['mse','mae'])
  return model

# 함수를 만들어서 모델링을 한다.

히든레이어는 렐루 유닛은 5, 25, 10개를 하였다

첫 히든레이어에는 인풋 쉐이브가 들어가야한다 파라미터로는 X의 열의 값

아웃풋 레이어의 유닛은 1개 액티비션은 가격을 예측하는 문제이므로 리니어를 사용한다

마지막으로 컴파일에는 옵티마이저에는 아담 로스펑션에는 mse(mean_squared_error)

검증(metrics)은 가격 예측은 mse(mean_squared_error)로 검증하기때문에 mse 로 해준다

 

 

 

 

model = build_model()
model.summary()
>>>
Model: "sequential_1"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense_4 (Dense)             (None, 5)                 30        
                                                                 
 dense_5 (Dense)             (None, 25)                150       
                                                                 
 dense_6 (Dense)             (None, 10)                260       
                                                                 
 dense_7 (Dense)             (None, 1)                 11        
                                                                 
=================================================================
Total params: 451
Trainable params: 451
Non-trainable params: 0
_________________________________________________________________

# 모델이라는 인공지능을 만들어서 서머리를 찍어본다

히든 레이어 3개와 아웃풋 레이어 1개가 정상적으로 잘 만들어졌다

 

 

 

 

 

model.fit(X_train,y_train,batch_size=10, epochs=20)
>>>
Epoch 1/20
38/38 [==============================] - 1s 3ms/step - loss: 0.2031 - mse: 0.2031 - mae: 0.4041
Epoch 2/20
38/38 [==============================] - 0s 3ms/step - loss: 0.0296 - mse: 0.0296 - mae: 0.1402
Epoch 3/20
38/38 [==============================] - 0s 3ms/step - loss: 0.0190 - mse: 0.0190 - mae: 0.1118
Epoch 4/20
38/38 [==============================] - 0s 3ms/step - loss: 0.0165 - mse: 0.0165 - mae: 0.1034
Epoch 5/20
38/38 [==============================] - 0s 3ms/step - loss: 0.0147 - mse: 0.0147 - mae: 0.0974
Epoch 6/20
38/38 [==============================] - 0s 3ms/step - loss: 0.0132 - mse: 0.0132 - mae: 0.0913
Epoch 7/20
38/38 [==============================] - 0s 3ms/step - loss: 0.0119 - mse: 0.0119 - mae: 0.0863
Epoch 8/20
38/38 [==============================] - 0s 3ms/step - loss: 0.0106 - mse: 0.0106 - mae: 0.0813
Epoch 9/20
38/38 [==============================] - 0s 3ms/step - loss: 0.0095 - mse: 0.0095 - mae: 0.0767
Epoch 10/20
38/38 [==============================] - 0s 3ms/step - loss: 0.0085 - mse: 0.0085 - mae: 0.0724
Epoch 11/20
38/38 [==============================] - 0s 3ms/step - loss: 0.0072 - mse: 0.0072 - mae: 0.0667
Epoch 12/20
38/38 [==============================] - 0s 3ms/step - loss: 0.0062 - mse: 0.0062 - mae: 0.0613
Epoch 13/20
38/38 [==============================] - 0s 3ms/step - loss: 0.0051 - mse: 0.0051 - mae: 0.0553
Epoch 14/20
38/38 [==============================] - 0s 3ms/step - loss: 0.0039 - mse: 0.0039 - mae: 0.0488
Epoch 15/20
38/38 [==============================] - 0s 2ms/step - loss: 0.0031 - mse: 0.0031 - mae: 0.0433
Epoch 16/20
38/38 [==============================] - 0s 3ms/step - loss: 0.0026 - mse: 0.0026 - mae: 0.0394
Epoch 17/20
38/38 [==============================] - 0s 3ms/step - loss: 0.0020 - mse: 0.0020 - mae: 0.0349
Epoch 18/20
38/38 [==============================] - 0s 2ms/step - loss: 0.0016 - mse: 0.0016 - mae: 0.0313
Epoch 19/20
38/38 [==============================] - 0s 3ms/step - loss: 0.0013 - mse: 0.0013 - mae: 0.0283
Epoch 20/20
38/38 [==============================] - 0s 3ms/step - loss: 0.0010 - mse: 0.0010 - mae: 0.0249
<keras.callbacks.History at 0x7f8bbda51d30>

# 이제 X_train과 y_train을 넣어 학습 시킨다.

배치 사이즈와 에폭스는 원하는대로 넣어도 된다.

 

 

 

 

model.evaluate(X_test,y_test)
>>>
4/4 [==============================] - 0s 4ms/step - loss: 0.0012 - mse: 0.0012 - mae: 0.0276    
[0.0012255063047632575, 0.0012255063047632575, 0.027560757473111153]

# evaluate라는 텐서플로우에서 제공하는 검증함수를 통해 검증한다