04.17.23

정동겸·2023년 4월 17일

다중 분류 문제 - 아이리스 품종 예측

1. 아이리스 상관도 그래프

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')

# 그래프로 확인해 봅시다.
sns.pairplot(df, hue='species');
plt.show()

상관도 그래프를 통해 각 속성별 데이터 분포와 속성 간의 관계를 한눈에 볼 수 있다.
pairplot의 hue 옵션은 주어진 데이터 중 어떤 카테고리를 중심으로 그래프를 그릴지 정할 수 있다. 위에선 품종(species)에 따라 보여지게끔 정했다.

2. 원-핫 인코딩

X = df.iloc[:, 0:4]
y = df.iloc[:, 4]

y = pd.get_dummies(y)
print(y[0:5])

딥러닝에선 계산을 위해 문자를 모두 숫자형으로 바꿔야한다. 이를 위해서 행과 열을 아이리스 각각의 이름으로 해놓고 자신의 이름이 일치하는 경우는 1로, 나머지는 0으로 바꾸어 준다. 이 과정을 원-핫 인코딩(one-hot encoding)이라 한다. 원-핫 인코딩은 판다스에서 제공하는 get_dummies() 함수를 이용하면 간단하게 할 수 있다.

3. 소프트맥스

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

이번 문제에서는 예측해야 할 값이 세 가지이므로 각 샘플에 대한 확률을 따로따로 구해야한다. 이때 사용되는 함수가 소프트맥스 함수다. 소프트맥스 함수는 각 항목당 예측 확률을 0과 1 사이의 값으로 나타내 주는데 이때 각 샘플당 예측 확률의 총합이 1인 형태로 바꾸어 주게 된다. 다항분류에선 손실함수 또한 categorical_crossentropy를 써야한다.

아이리스 품종 예측 실행

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


--------------------------------------------------------------------------
Epoch 1/30
30/30 [==============================] - 1s 2ms/step - loss: 1.6071 - accuracy: 0.3267
Epoch 2/30
30/30 [==============================] - 0s 2ms/step - loss: 1.1966 - accuracy: 0.2800

...

Epoch 29/30
30/30 [==============================] - 0s 2ms/step - loss: 0.3106 - accuracy: 0.9333
Epoch 30/30
30/30 [==============================] - 0s 2ms/step - loss: 0.2980 - accuracy: 0.9333

약 93%의 정확도를 보인다.

reference: https://github.com/taehojo/deeplearning

0개의 댓글