AI/DeepLearning

회귀 모델 정리 - 함수형 모델

soccerda 2020. 7. 11. 00:44
반응형

1:1모델

데이터 입력과 출력은 Sequential과 동일하다.

#1. 데이터
# 1~7까지 데이터를 훈련시키고 8~10 데이터로 평가, 훈련이 잘되었나 11~13 예측
import numpy as np
x_train = np.array([1,2,3,4,5,6,7])
y_train = np.array([1,2,3,4,5,6,7])

x_test = np.array([8,9,10])
y_test = np.array([8,9,10])

x_predict = np.array([11,12,13])

#2. 모델 구성
from keras.models import Model
from keras.layers import Dense, Input


input1 = Input(shape=(1,))
dense1 = Dense(100, activation='relu')(input1)
dense2 = Dense(30)(dense1)
dense3 = Dense(5)(dense2)
output1 = Dense(1)(dense3)

model = Model(inputs = input1, outputs= output1)

#3. 훈련
model.compile(loss='mse', optimizer='adam', metrics=['mse'])
model.fit(x_train, y_train, epochs=100, batch_size=1)
# loss는 mse로 구성하여 최저의 손실 값을 구하고 이를 구하기 위한 optimizer는 adam을 사용한다.
# 훈련 내용을 보여주기 위해 metrics는 mse를 사용
# x_train과 t_train을 총 100번 훈련시키고, batch_size 1개씩 잘라 사용한다. default batch_size는 16

#4. 평가 예측
lose, mse = model.evaluate(x_test, y_test, batch_size=1)
print("mse : ", mse)

y_predict = model.predict(x_predict)
print("예측값 : \n", y_predict)

# x_test 와 y_test로 평가하고, x_predict 11,12,13으로 예측값을 확인한다.

결과값

('mse : ', 9.654983301743414e-08) ('\xec\x98\x88\xec\xb8\xa1\xea\xb0\x92 : \n', array([[10.999571], [11.999509], [12.999448]], dtype=float32))

 

Sequential 모델은 위에서 먼저 model=Sequential()로 선언하지만, 함수형 모델은 마지막에 model=Model(inputs, outpus)로 선언하는 차이가 있다.

 

첫 번째 히든 레이어는 100개, 두 번째는 30개, 세 번째는 5개, 최종 아웃풋 레이어는 1개로 레이어와 노드를 구성한다.

 

훈련할 때 loss는 mse로 구성하여 최저의 손실 값을 구하고, 이를 구하기 위한 optimizer는 adam을 사용한다. 훈련 내용을 보여주기 위해 metrics는 mse를 사용하며 x_train과 y_train을 총 100번 훈련시키고, batch_size는 1개씩 잘라 사용한다.  

 

다:다

#1. 데이터
# 1~7까지 데이터를 훈련시키고 8~10 데이터로 평가, 훈련이 잘되었나 11~13 예측
import numpy as np
x_train = np.array([[1,2,3,4,5,6,7], [11,12,13,14,15,16,17]])
y_train = np.array([[1,2,3,4,5,6,7], [11,12,13,14,15,16,17]])

x_test = np.array([[8,9,10], [18,19,20]])
y_test = np.array([[8,9,10], [18,19,20]])

x_predict = np.array([[21,22,23], [31,32,33]])
print(x_train.shape)
print(x_test.shape)
print(x_predict.shape)

x_train = np.transpose(x_train)
y_train = np.transpose(y_train)
x_test = np.transpose(x_test)
y_test = np.transpose(y_test)
x_predict = np.transpose(x_predict)

print(x_train.shape)
print(x_test.shape)
print(x_predict.shape)

#2. 모델 구성
from keras.models import Model
from keras.layers import Dense, Input


input1 = Input(shape=(2,))
dense1 = Dense(100, activation='relu')(input1)
dense2 = Dense(30)(dense1)
dense3 = Dense(5)(dense2)
output1 = Dense(2)(dense3)

model = Model(inputs = input1, outputs= output1)

#3. 훈련
model.compile(loss='mse', optimizer='adam', metrics=['mse'])
model.fit(x_train, y_train, epochs=100, batch_size=1)
# loss는 mse로 구성하여 최저의 손실 값을 구하고 이를 구하기 위한 optimizer는 adam을 사용한다.
# 훈련 내용을 보여주기 위해 metrics는 mse를 사용
# x_train과 t_train을 총 100번 훈련시키고, batch_size 1개씩 잘라 사용한다. default batch_size는 16

#4. 평가 예측
lose, mse = model.evaluate(x_test, y_test, batch_size=1)
print("mse : ", mse)

y_predict = model.predict(x_predict)
print("예측값 : \n", y_predict)


('mse : ', 0.15481813251972198) ('\xec\x98\x88\xec\xb8\xa1\xea\xb0\x92 : \n', array([[17.33848 , 31.649454], [18.075365, 32.68336 ], [18.812252, 33.717266]], dtype=float32))

 

인풋 칼럼이 2개이므로 input_shape=(2,)가 된다. 함수형 모델에서는 input_dim을 사용하지 않는다.

아웃풋 컬럼 역시 2개이므로 최종 레이어를 2로 구성한다.

 

훈련 및 예측 코드는 1:1과 동일하다.

 

결과 값은 mse가 0.15 정도로 괜찮게 나온 편이나, 예측한 값이 오차가 크다. 레이어와 노드의 개수를 조절하여 정확도를 높여야 된다.

 

 

다:1

#1. 데이터
import numpy as np
x_train = np.array([[1,2,3,4,5,6,7,], [11,12,13,14,15,16,17]])
y_train = np.array([1,2,3,4,5,6,7,])

x_test = np.array([[8,9,10], [18,19,20]])
y_test = np.array([8,9,10])

x_predict = np.array([[21,22,23], [31,32,33]])

print(x_train.shape)
print(y_train.shape)
print(x_test.shape)
print(y_test.shape)
print(x_predict.shape)

x_train = np.transpose(x_train)
x_test = np.transpose(x_test)
x_predict = np.transpose(x_predict)

print('x_train.shap : ', x_train.shape)
print('y_train.shap : ', y_train.shape)
print('x_test.shap : ', x_test.shape)
print('y_test.shap : ', y_test.shape)
print('x_predict.shap : ', x_predict.shape)

#2. 모델 구성
from keras.models import Model
from keras.layers import Dense, Input


input1 = Input(shape=(2,))
dense1 = Dense(100, activation='relu')(input1)
dense2 = Dense(30)(dense1)
dense3 = Dense(5)(dense2)
output1 = Dense(1)(dense3)

model = Model(inputs = input1, outputs= output1)

#3. 훈련
model.compile(loss='mse', optimizer='adam', metrics=['mse'])
model.fit(x_train, y_train, epochs=100, batch_size=1)

#4. 평가 예측
lose, mse = model.evaluate(x_test, y_test, batch_size=1)
print("mse : ", mse)

y_predict = model.predict(x_predict)
print("예측값 : \n", y_predict)


('mse : ', 0.12049577385187149) ('\xec\x98\x88\xec\xb8\xa1\xea\xb0\x92 : \n', array([[19.077766], [19.992508], [20.90725 ]], dtype=float32))

 

예측결과는 우리가 생각하는 값(21,22,23)과는 거리가 멀다. 그러나 사실 선형 회귀모델을 그릴 때 입력된 2개의 x값의 범위 자체가 다르기 때문에 어쩌면 나쁘지 않을 수도 있다. 레어이와 노드의 개수를 조절해서 예측값을 조금 더 올리자!

 

1:다

#1. 데이터
import numpy as np
x_train = np.array([1,2,3,4,5,6,7,])
y_train = np.array([[1,2,3,4,5,6,7,], [11,12,13,14,15,16,17,]])

x_test = np.array([8,9,10])
y_test = np.array([[8,9,10], [18,19,20]])


x_predict = np.array([11,12,13])

print('x_train.shap : ', x_train.shape)
print('y_train.shap : ', y_train.shape)
print('x_test.shap : ', x_test.shape)
print('y_test.shap : ', y_test.shape)
print('x_predict.shap : ', x_predict.shape)

y_train = np.transpose(y_train)
y_test = np.transpose(y_test)

print('x_train.shap : ', x_train.shape)
print('y_train.shap : ', y_train.shape)
print('x_test.shap : ', x_test.shape)
print('y_test.shap : ', y_test.shape)
print('x_predict.shap : ', x_predict.shape)

#2. 모델 구성
from keras.models import Model
from keras.layers import Dense, Input


input1 = Input(shape=(1,))
dense1 = Dense(100, activation='relu')(input1)
dense2 = Dense(30)(dense1)
dense3 = Dense(5)(dense2)
output1 = Dense(2)(dense3)

model = Model(inputs = input1, outputs= output1)

#3. 훈련
model.compile(loss='mse', optimizer='adam', metrics=['mse'])
model.fit(x_train, y_train, epochs=100, batch_size=1)

#4. 평가 예측
lose, mse = model.evaluate(x_test, y_test, batch_size=1)
print("mse : ", mse)

y_predict = model.predict(x_predict)
print("예측값 : \n", y_predict)


('mse : ', 6.1819305419921875) ('\xec\x98\x88\xec\xb8\xa1\xea\xb0\x92 : \n', array([[ 8.178242 , 25.047277 ], [ 8.761525 , 26.65223 ], [ 9.3448105, 28.257185 ]], dtype=float32))

 

예측값은 범위를 좀 많이 벗어났다. 하이퍼파라미터 튜닝을 좀 더 해서 mse를 더 낮추고 예측값을 올리는 작업이 필요하다.

 

반응형