이전에 학습했던 모델은 Input 되는 Node의 수가 2개인 모델이었다. Input Node의 수를 3개 이상으로 하는 방법도 크게 다르지 않다. 이번 포스트에서는 Output Node의 수를 2개로 해보도록 하겠다.
학습 목표
- 연속형 데이터를 이용하여 Input Node가 3개이고, Output Node가 2개인 데이터를 컴퓨터가 맞추도록 해보자.
- 패턴:
$$h(x)=\begin{cases}y_1=0.3x_1+0.2x_2-0.4x_3+0.1x_4+2 \\ y_2=0.5x_1-0.1x_2+0.3x_3+0x_4-2\end{cases}$$
구현해보자.
1. 데이터셋 생성
# import mudule
import pandas as pd
import numpy as np
from tensorflow import keras
from tensorflow.keras.layers import Dense
# Dataset 생성
def f1(x1, x2, x3, x4):
return 0.3*x1 + 0.2*x2 - 0.4*x3 + 0.1*x4 + 2
def f2(x1, x2, x3, x4):
return 0.5*x1 - 0.1*x2 + 0.3*x3 - 2
def make_dataset(start_N, end_N):
x1 = np.arange(start_N, end_N)
x2 = x1 + 1
x3 = x1 + 2
x4 = x1 + 3
y1 = f1(x1, x2, x3, x4)
y2 = f2(x1, x2, x3, x4)
append_for_shuffle = np.c_[x1, x2, x3, x4, y1, y2]
np.random.shuffle(append_for_shuffle)
X = append_for_shuffle[:,[0,1,2,3]]
y = append_for_shuffle[:,[4,5]]
return X, y
X, y = make_dataset(0, 1000)
X_train, X_test = X[:800], X[800:]
y_train, y_test = y[:800], y[800:]
- 생성된 Dataset을 보자.
>>> X_train
array([[491., 492., 493., 494.],
[ 47., 48., 49., 50.],
[755., 756., 757., 758.],
...,
[445., 446., 447., 448.],
[429., 430., 431., 432.],
[881., 882., 883., 884.]])
>>> y_train
array([[ 99.9, 342.2],
[ 11.1, 31.4],
[152.7, 527. ],
...,
[ 90.7, 310. ],
[ 87.5, 298.8],
[177.9, 615.2]])
2. 모델 생성 및 학습
# 모델 생성 및 Compile 실시
model = keras.Sequential()
model.add(Dense(128, activation = "relu"))
model.add(Dense(64, activation = "relu"))
model.add(Dense(32, activation = "relu"))
model.add(Dense(16, activation = "relu"))
model.add(Dense(2, activation = "linear"))
opt = keras.optimizers.Adam(learning_rate=0.005)
model.compile(optimizer = opt, loss = "mse")
# 표준화
min_key = np.min(X_train)
max_key = np.max(X_train)
X_std_train = (X_train - min_key)/(max_key - min_key)
y_std_train = (y_train - min_key)/(max_key - min_key)
X_std_test = (X_test - min_key)/(max_key - min_key)
>>> model.fit(X_std_train, y_std_train, epochs = 100)
Epoch 1/100
25/25 [==============================] - 1s 1ms/step - loss: 0.0181
Epoch 2/100
25/25 [==============================] - 0s 1ms/step - loss: 1.9474e-04
Epoch 3/100
25/25 [==============================] - 0s 1ms/step - loss: 2.2225e-05
Epoch 4/100
25/25 [==============================] - 0s 1ms/step - loss: 3.8012e-06
Epoch 5/100
25/25 [==============================] - 0s 1ms/step - loss: 7.8100e-07
Epoch 6/100
25/25 [==============================] - 0s 1ms/step - loss: 3.6994e-07
...
Epoch 96/100
25/25 [==============================] - 0s 1ms/step - loss: 1.1601e-07
Epoch 97/100
25/25 [==============================] - 0s 1ms/step - loss: 1.8677e-07
Epoch 98/100
25/25 [==============================] - 0s 956us/step - loss: 3.6037e-07
Epoch 99/100
25/25 [==============================] - 0s 878us/step - loss: 3.3609e-07
Epoch 100/100
25/25 [==============================] - 0s 873us/step - loss: 1.9744e-07
<tensorflow.python.keras.callbacks.History at 0x1d068dd0670>
>>> def MAE(x, y):
>>> return np.mean(np.abs(x - y))
>>> pred = model.predict(X_std_test) * (max_key - min_key) + min_key
>>> print("Accuracy:", MAE(pred, y_test))
Accuracy: 0.1379637644290885
- 정확도(Accuracy)는 0.137로 만족스러울 정도는 아니지만 그리 나쁘진 않게 나왔다.
- 정확도는 평균 절댓값 오차(MAE)로 구하였으므로, RMSE보다 실제 편차에 더 가깝다고 할 수 있다.
- 실제 데이터의 생김새를 보자.
DF = pd.DataFrame(pred, columns=["y1_pred", "y2_pred"])
DF[["y1_label", "y2_label"]] = y_test
DF["y1_gap"] = DF["y1_label"]-DF["y1_pred"]
DF["y2_gap"] = DF["y2_label"]-DF["y2_pred"]
DF[["y1_pred", "y1_label", "y1_gap", "y2_pred", "y2_label", "y2_gap"]]
- 만족스러운 수준은 아니지만, 실제 데이터와 예측 데이터가 꽤 유사하게 나왔다.
지금까지 가볍게 연속형 데이터를 이용해서 숨겨진 패턴을 찾아보았다. 다음 포스트에서는 머신러닝을 할 때, 가장 처음 사용하게 되는 실제 데이터인 타이타닉 데이터를 이용해서 생존 여부를 분류해보도록 하겠다.
'Machine Learning > TensorFlow' 카테고리의 다른 글
Tensorflow-2.1. 타이타닉 데이터 설명 (0) | 2021.02.09 |
---|---|
Tensorflow-2.0. 캐글(Kaggle)과 타이타닉 데이터 (0) | 2021.02.09 |
Tensorflow-1.5. 기초(6)-기초 모델 만들기(1)-변수 2개인 경우 (0) | 2021.02.08 |
Tensorflow-1.4. 기초(5)-하이퍼 파라미터 튜닝 (0) | 2021.02.08 |
Tensorflow-1.3. 기초(4)-특성 스케일 조정 (0) | 2021.02.08 |