본문 바로가기
프로그래밍/인공지능

다중 분류(multi classification)

by austag 2023. 5. 31.

 

 

다중 분류(multi classification)란 여러 개의 답 중 하나를 고르는 분류 문제 입니다.  타겟이 가지는 값 데이터 모임을 클래스(class)라고 하고 클래스가 3개 이상일 경우 다중 분류라고 합니다. 이항 분류는 클래스가 참, 거짓이기 때문에 0과 1로 분류할 수 있었지만 다중 분류는 그렇지 않기 때문에 원-핫 인코딩(one-hot encoding)이라는 것을 거쳐야 합니다. 

 

원-핫 인코딩은 문자열로 표현된 클래스들을 0과 1로 이루어진 형태로 만드는 것입니다.

예를 들면 과학 과목에는 물리학, 화학, 생명과학, 지구과학인 4개의 클래스가 있고 문자로 표현된 값들을 원-핫 인코딩을 통해 바꿔주면 물리학=1000, 화학=0100, 생명과학=0010, 지구과학=0001 이 됩니다. 

 

다중 분류에서는 활성화 함수를 '소프트맥스 함수(softmax function)'를 사용하는 것이 효과적입니다. 각 항목당 예측 확률을 0과 1 사이의 값으로 나타내주는데, 각 샘플당 예측 확률의 총합이 1인 형태로 바꾸어 줍니다.

소프트맥스 함수는 분류될 클래스가 n개라 할 때, n차원의 벡터를 입력받아, 각 클래스에 속할 확률을 추정합니다.

그 식은 다음과 같습니다. 

$$ y_k = \frac{e^{a_k}}{\sum_{i=1}^{n}e^{a_i}} $$

($n$ = 출력층의 뉴런 수(총 클래스의 수), $k$ = $k$번째 클래스)

식을 단순하게 보면 "k번일 확률/전체 확률"의 형태라는 것을 볼 수 있습니다. 

이 함수는 시그모이드 함수로부터 유도되었기 때문에 e에 대한 지수함수를 사용하여 확률을 나타냅니다. 그래프의 형태를 보면 다음과 같습니다.  

마찬가지로 손실함수도 다항 분류에 맞게 categoricla_crossentrophy로 바꾸어주어야 합니다.

 

저는 다중 분류의 대표적인 예제인 아이리스 분류하기를 해보려 합니다.

 

먼저 데이터들을 분석해보도록 하겠습니다.

import pandas as pd

!git clone https://github.com/taehojo/data.git
df = pd.read_csv('./data/iris3.csv') # 데이터 불러오기

df.head() #첫 다섯줄을 보기

- 샘플 수: 150
- 속성 수: 4
1. 꽃받침 길이(sepal_length)
2. 꽃받침 너비(sepal_width)
3. 꽃잎 길이(petal_length)
4. 꽃잎 너비(petal_width)
-클래스: Iris-setosa, Iris-versicolor, Iris-virginica

데이터를 보면  1에서 4열까지는 속성, 5열은 클래스이고 클래스는 3개입니다.

이제 데이터의 전반적인 상관도를 확인해보도록 하겠습니다.

import seaborn as sns
import matplotlib.pyplot as plt

sns.pairplot(df, hue='species')#품종에 따라 그래프 보기
plt.scatter()

이렇게 속성에 따라 품종이 어떻게 분포하는지 한눈에 볼 수 있습니다.

 

아이리스 품종을 예측하는 코드를 짜보겠습니다.

간단한 순서도는 다음과 같습니다.

파이썬 코드는 다음과 같습니다.

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

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

!git clone https://github.com/taehojo/data.git
df = pd.read_csv('./data/iris3.csv')

X = df.iloc[:,0:4] #속성
y = df.iloc[:,4] #클래스

# 원-핫 인코딩 처
y = pd.get_dummies(y)

# 모델 설정
model = Sequential()
model.add(Dense(12,  input_dim=4, activation='relu'))
model.add(Dense(8,  activation='relu'))
model.add(Dense(3, activation='softmax'))
model.summary()

# 모델 컴파일
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

# 모델 실행
history=model.fit(X, y, epochs=30, batch_size=5)

마지막 줄의 epochs를 조절하면서 실행해볼 수 있습니다.

epoch=30일 때, loss와 정확도를 볼 수 있습니다. 


참고: [모두의 딥러닝], https://gooopy.tistory.com/53

 

'프로그래밍 > 인공지능' 카테고리의 다른 글

모델 성능 검증 - 과적합(overfitting)  (0) 2023.07.03
오차 역전파와 활성화 함수  (0) 2023.06.01
퍼셉트론(Perceptron)  (0) 2023.05.30
로지스틱 회귀  (0) 2023.05.17
경사하강법  (1) 2023.05.16