05 다중 분류 문제 해결하기 실습
다중 분류
참(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%