Theory/Deep Learning

05 다중 분류 문제 해결하기 실습

Orangetasteboy 2023. 7. 3. 00:15

다중 분류

참(1)과 거짓(0)으로 해결하는 것이 아니라, 여러 개 중에 어떤 것이 답인지 예측하는 문제

 

 

아이리스 품종 예측 실습

colab에서 실습

 

[상관도 그래프]

import pandas as pd

# 깃허브에 준비된 데이터를 가져옵니다.
!git clone https://github.com/taehojo/data.git   

# 아이리스 데이터를 불러옵니다.
df = pd.read_csv('./data/iris3.csv')

df.head() # 첫 다섯 줄을 봅니다.

import seaborn as sns
import matplotlib.pyplot as plt

# seaborn 라이브러리의 pairplot() 함수를 써서 전체 상관도를 볼 수 있는 그래프 출력
# 품종에 따라 보여지게 지정
sns.pairplot(df, hue='species');
plt.show()

상관도 그래프 출력

각 속성별 데이터 분포와 속성 간의 관계를 한눈에 볼 수 있음.

pairplot() 함수 설정 중 hue 옵션은 주어진 데이터 중 어떤 카테고리를 중심으로 그래프를 그릴지 정해줌.

 

[원-핫 인코딩 (one-hot encoding)]

케라스를 이용해 아이리스의 품종 에측

# 불러온 데이터 프레임을 x와 y로 나눔.
X = df.iloc[:,0:4]
y = df.iloc[:,4]

# x와 y의 첫 다섯 줄 출력
print(X[0:5])
print(y[0:5])

데이터 안에 문자열이 포함되어 있음.

저장한 y의 값이 숫자가 아닌 문자인데, 계산을 위해 문자를 숫자형으로 변환

 

꽃의 종류에 맞게 각각의 이름으로 열을 만들어주고 이름이 일치하면 1, 일치하지 않으면 0으로 변경

 

원-핫 인코딩 : 여러 개의 값으로 된 문자열을 0과 1로만 이루어진 형태로 만들어주는 과정

판다스가 제공하는 get_dummies() 함수를 사용하여 수행

 

# 원-핫 인코딩 처리를 합니다.
y = pd.get_dummies(y)

# 원-핫 인코딩 결과를 확인합니다.
print(y[0:5])

 

[소프트맥스]

모델 생성

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

# 모델 설정
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'])

출력층의 노드 수 = 3

활성화 함수 = softmax

손실 함수 = categorical_crossentropy

 

예측해야 할 값은 3가지

각 샘플마다 setosa일 확률, versicolor일 확률, virginica일 확률을 따로 구해야 함.

따라서 시그모이드 함수가 아닌 소프트맥스 함수 사용

 

소프트맥스 함수는 각 항목당 예측 확률을 0과 1사이의 값으로 표시

각 샘플당 예측 확률의 총합 = 1

 

다항 분류이므로 binary_crossentropy가 아닌 categorical_crossentropy 사용

 

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

model.summary()를 사용하여 2개의 은닉층에 각각 12개와 8개의 노드 생성

출력은 3개, 30번 반복하여 정확도는 97.33%