Machine learning #1 - MLP

코딩/Machine learning|2022. 3. 3. 01:04

<생활코딩 머신러닝 with 파이썬 텐서플로(실습편)> 1독 후,

2독과 함께 내용을 정리해보고자 한다. 

 

1. Big picture

인공지능 > 기계학습 > 딥러닝

 

 

이런 지도학습의 도구로는

여러 알고리즘들이 있는데 - Decision Tree, Random forest, KNN, SVM 그리고 Neural Network Deep learing

이런 알고리즘들을 제공하는 library로는 - Caffe2, theano, PyTorch, 그리고 Tensorflow

 

이 책에서 다루는 모든 Tensor flow를 이용한 학습은 다음의 네 단계로 이루어진다. 

#1. 데이터 준비

#2. 모델 형성

#3. 모델 학습

#4. 모델 이용

2. 가장 기본, Multilayer Perceptron - 연속변수(회귀)

ex) 보스턴 집값 예측 모델

 

 

#1. 데이터 준비

기존 데이터의 경우 (506, 14)의 2차원 데이터이다. (Table이므로)

MLP의 경우 2차원 데이터를 그대로 사용할 수 있으므로, 독립변수와 종속변수의 분리만 해준다. 

이때 습관적으로 꼭 data shape을 확인하자. 

 

#2. 모델 형성

Hidden layer 없이 1개의 Input layer와 1개의 Dense layer로 이루어진 모델을 만든다. 

이 때 독립변수는 13개이므로 Input layer의 shape=[13]

Dense layer의 종속변수는 1로 둔다. 

compile 시 loss는 현재 연속변수를 다루므로 'mse' = Mean squared error를 사용한다. 

 

#3. 모델 학습 - fit method를 이용한다. 

#4. 모델 적용 및 수식 확인

 

3. Multilayer Perceptron - 이산변수(분류)

ex) 붓꽃의 분류 모델

#1. 데이터 준비

4개의 독립변수(column)와 1개의 종속변수(이산형)로 이뤄진 2차원 Table

이때 이산형 변수의 경우 One hot encoding이 필요하다. -> 분류가 n개일 경우 n개의 column을 추가하여 1 or 0으로 표기, 즉 종속변수가 n개로 늘어난다. 

 

이 때 One hot encoding은 pd.get_dummies(data) 한 줄로 끝낼 수 있다. 

 

data shape을 확인해보면

raw data는 (150, 5)의 2차원 table이었는데, one hot encoding 후 (150, 7)로 늘어났고 변수 분리 이후에는

독립변수는 (150, 4), 종속변수는 (150,3)의 shape을 갖는다. 

 

마찬가지로 MLN이므로 변수의 shape에는 이상이 없다. 바로 사용 가능하다. 

 

#2. 모델 형성

Input layer shape은 독립변수가 4개이므로 [4]

Dense layer는 종속변수가 3개이므로 3

 

이때 회귀 모델과의 차이점 3가지!!!

1) 활성화 함수

위의 경우와 같은 단순 연속변수 -> 연속변수에서는 mse를 통해 loss를 계산할 수 있었으나, 즉 실제값과 얼마나 차이 나는지를 계산하여 loss를 표시했으나

분류의 문제와 같은 경우에는 이런 것이 불가능하다. 

즉 모델이 분류를 예측할 때 확률값으로 예측해야 한다. (이 데이터를 바탕으로 생각했을 때 얘는 A일 확률이 90%, B일 확률이 10%입니다.)

이렇게 결과를 확률값으로 만들어주는 도구를 활성화 함수라고 한다. 

 

즉 기존 y = w1x1 + w2x2 + b라는 weight과 bias로 이뤄진 모델에서의 종속변수 y는 -무한대~무한대 값을 가지는데

이를 softmax와 같은 함수로 감싸주면 0~1 사이의 값을 갖도록 보정해준다고 이해하자. 

활성화 함수에는 다음과 같은 종류가 있다. 

정확한 것은 추후에 공부해보자

 

2) loss = 'crossentropy'

마찬가지로 mse로 loss의 측정이 불가능하다. 이를 이산변수에서 대체해주는 기능이라고 생각하자. 

 

3) metrics = 'accuracy'

compile 부분에 이러한 값을 넣으면 예측의 정확도를 결과에서 함께 보여준다. 

 

#3. 모델 학습

#4. 모델 이용

다른 것 없음

 

4. Hidden layer

정확히 왜 Hidden layer가 학습의 효율을 향상하는지 이 책에서 알기는 어려웠다. 

단, Hidden Dense layer의 사용 시에는 활성화 함수로 'swish'를 사용하는 것이 성능이 좋고, 이 외에 'relu'라는 유명한 함수도 있다는 것을 기억하고 넘어가자. 

 

5. 데이터 세팅 팁

1) 분류 문제에서 범주형 데이터가 숫자인 경우 (0, 1, 2로 분류되어 있는 경우)

data.dtypes 메서드를 이용하여 데이터형을 확인한다. 

-> pd.get_dummies는 object나 category 타입만 범주형으로 인식하여 one hot encoding을 시행하기 때문에

int 등인 경우 type을 바꿔줘야 한다. astype method를 이용하여

data['품종'] = data['품종'].astype('category') 이후에 get_dummies를 이용

 

2) NA값 체크

값이 비어있는 경우를 확인한다. 

data.isna().sum() -> 비어있는 데이터가 있는 column을 확인하여 fillna() method를 이용해 채워주는데 보통 평균값을 이용한다. 

mean = data['NA가 있는 column'].mean()

data['NA가 있는 column'].fillna(mean)

 

6. 모델 형성 시의 팁

BatchNormalization의 이용

Hidden layer을 사용할 때 BatchNormalization을 추가해주면 학습 속도 및 결과가 향상된다. 

 

H = tf.keras.layers.Dense(8, activation='swish')(H)를

다음과 같이 변형한다. 

 

H = tf.keras.layers.Dense(8)(X)

H = tf.keras.layers.BatchNormalization()(H)

tf.keras.layers.Activation('swish')(H)

 

7. 추후 추가로 공부할 것

1) 학습이 실제로 어떻게 이루어지는가? => Gradient checking

2) activation function의 기능은 어떠한가?

3) BatchNormalization의 의미는 무엇인가?

댓글()