머신러닝의 분류도이다. 다시한번 복기해보자. 우리가 집중해서 봐야할 부분은 지도학습의 분류와 회귀이다. 이걸 기억하고 아래를 보자. 지난 글에서 사용한 예시 코드에서 생성한 모델은 분류모델일까 회귀모델일까?
import tensorflow as tf
import pandas as pd
파일경로 = ' '
데이터셋 = pd.read_csv(파일경로)
데이터셋.head()
독립 = 데이터셋[['독립변수1']]
종속 = 데이터셋[['종속변수2']]
print(독립.shape, 종속.shape)
X = tf.keras.layers.Input(shape=[1])
Y = tf.keras.layers.Dense(1)(X) ------------!
model = tf.keras.models.Model(X, Y)
model.compile(loss='mse') ------------!
model.fit(독립, 종속, epochs=10)
model.fit(독립, 종속, epochs=1000, verbose=0)
print(model.predict([[15]]))
일전에 분류는 예측할 값이 범주형 데이터일 때, 회귀는 양적 데이터일 때를 말한다고 하였다. 위 코드는 예상 결과가 30이고 회귀모델이라는 것을 이미 알고 있지만, 이 외에도 회귀 모델이라는 증거가 코드 속에 숨어 있다. 바로 코드라인 !인데, 아래의 분류모델과 비교해보고 차이점을 알아보자.
import tensorflow as tf
import pandas as pd
파일경로 = ' '
데이터셋 = pd.read_csv(파일경로)
데이터셋.head()
인코딩 = pd.get_dummies(데이터셋) ----------------(1)
인코딩.head()
print(인코딩.columns)
독립 = 인코딩[['독립변수1', '독립변수2', '독립변수3', '독립변수4']]
종속 = 인코딩[['종속변수1', '종속변수2', '종속변수3']]
print(독립.shape, 종속.shape)
X = tf.keras.layers.Input(shape=[4])
Y = tf.keras.layers.Dense(3, activation='softmax')(X) --------------(2)
model = tf.keras.models.Model(X, Y)
model.compile(loss='categorical_crossentropy', ---------------(3)
metrics='accuracy')
model.fit(독립, 종속, epochs=100)
print(model.predict(독립[:5]))
print(종속[:5])
print(model.get_weights()) -------------(4)
코드라인 (1)을 보면 get_dummies()라는 생소한 함수가 보일 것이다. 이 더미함수를 이용해서 하는 것이 one hot - encoding인데, 이는 범주형 데이터를 수식에 사용할 수 있게 해준다. 문자를 포함하는 범주형 데이터는 곧바로 수식에 사용하기에 곤란하기 때문이다. 인코딩이 올바르게 되었는지 head()를 이용해서 확인해주고, 간략히 보고싶다면 columns만 출력해서 보는 방법도 있다. 예를 들어 데이터셋이 다음과 같다고 가정해보자.
나이 | 키 | 몸무게 | 비만도 |
22 | 172 | 63 | 정상 |
23 | 160 | 59 | 과체중 |
20 | 166 | 52 | 정상 |
21 | 163 | 71 | 비만 |
이를 인코딩한 후 결과는 다음과 같을 것이다.
나이 | 키 | 몸무게 | 정상 | 과체중 | 비만 |
22 | 172 | 63 | 1 | 0 | 0 |
23 | 160 | 59 | 0 | 1 | 0 |
20 | 166 | 52 | 1 | 0 | 0 |
21 | 163 | 71 | 0 | 0 | 1 |
코드라인 (2)를 보자. Dense에서 회귀모델 코드에는 없는 activation = 'softmax'가 추가되었다. activation은 활성화 함수를 말하며 회귀모델의 identity, 분류모델의 softmax, sigmoid 등 여러가지 종류가 있다. 이 중 sigmoid와 softmax는 0%~100% 까지 비율, 분류예측을 할 수 있게 해준다. 활성화 함수를 사용하면 모델의 수식에도 약간의 변화가 생긴다.
기본적인 수식의 형태는 y = f(Ax1 + Bx2 + ... + Nxn + b) 이다. 여기서 각 항의 계수 A, B .... N을 weight(가중치)라고 부르고 b는 bias(편향)이라고 부른다. 이 y라는 수식, 모델, 즉 모형은 perception이라고 부르며 딥러닝에서는 이를 하나의 뉴런으로 본다. 만일 도출되는 수식이 y1, y2라면 두개의 뉴런 신경망이 병행 실행되는 것이다.
위 코드에서 독립변수는 4개, 종속변수는 3개이고 활성화 함수 softmax를 사용했기 때문에 나올 수 있는 수식은 아래와 같다.
y1 = softmax(Ax1 + Bx2 + Cx3 + Dx4 + b)
y2 = softmax(Ax1 + Bx2 + Cx3 + Dx4 + b)
y3 = softmax(Ax1 + Bx2 + Cx3 + Dx4 + b)
같은 조건의 회귀모델의 수식은 아래와 같을 것이다.
y1 = Ax1 + Bx2 + Cx3 + Dx4 + b
y2 = Ax1 + Bx2 + Cx3 + Dx4 + b
y3 = Ax1 + Bx2 + Cx3 + Dx4 + b
분류에서 사용하는 softmax가 명시된 것은 확인이 되었는데, 회귀에서 사용한다는 identity가 보이지 않는다. 사실 보이지 않는 것이 아니라 수학에서도 그렇듯이 I의 의미는 생략가능한 자기 자신 y = x이다. 즉 보이지 않는다고 적용되지 않은 것이 아니다.
코드라인 (3)을 보자. 회귀모델에서 loss에 대입되는 값은 mse이고, 분류모델에서는 categorical_crossentropy를 대입한 다는 새로운 사실을 알게 되었다. 추가된 accuracy은 percentage를 이용하는 분류모델에서 사용할 수 있는 정보의 정확도로, 0부터 1사이의 소수가 출력된다. 실제로 모델을 fit해보면 아래와 같이 loss와 accuracy를 같이 확인할 수 있다.
loss가 0에 수렴하고 accuracy의 대부분이 0.9에 가깝기 때문에 이 모델을 이용한 예측은 거의 정답이 확률이 높다는 것을 미리 예측할 수 있다.
코드라인 (4)의 get_weights()는 perception의 weight와 bias를 출력해준다.
첫번째 사각형이 weight, 두번째 사각형이 bias이다.
csv파일을 넣어 실행한 전체 코드의 결과는 아래와 같다. (종속변수명은 가렸다)
종속변수 1, 2, 3에 대해서 모델이 예측한 결과가 1에 가장 가까운 것은 종속변수 1이다. 실제로 종속변수 1의 인고딩 값이 1이므로 올바른 모델이 생성되었다는 것을 알 수 있다.
회귀모델에 비해 알아야할 것도, 생각해볼 것도 많은 분류모델이다. 앞으로 배워야할 것들은 산더미겠지만 그리 싫지 않은 것은 재미있기 때문일까.
(이 글이 도움이 됐다면 광고 한번씩만 클릭 해주시면 감사드립니다, 더 좋은 정보글 작성하도록 노력하겠습니다 :) )
'간단 지식 > Deep Learning' 카테고리의 다른 글
05. 자연어 처리(NLP)에 필요한 라이브러리 및 패키지 설치 (0) | 2021.08.30 |
---|---|
04. Linear Regression - How to minimize cost? (0) | 2021.02.28 |
02. what is Deep Learning? (0) | 2020.10.23 |
01. what is Machine Learning? (0) | 2020.09.18 |