[모두의 딥러닝] 15. 원 - 핫 인코딩, 소프트맥스(softmax) - 아이리스(iris) 품종 데이터(다중 분류)

아이리스(iris) 품종 데이터

- 아이리스 꽃잎의 모양과 길이에 따라 세 가지 품종으로 나눈 데이터

- 여러 개의 답 중 하나를 고르는 다중 분류 사용

 

 

 

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

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

 

 

 

2. 상관도 그래프 - 시본(seaborn) 라이브러리 활용

  • pairplot()

: 데이터프레임에 있는 모든 수치형 변수들 간의 관계를 시각화

: 각 변수 쌍에 대해 산점도(scatter plot)와 히스토그램(histogram)을 함께 그려줌

: seaborn에 존재

- hue : 주어진 데이터 중 어떤 카테고리를 중심으로 그릴지 결정하는 옵션

sns.pairplot(df, hue='species');
plt.show()

 

 

 

3. 원 - 핫 인코딩

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

- 각 범주를 이진 형태의 벡터로 표현하여 해당 범주에 해당하는 인덱스만 1이고 나머지는 모두 0인 형태로 변환

# 속성을 X, 클래스를 y로 저장
X = df.iloc[:,0:4]
y = df.iloc[:,4]

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

y 값이 문자로 되어 있음. 딥러닝을 하려면 문자를 숫자로 바꿔야 함

 

  • get_dummies()

: 각 범주에 해당하는 열을 생성하고, 해당 범주에 해당하는 행에는 1을, 나머지 행에는 0을 할당

: 범주형 변수를 원 - 핫 인코딩할 때 사용

: pandas에 존재

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

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

 

 

 

4. 소프트맥스(softmax)

- 입력된 값들을 다중 분류 문제에서 각 클래스에 속할 확률로 변환하는 활성화 함수

- 각 항목당 예측 확률을 0과 1 사이의 값으로 나타내줌

- 각 샘플당 예측 확률의 총합이 1인 형태로 바꾸어줌

 

 

- 모델 설정

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

: 다항 분류에서 사용하는 손실 함수

 

 

- 모델 실행

history=model.fit(X, y, epochs=30, batch_size=5)

 

 

 

'모두의 딥러닝 개정 3판'의 내용과 https://github.com/taehojo/deeplearning의 코드 참고