딥러닝 기초 #10 - 다중 분류

OilyHand·2024년 1월 11일
0

딥러닝 기초

목록 보기
10/17
post-thumbnail

1. 다중 분류 문제


1.1. 다중 분류 문제

입력에 따라 여러 출력으로 분류하는 문제를 다중 분류(multi classification)라고 합니다. 기존에 했던 참과 거짓을 다루는 것과 같은 이항 분류(binary classification)와는 다른 접근 방식이 필요합니다.

이번 실습에서는 아이리스 품종을 예측하는 실습을 진행할 예정입니다. 이번에 사용하는 데이터의 구조는 다음과 같습니다.

  • 샘플 수: 150

  • 속성 수: 4
    - 정보 1: 꽃받침 길이(spal length, 단위: cm)
    - 정보 2: 꽃받침 너비(sepal width, 단위: cm)
    - 정보 3: 꽃잎 길이(petal length, 단위: cm)
    - 정보 4: 꽃잎 너비(petal width, 단위: cm)

  • 클래스: Iris-setosa, Iris-versicolor, Iris-virginica

 

1.2. 상관도 그래프

Seaborn 라이브러리에 있는 pariplot() 함수를 이용하여 전체 상관도를 한번에 볼 수 있는 그래프를 출력할 수 있습니다.

  • 실행 코드

    sns.pairplot(df, hue='species');
    plt.show()
    • hue 옵션은 주어진 데이터 중 어떤 카테고리를 중심으로 그래프를 그릴지 정합니다. 여기서는 species에 따라 보여지게 지정한 것을 확인할 수 있습니다.
  • 실행 결과

    • 이 그래프를 이용하여 꽃잎과 꽃받침의 크기와 너비가 품종별로 어떤 차이가 있는지 더 쉽게 확인할 수 있습니다.

 

1.3. One-Hot 인코딩

One-hot 인코딩은 간단히 말해서 선택된 위치만 1로 표시하고 나머지는 0으로 표시하는 형태의 인코딩 방식입니다. Pandas에서는 다음과 같이get_dummies() 함수를 이용하여 one-hot 인코딩을 구현할 수 있습니다.

y = pd.get_dummies(y)

 

1.4. 소프트맥스

이항분류 문제에서는 클래스가 두 개이므로 출력값이 하나만 있어도 두 개의 확률을 표시하는 데 문제가 없었습니다. 하지만 다중분류 문제에서는 세 개 이상의 클래스에 대한 확률을 모두 구해야합니다. 따라서 다중분류 문제에서는 활성화 함수로 이전에 사용했던 시그모이드 함수가 아닌 여러 클래스에 대한 확률 결과를 얻어낼 수 있는 소프트맥스(softmax)라는 함수를 적용해야 합니다.

소프트맥스 함수

nn개의 클래스가 있다고 했을 때 ii번째 클래스의 확률을 구하는 소프트맥스 함수의 형태는 다음과 같습니다.

  softmax(xi)=exij=1nexj\text{softmax}(x_i) = \displaystyle\frac{e^{x_i}}{\sum_{j=1}^{n} e^{x_j}}

소프트맥스를 keras에서 적용하려면 activation 옵션에 'softmax'를 입력하면 됩니다. loss 옵션에는 'categorical_crossentropy'를 넣어줍니다. 예시 코드는 다음과 같습니다.

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'])

 

 


2. 예측 실행해보기


실행 코드

  1. 필요한 라이브러리 불러오기
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
  1. 데이터셋 불러오기
df = pd.read_csv('../data/iris3.csv')

X = df.iloc[:,0:4]
y = df.iloc[:,4]
  1. one-hot 인코딩 처리하기
y = pd.get_dummies(y)
  • one-hot 인코딩 결과
  1. 모델 구조 설정하기
model = Sequential()
model.add(Dense(12, input_dim=4, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(3, activation='softmax'))
  • 모델 구조 확인
  1. 모델 컴파일 및 실행하기
model.compile(loss='categorical_crossentropy', optimizer='adam', 
			  metrics=['accuracy'])
history = model.fit(X, y, epochs=50, batch_size=5)
  • 실행 결과

 

 


Reference
- 해당 글은 "모두의 딥러닝" 12장을 기반으로 작성되었습니다.

  1. 조태호. 모두의 딥러닝 (개정3판). 길벗(2022)
profile
Electrical Engineering

0개의 댓글