Data_study/Deep Learning

[Deep_learning] Binary Classifiers 구현

onsemiro 2022. 2. 23. 22:58

Binary는 두 유형, 두 조각, 두 부분을 의미하여, Binary Classifiers는 두 유형으로 분류하는 모델이다.

예를 들어 강아지 또는 고양이, 흰색또는 검은색과 같은 것들을 분류할 때 사용한다.

그러면, 눈치 챘을 것이다. Binary Classifiers는 sigmoid 를 사용하겠구나...!

이 모델로 보통 입력데이터가 강아지인지 아닌지, 또는 고양이인지 아닌지 분류할 때 사용된다.

이미지 인식의 기초라고 생각할 수도 있겠다.

자 그럼 Binary Classification에 사용되는 알고리즘인 Logistic Regression을 구현해보자.

 

Logistic Regression Models

 

회귀를 사용하여 데이터가 어떤 범주에 속할 확률을 0에서 1사이의 값으로 예측하고 그 확률에 따라 가능성이 더 높은 범주에 속하는 것으로 분류해주는 지도학습 알고리즘이다.

 

데이터가 어떤 범주에 속할 확률로 출력되게 하기 위해서는 logit값이 아닌 probability값이 나와야한다는 뜻이다.

logit의 식을 probability로 변형한 식은 sigmoid로 우리는 이론에서 배웠다.

 

그러므로 우리는 이 logistic regression 을 구현할때는, Activation Function에 sigmoid를 넣어 layers를 구성하면 된다.

이번에 구현되는 코딩은 매우 간단하다.

 

 

그럼 과연 데이터를 입력하였을때, 출력값이 확률값의 형태를 가지고 있는지 확인하기 위해 matplotlib.pyplot 패키지를 활용하여, 그래프로 그려보자.

 

import matplotlib.pyplot as plt

import tensorflow as tf
from tensorflow.keras.layers import Dense

layer를 구성할 것이므로, tensorflow.keras.layers도 불러왔다.

 

 

Single-variate Logistic Regression Models

 

plt.style.use('seaborn')

X = tf.random.normal(shape=(100,1))
dense = Dense(units=1,activation = "sigmoid")

Y = dense(X)
print(Y.shape)

그래프의 스타일을 선택해주고,

 

X의 값은 100,1 형태로 정규하게 랜덤으로 추출하였다.  열을 1로 둔 이유는 2차원의 그래프에 그려야 하기 때문이다.

그후, Dense에 activation은 sigmoid로 두고 여기서도 units=1값으로 둔 이유는 2차원의 그래프에 그려야 하기 때문이다.

 

Dense에서 나온 Y값이 추출될 것이다. Y의 형태도 100, 1로 동일 함은 충분히 유추할 수 있다.

 

 

이제 마지막, 그래프를 그려보자.

fig,ax = plt.subplots(figsize=(7,7))
ax.scatter(X,Y)

그래프 그림의 크기는 7,7로 적당히 뒀고,

scatter 매소드를 통해, X와 Y값을 그래프에 그려 넣었다.

 

ax.scatter(X,Y)

 

Y의 값이 0과 1사이에 있는 확률형태의 값들로 구성되어 있음을 알 수 있다.

 

 

Multi-variate Logistic Regression Models

 

 

만약 데이터의 다양한 특성값들이 있다면 X의 형태는 (100, n)이 될 것이다.

 

X = tf.random.normal(shape=(100,5))
dense = Dense(units=1,activation = "sigmoid") #sigmoid는 출력이 각 입력의 확률로 출력이 되는 activation 이다. units=1인 이유는 single-variate logistic regression model이기 때문.

Y = dense(X)
print(Y.shape)

n값을 5로 두고 입력데이터 X의 형태를 (100,5)로 두고 Dense에 넣으면, Y의 형태는 (100,1)로 나올 것이다.

 

이유는 Dense의 units값이 1이기 때문에 neuron이 하나라는 뜻이기 때문에 출력의 열 개수는 1로 바꾼다.

 

 

Binary Classifier with Dense Layers

 

 

이제 Dense Layers에서 Binary Classification을 구현해보자.

 

우선 필요한 패키지를 불러온다.

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

 

 

입력데이터 X값을 형성해주고

Dense Layers를 겹겹이 쌓아준다.

그후, X값을 model에 넣어 Y값을 만들어준다.

X = tf.random.normal(shape=(100,5))

model = Sequential()
model.add(Dense(units = 10, activation ="relu"))
model.add(Dense(units =5, activation ="relu"))
model.add(Dense(units =1, activation ="sigmoid"))

Y= model(X)
print(Y.shape)
print(Y.numpy())

 

마지막 layer에는 sigmoid를 activation function으로 지정함으로써, 출력값이 확률형태의 값으로 나오도록 하였다.

 

그렇게 Y의 형태를 확인해보면, (100,1)임을 알 수 있다.

즉, input(100,5)에서 neuron(5,10) ~> neuron(10,5) ~> neuron(5,1)을 순차적으로 연산되어 나온 형태다.

 

 

마무리

이번 구현을 통해서도 다시한번 느꼈다. 분석은 머신러닝에 매우 적은 부분임을.... 좋은 데이터가 필요하고 좋은 데이터로 만들어야한다. 전처리도 그만큼 중요하다... 머신러닝은 멋있어보이지만, 노가다중에 노가다인 거같다.. 빨리 이런 지식들을 습득하여, 프로젝트에 이행하고 싶다. 이렇게 배운 것은 아직 나의 지식이 아님을 알기에 하루라도 빨리 배운 것들을 프로젝트에 활용해 보고 싶다.

반응형