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)에 따라 보여지게끔 정했다.
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() 함수를 이용하면 간단하게 할 수 있다.
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