기록하기

[모두의 딥러닝] 다중 분류 문제 해결하기 본문

AI 수업

[모두의 딥러닝] 다중 분류 문제 해결하기

_parkdaxun 2023. 4. 17. 09:41

Iris 시각화하기

 

lrist를 시각화 하는 방법은 대표적으로 산점도가 있습니다. 산점도는 x축과 y축에 각각 변수를 놓고 데이터를 점으로 나타내는 그래프입니다. 이를 통해 두 변수 간의 관계를 시각적으로 파악할 수 있습니다. 

 

또한, Iris 데이터셋에서는 품종이 3가지이므로 산점도를 그릴 때 각 품종마다 다른 색깔을 지정하여 구분해주는 것이 좋습니다. 이를 통해 각 품종의 특성을 비교하고 분류를 쉽게 할 수 있습니다.

 

또한, 다른 시각화 방법으로는 박스 플롯(Box Plot)이 있습니다. 이는 데이터의 분포를 상자와 선으로 나타내는 그래프로, 품종별로 변수의 분포를 비교할 때 유용합니다.

 

원핫인코딩

 

원핫인코딩(One-Hot Encoding)은 범주형(categorical) 데이터를 숫자형 데이터로 변환하는 방법 중 하나입니다. 이 방법은 해당 데이터의 카테고리 값 중 하나만 1로 나타내고 나머지는 모두 0으로 표현합니다.

 

예를 들어, 색상을 빨강(red), 파랑(blue), 녹색(green)으로 구분하는 경우, 각각의 색상에 대해 다음과 같이 원핫인코딩을 적용할 수 있습니다.

 

빨강 : 100

파랑 : 010

녹색 : 001

 

이처럼 원핫인코딩은 카테고리 값의 개수만큼 0과 1로 이루어진 벡터로 변환하는 것입니다. 이 방법은 범주형 데이터를 다룰 때 유용하게 사용됩니다. 예를 들어, 머신러닝 알고리즘에서 범주형 데이터를 다루는 경우, 원핫인코딩을 통해 데이터를 수치형으로 변환하고 모델링할 수 있습니다.

 

소프트맥스

모델을 만들어줍니다. 다음 코드를 보면서 이전에 실행혔던 피마 인디언의 당뇨병 예측과 무엇이 달라졌는지 찾아보기 바랍니다.

# 모델 설정
model = Sequential()
midel.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로 바뀌었습니다.

- 컴파일 부분에서 손실 함수 부분이 caterogrical_crossentropy로 바뀌었습니다.

 

출력이 0~1 중 하나의 값으로 나왔습니다. 예를 들어 당뇨인지 아닌지에 대한 예측 값이 시그모이드 함수를 거치며 0~1 사이의 값 중 하나로 변환되어 0.5 이상이면 당뇨로, 이하이면 정상으로 판단했습니다. 이항 분류의 경우 출력 값이 하나면 되었습니다. 그런데 이번 예제에서는 예측해야 할 값이 세 가지로 늘어났습니다. 각 샘플마다 이것이 setosa일 확률, versicolor일 확률, 그리고 virginica일 확률을 따로 구해야 한다는 것 입니다. 

 

아이리스 품종 예측의 실행(소스코드)

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 = 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=50, batch_size=5)

 

 

결과