데이터 분포가 직선 형태인 선형관계일 때 사이킷런의 선형회귀 모형인 LinearRegression 클래스는 매우 정확한 예측력을 갖습니다. (이전 포스팅 참조)

 

만약에, 데이터 분포가 복잡하여 이런 선형관계를 인식하지 못한 상태에서도 머신러닝 또는 딥러닝 학습을 통해 선형관계라는 것을 찾아낼 수 있을까요?  

우리가 머신러닝 또는 딥러닝 알고리즘을 데이터 분석에 기반한 예측에 활용하는 이유가 여기에 있습니다. 데이터 갯수가 많거나 분포가 복잡할 수록 인간의 인지능력으로 어떤 패턴을 인식하는 것은 어렵습니다. 하지만, 머신러닝 또는 딥러닝 알고리즘을 잘 활용하면, 복잡하거나 잘 드러나지 않는 패턴을 찾을 수가 있습니다. 

앞의 예제에서 사용한 데이터셋을 가지고, 딥러닝 알고리즘을 적용해보겠습니다. 

텐서플로우(케라스) 불러오기

 

구글 코랩은 텐서플로우(tensorflow) 2.0을 지원하기 때문에, 따로 설치하지 않아도 사용할 수 있습니다. 케라스(kears)도 통합되어 지원됩니다. 다음과 같이 케라스 모듈을 불러옵니다.

>>> from tensorflow import keras
>>> from tensorflow.keras.layers import Dense

 

딥러닝 모델 객체 정의하기

 

Sequential 클래스 함수를 사용하여 신경망 객체를 생성합니다. 여러 층의 레이어를 순차적으로 연결하는 형태의 심층신경망(DNN)을 구성할 때 사용합니다. 완전연결층 Dense 레이어를 add 명령을 사용하여 추가합니다. units=1 인자는 목표변수(타겟 레이블)의 출력 데이터가 1가지 종류라는 뜻입니다. 회귀 문제는 하나의 단일 값을 예측하기 때문에 1로 지정합니다. input_shape=(1,) 옵션은 입력 데이터인 설명변수(x 변수)의 데이터 구조를 지정합니다. 여기서는 1개의 열, 즉 입력 변수인 x가 1개라는 뜻입니다.

 

compile 명령을 사용하여, 옵티마이저 함수와 로스 함수를 정의합니다. 로스 함수는 예측값의 오차를 측정하는 기준이 되고, 옵티마이저 함수는 오차를 줄이는데 사용하는 최적화 알고리즘입니다. 자세한 설명은 나중에 다루기로 하고 일단 넘어가겠습니다.

 

최종적으로, 1개의 레이어를 갖는 간단한 신경망 모델이 완성되었습니다.

>>> dnn = keras.Sequential()
>>> dnn.add(Dense(units=1, input_shape=(1,)))
>>> dnn.compile(optimizer='sgd', loss='mse')

 

summary 명령을 사용하여 인공신경망의 구조를 출력해서 확인할 수 있습니다. 입력 변수인 x 변수가 1개이므로, x 변수의 계수와 상수항(일차함수식의 y=ax + b를 생각하자)까지 2개의 파라미터가 있습니다.

>>> dnn.summary()

Model: "sequential"
_________________________________________________________________
Layer (type)   Output Shape    Param #
=================================================================
dense (Dense)   (None, 1)        2
=================================================================
Total params: 2
Trainable params: 2
Non-trainable params: 0
_________________________________________________________________

 

주어진 데이터로 모델 학습시키기

 

학습을 위한 설명변수 데이터(x_new)와 목표값인 타겟 레이블 데이터(y)를 신경망 모델에 주입하고 학습을 진행합니다. fit 메소드를 사용하는 점은 앞에서 다룬 사이킷런 모델과 같습니다.

 

학습 과정을 통해서 목표값과 예측값의 오차가 가장 작은 함수 관계식을 찾습니다. 2개의 파라미터 값을 조금씩 변화를 주면서 최적화된 해를 찾는 것입니다. epochs=10은 이와 같은 학습 과정을 10번 반복한다는 뜻입니다. 로스(loss)값이 점점 줄어드는 것을 볼 수 있습니다. 학습이 잘 되고 있다는 뜻입니다.

 

>>> dnn.fit(x_new, y, epochs=10)

Epoch 1/10
1/1 [==============================] - 0s 2ms/step - loss: 122.3979
Epoch 2/10
1/1 [==============================] - 0s 878us/step - loss: 14.1135
Epoch 3/10
1/1 [==============================] - 0s 2ms/step - loss: 2.3010
Epoch 4/10
1/1 [==============================] - 0s 1ms/step - loss: 0.9857
Epoch 5/10
1/1 [==============================] - 0s 1ms/step - loss: 0.8137
Epoch 6/10
1/1 [==============================] - 0s 1ms/step - loss: 0.7672
Epoch 7/10
1/1 [==============================] - 0s 2ms/step - loss: 0.7355
Epoch 8/10
1/1 [==============================] - 0s 2ms/step - loss: 0.7064
Epoch 9/10
1/1 [==============================] - 0s 1ms/step - loss: 0.6787
Epoch 10/10
1/1 [==============================] - 0s 1ms/step - loss: 0.6520
<tensorflow.python.keras.callbacks.History at 0x7f237c5d90b8>

 

새로운 x 데이터에 대한 y값 예측하기

 

x_test 변수에 저장되어 있는 데이터를 모델에 주입합니다. predict 메소드를 사용합니다. x 변수 값을 입력받아서 y값을 예측하게 됩니다. 예측값을 변수 y_hat_dnn에 저장합니다. 결과값은 21, 23, 25, 27, 29이고, 앞에서 다룬 사이킷런 LinearRegression 모델의 예측결과와 일치합니다.

 

>>> y_hat_dnn = dnn.predict(x_test)
>>> y_hat_dnn

array([21., 23., 25., 27., 29.])

+ Recent posts