개발/머신러닝

파이썬 머신러닝 - 텐서플로우를 이용한 regression 문제 모델링

웅'jk 2022. 12. 28. 11:29

지난번에는 아웃레이어의 엑티베이션 함수에 시그모이드를 이용하였습니다. 

 

이번에는 텐서플로우를 이용한 ANN 의 마지막 아웃레이어를 리니어로 모델링하여 리그레션 문제를 모델링해보겠습니다.

 

1. 데이터 파일을 가져옵니다.

import pandas as pd
df = pd.read_csv('Car_Purchasing_Data.csv', encoding='ISO-8859-1')

 

2. 데이터를 분석하여 X,y축을 설정합니다.

# 데이터의 NaN확인
df.isna().sum()

# 데이터의 컬럼 확인
df.columns

# X축 설정
X = df.loc[:,'Gender':'Net Worth']

# y축 설정
y = df['Car Purchase Amount']

 

3. 설정한 데이터를 보고 문자열이 있으면 인코딩을 진행하지만 지금 제 파일에서는 없기때문에 피처스케일링을 진행합니다.

from sklearn.preprocessing import MinMaxScaler

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

# y축도 할 필요가 있어서 새로 해줍니다.
scaler_y = MinMaxScaler()

# y축이 현재 1차원이기에 스케일링을 2차원으로 진행합니다.
scaler_y.fit_transform(y.values.reshape(500,1))
y_scaled = scaler_y.fit_transform(y.values.reshape(500,1))

 

4. train/test 로 나눕니다.

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)

 

5. 모델을 만듭니다.

import tensorflow.keras
from keras.models import Sequential
from keras.layers import Dense
from keras.engine import input_layer

# 모델링의 구성을 만드는 함수
def build_model() :
  model = Sequential()
  # hidden layer
  model.add(Dense(units= 5 , activation= 'relu' , input_shape = (5,) ))
  model.add(Dense(units = 25, activation ='relu'))
  model.add(Dense(units=10,activation = 'relu'))
  
  # output layer 

  # linear 는 수치를 그대로 표현해달라는 뜻입니다.
  model.add(Dense(units=1 , activation = 'linear'))

  # compile
  model.compile(optimizer = 'adam' , loss = 'mse' , metrics = ['mse' , 'mae'])

  return model

# 빈 모델링 생성
model = build_model()

 

6. 학습을 시작합니다.

model.fit(X_train,y_train,batch_size = 10 , epochs= 20)

 

7. 학습한 결과를 평가합니다.

model.evaluate(X_test,y_test)

 

8. 이제 만든 인공지능에 새로운 데이터를 넣어 값을 확인합니다.

# 새로운 데이터 생성
new_data = np.array( [ 0 , 38 , 90000 , 2000 , 500000 ])

# 새로운 데이터의 모양 확인
new_data.shape

# 새로운 데이터의 모양을 재지정
new_data = new_data.reshape(1,5)

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

# 예측하기
model.predict(new_data)

# 예측한 결과를 스케일링 전의 값으로 되돌리기
new_data_pred = model.predict(new_data)
scaler_y.inverse_transform(new_data_pred)