AI/DeepLearning

회귀 모델 정리 - 순차모델

soccerda 2020. 7. 7. 00:34
반응형

DNN Sequential 4가지 모델

1:1

#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 Sequential
from keras.layers import Dense
model = Sequential()

model.add(Dense(100, input_dim = 1, activation ='relu'))
model.add(Dense(30))
model.add(Dense(5))
model.add(Dense(1))
#Sequential 모델 사용 첫 번째 히든 레이어 100개, 두 번재 히든 30개  세 번째 히든 레이어 5개, 최종 아웃풋 레이어 1개

#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 : ', 4.2443084637133754e-12) ('\xec\x98\x88\xec\xb8\xa1\xea\xb0\x92 : \n', array([[11.000004], [12.000004], [13.000005]], dtype=float32))

mse가 소수 일곱 번째 자리까지 내려간걸 보니 상당히 학습이 잘 이루어졌음을 알 수 있다. 예측값 역시 11.00, 12,00, 13.00으로 거의 맞아떨어진다. 1:1 모델은 성공적이다.

 

다:다

입력과 출력이 2개 이상인 데이터를 사용하는 Sequential 모델

#1.  데이터
# 1~7까지의 데이터와 11~17까지의 데이터로 훈련 8,9,10 과 18,19,20 데이터로 평가 하고 21,22,23과 31, 32, 33이 잘 예측되는지 확인
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_train.shape)
print(x_predict.shape)

# (2, 7)
# (2, 7)
# (2, 3)

# 2개의 데이터셋들을 이용해서 모델에 잘 입력하기 위해서는 input_dim =2 또는 input_shape=(2,)가 되어 컬럼을 2개짜리로 입력해야한다.
# 하지만 컬럼 열이 2개가 아닌 행이 2개 행열을 바꾸기 위해서 numpy의 trainspose 함수를 이용

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)
# 컬럼이 2개짜리 데이터로 잘 변환되었다.
print(x_train.shape)
print(x_train.shape)
print(x_predict.shape)

# (7, 2)
# (7, 2)
# (3, 2)

#2. 모델 구성
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()

# 인풋 컬럼이 2갤 input_dim=2 이나 input_shape=(2,) 둘다 상관없다 , 아웃풋 컬럼 2개라 최종 레이어 2개
model.add(Dense(100, input_dim = 2, activation='relu'))
model.add(Dense(30))
model.add(Dense(5))
model.add(Dense(2))

#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.03415496647357941)

#('\xec\x98\x88\xec\xb8\xa1\xea\xb0\x92 : \n', array([[19.077208, 31.40331 ],

#       [19.926622, 32.4468  ],

#       [20.776033, 33.490284]], dtype=float32))

 

mse 0.03으로 괜찮게 나온 편이나, 예측한 값이 오차가 크다. x_pedict [21,31] ,[22,32], [23,33]을 입력했으나  [19.07, 31.40] , [19.92 , 32.44] , [20.77, 33,49]로 오차가 상당히 크다.

레이어와 노드의 개수를 조절하여 정확도를 높여야 한다.

 

 

다:1

여러 개의 컬럼이 입력되어 1개의 값이 출력되는 Sequential 모델로 가장 많이 나오는 모델이다.

#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 : ', x_train.shape)
print('y_train.shape : ', y_train.shape)
print('x_test.shape : ', x_test.shape)
print('y_test.shape : ', y_test.shape)
print('x_predict.shape : ', x_predict.shape)

# y값은 디멘션이 1개짜리로 정상이나, y값들은 행과 열을 바꿔주어야 한다.
print('-------------------------')
x_train = np.transpose(x_train)
x_test = np.transpose(x_test)
x_predict = np.transpose(x_predict)

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

# input_dim=2에 입력할 수 있는 정상ㅈ거인 shape로 변경됨
#2. 모델 구성
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()

# 인풋 컬럼이 2갤 input_dim=2 이나 input_shape=(2,) 둘다 상관없다 , 아웃풋 컬럼 1개라 최종 레이어 1개
model.add(Dense(100, input_dim = 2, activation='relu'))
model.add(Dense(30))
model.add(Dense(5))
model.add(Dense(1))

#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.01369617972522974) ('\xec\x98\x88\xec\xb8\xa1\xea\xb0\x92 : \n', array([[20.114677], [21.042673], [21.971512]], dtype=float32))

mse 0.01 좋은 편이나 예상하는 (21,22,23) 보다는 많이 부정확한 (20.1, 21.0, 21.9)이다.

사실 선형 회귀 모델을 그릴 때 입력된 2개의 x값의 범위 자체가 다르기 때문에 어쩌면 이 값은 나쁘지 않을 수도 있다.

레어어와 노드가 개수를 조절해서 예측값을 높여보자.

 

1:다

자주 나오는 모델은 아니다. 1개의 칼럼이 입력되어 2개 이상의 컬럼이 출력되는 모델 x는 디멘션이 1개, y는 디멘션이 2개가 되도록 데이터를 구성한다.

#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.shape : ', x_train.shape)
print('y_train.shape : ', y_train.shape)
print('x_test.shape : ', x_test.shape)
print('y_test.shape : ', y_test.shape)
print('x_predict.shape : ', x_predict.shape)

# y값은 디멘션이 1개짜리로 정상이나, x값들은 행과 열을 바꿔주어야 한다.
print('-------------------------')
y_train = np.transpose(y_train)
y_test = np.transpose(y_test)

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

#2. 모델 구성
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()

# 인풋 1, 아웃풋 2 input_dim=1, 최종 레이어의 노드수 2
model.add(Dense(100, input_dim = 1, activation='relu'))
model.add(Dense(30))
model.add(Dense(5))
model.add(Dense(2))

#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.1599583625793457) ('\xec\x98\x88\xec\xb8\xa1\xea\xb0\x92 : \n', array([[10.503354, 21.651703], [11.426165, 22.758963], [12.348972, 23.86622 ]], dtype=float32))

(10.5, 11.4, 12.3) , (21.6, 22.7,23.8)

 

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

반응형