개발학습일지

[AI] 딥러닝 ANN 수치 예측 TensorFlow Regression 문제 모델링 본문

AI/Deep Learning

[AI] 딥러닝 ANN 수치 예측 TensorFlow Regression 문제 모델링

처카푸 2024. 4. 17. 22:49

딥러닝 텐서플로우 리그레션(수치예측) 문제 모델링

 

모델링 하기 전 데이터 전처리는 필수이다!

 

1. 데이터 확인 후 X, y 값 지정하기

# 기본 데이터 통계치 확인
df.describe()

# nan값 확인
df.isna().sum()
# nan 값 있으면 제거
df.dropna()

# 학습을 위해 X,y값 지정 (X값은 예측에 필요한 컬럼, y는 예측할 값)
X = df.loc[ : ,  '컬럼' : '컬럼' ]
y = df['컬럼']

 

2. 피처스케일링 _데이터 정규화하기

- y 값을 정규화 할 경우 에러 주의 해야한다

- 기본적으로 1개의 컬럼으로 y 값을 지정했을 경우 y는 1차원 데이터 시리즈로 되어있다

  그래서 y를 피처스케일링 해주기 위해선 y.values.reshape( , )을 해줘야 한다 

  _ y.values => 판다스에는 reshape함수가 없어서 넘파이로 만들어서 reshape을 쓰는 것이다

from sklearn.preprocessing import MinMaxScaler

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

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

# 이런식으로 코드를 작성하면 y는 2차원 데이터가 아닌 1차원 데이터이기 때문에 에러 발생
y = scaler_y.fit_transform(y.values)

# 그래서 reshape 하는 코드를 작성하면 시리즈는 reshape가 없기 때문에 또 에러 발생
y.reshape(500, 1) 
# (행, 열)

# y.values를 입력해 1차원 넘파이로 바꿔서 reshape 해야한다
y.values.reshape(500, 1)

# reshape한 결과를 scaler_y에 입혀 새로운 변수로 저장해 사용
y = 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

# 모델링 함수 생성
def bulid_model() :
  model = Sequential()
  model.add(Dense(10, 'relu', input_shape=(X_train.shape[1],)))
  # input_shape= X_train 의 컬럼 수 이기 때문에 코드로 입력하여 적을 수 있다
  model.add(Dense(10, 'relu'))
  model.add(Dense(5, 'relu'))
  model.add(Dense(1, 'linear'))
  # 수치 예측 문제이기 때문에 linear 함수를 사용한다
  model.compile( optimizer='adam', loss='mse', metrics=['mse', 'mae'] )
  return model
  
# 변수에 저장해 사용
model = bulid_model()

 

5. 학습, 평가 _fit, evaluate

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

# 평가
model.evaluate(X_test, y_test)

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

 

6. 예측값 plot으로 나타내기

# 실제값과 예측값을 plot 으로 나타내기
plt.plot(y_test)
plt.plot(y_pred)
plt.show()

 

7. 새로운 데이터로 실제 예측해보기

- 새로운 데이터 판다스 데이터프레임 또는 넘파이로 만들어 준다

- 학습시켜둔 scaler 와 인공지능 (model) 을 사용하여 예측한다

첫번째 고객은 여자이고, 나이는 38, 연봉은 90000, 카드빚은 2000, 순자산은 500000

new_data = [{ 'Gender':0, 'Age':38, 'Annual Salary':90000, 'Credit Card Debt':2000, 'Net Worth':500000 }]
df_new_data = pd.DataFrame(new_data)

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

# 예측값 변수 저장
y_pred = model.predict(new_data)

# 예측값을 기존값으로 반환 : scaler_y 가 알아서 변환을 해뒀기 때문에 원상복구가 필요하다
scaler_y.inverse_transform(y_pred)