4장 12장 다중 분류 문제 해결하기

김영기·2024년 1월 6일
0

1. 다중 분류 문제

클래스가 2개가 아닌 3개, 참 거짓이 아닌 여러 개 중에 어떤 것이 답인지

다중 분류 여러 개의 답 중 하나를 고르는 문제

2. 상관도 그래프

import pandas as pd
#깃허브에 준비된 데이터를 가져옴.
!git clone https://github.com/taehojo/data.git
#아이리스 데이터를 불러옴.
df = pd.read_csv('./data/iris3.csv')
df.head() # 첫 다섯 줄을 확인

그리고 시본 라이브러리에 있는 pirplot()함수를 써서 전체 상관도

import seaborn as sns
import matplotlib.pyplot as plt
sns.pairplot(df, hue='species');
plt.show()

속성별 데이터 분포와 속성 간의 관계를 한 눈에
pairplot() 함수 설정 중 hue 옵션은 어떤 카테고리를 중심으로 그래프를 그릴지 정해준다. 우리는 품종에 따라 지정

그래프 가로축, 세로 축은 서로 다른 속성 이러한 속성에 따라 품종이 어떻게 분포되는지 알 수 있음.
가운데 대각선 위치한 그림은 가로축, 세로축이 같으므로 해당 속성에 따라
각 품종들이 어떻게 분포하는지 보여줌.

3. 원-핫 인코딩

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

데이터 프레임을 X, Y로 나눔.

y의 값이 숫자가 아닌 문자
딥러닝에서는 계산을 위해 문자를 모두 숫자형으로 바꿔줘야 한다.

원-핫 인코딩
이렇게 여러 개의 값으로 된 문자열을 0과 1로만 이루어진 형태로 만듦.

판다스가 제공하는 get_dummies()함수를 사용하면 간단함.

y = pd.get_dummies(y)

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

4.소프트맥스

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

이 예제에서는 예측해야 할 값이 세 가지로 늘었음.
샘플마다 setosa, versicolor, virginica일 확률을 각각 구해야함.

activation란에 softmax로 적어 주는 것으로 소프트 맥스 함수 적용
categorical_crossentropy를 손실 함수에 쓰면 됨.

5. 아이리스 품종 예측의 실행

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, 클래스를 y로 저장.
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)

model.summary()를 사용해 두 개의 은닉층에 각각 12개, 8개 노드 생성
출력 Dense는 3개임을 확인 가능함.

결과는 96.0%

[^출처]: 모두의 딥러닝 개정 3판 (지은이: 조태호)

profile
안녕하세요

0개의 댓글