클래스가 2개가 아닌 3개, 참 거짓이 아닌 여러 개 중에 어떤 것이 답인지
다중 분류 여러 개의 답 중 하나를 고르는 문제
import pandas as pd
#깃허브에 준비된 데이터를 가져옴.
!git clone https://github.com/taehojo/data.git
#아이리스 데이터를 불러옴.
df = pd.read_csv('./data/iris3.csv')
df.head() # 첫 다섯 줄을 확인
그리고 시본 라이브러리에 있는 pirplot()함수를 써서 전체 상관도
import seaborn as sns
import matplotlib.pyplot as plt
sns.pairplot(df, hue='species');
plt.show()
속성별 데이터 분포와 속성 간의 관계를 한 눈에
pairplot() 함수 설정 중 hue 옵션은 어떤 카테고리를 중심으로 그래프를 그릴지 정해준다. 우리는 품종에 따라 지정
그래프 가로축, 세로 축은 서로 다른 속성 이러한 속성에 따라 품종이 어떻게 분포되는지 알 수 있음.
가운데 대각선 위치한 그림은 가로축, 세로축이 같으므로 해당 속성에 따라
각 품종들이 어떻게 분포하는지 보여줌.
케라스를 이용해 아이리스의 품종을 예측
데이터 프레임을 X, Y로 나눔.
y의 값이 숫자가 아닌 문자
딥러닝에서는 계산을 위해 문자를 모두 숫자형으로 바꿔줘야 한다.
원-핫 인코딩
이렇게 여러 개의 값으로 된 문자열을 0과 1로만 이루어진 형태로 만듦.
판다스가 제공하는 get_dummies()함수를 사용하면 간단함.
y = pd.get_dummies(y)
#원-핫 인코딩 결과를 확인함.
print(y[0:5])
#모델 설정
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'])
이 예제에서는 예측해야 할 값이 세 가지로 늘었음.
샘플마다 setosa, versicolor, virginica일 확률을 각각 구해야함.
activation란에 softmax로 적어 주는 것으로 소프트 맥스 함수 적용
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, 클래스를 y로 저장.
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)
model.summary()를 사용해 두 개의 은닉층에 각각 12개, 8개 노드 생성
출력 Dense는 3개임을 확인 가능함.
결과는 96.0%
[^출처]: 모두의 딥러닝 개정 3판 (지은이: 조태호)