- metrics () 함수: 모델이 컴파일될 때 모델 수행의 결과를 나타내게끔 설정하는 부분입니다. accuracy라고 설정한 것은 학습셋에 대한 정확도에 기반해 결과를 출력하라는 의미입니다. loss는 손실 값, val_acc는 테스트셋에 대한 정확도, val_loss는 테스트셋에 대한 손실 값을 나타낸다.
모델 실행하기
주어진 폐암 수술 환자의 수술 후 생존 여부 데이터는 총 470명의 환자에게서 16개의 정보를 정리한 것입니다. 이때 각 정보를 '속성'이라고 합니다. 그리고 생존 여부를 클래스, 가로 한 줄에 해당하는 각 환자의 정보를 각각 '샘플'이라고 합니다. 주어진 데이터에는 총 470개의 샘플이 각각 16개씩의 속성을 가지고 있습니다.
* 이 용어는 출처마다 조금씩 다르다. 예를 들어 샘플을 instance 또는 example이라고도 하며, 속성 대신 피처 또는 특성이라고도 합니다.
- batch_size: 샘플을 한 번에 몇 개씩 처리할지 정하는 부분.(컴퓨터 메모리가 감당할 만큼의 사이즈를 찾아 설정해 주는 것이 좋습니다.)
12장 다중 분류 문제 해결하기
다중 분류 문제
: 여러 개의 답 중 하나를 고르는 분류 문제
데이터의 구조
상관도 그래프
pandas 이용
seaborn 이용
- pairplot() 함수 설정 중 hue 옵션은 주어진 데이터 중 어떤 카테고리를 중심으로 그래프를 그릴지 정해줌.
- 대각선 위치에 있는 그림은 가로축과 세로축이 같으므로 단순히 해당 속성에 따라 각 품종들이 어떻게 분포하는지 보여줌.
원-핫 인코딩
딥러닝 계산을 위해 문자를 모두 숫자형으로 바꾸어 주어야 한다.
먼저 아이리스 꽃의 종류는 1 처럼 세 종류입니다. 그러면 2 처럼 각각의 이름으로 세 개의 열을 만든 후 3 처럼 자신의 이름이 일치하는 경우 1로, 나머지는 0으로 바꾸어 줍니다.
여러 개의 값으로 된 문자열을 0과 1로만 이루어진 형태로 만들어 주는 과정을 원-핫 인코딩이라고 합니다.
get_dummies() 함수를 사용하면 간단하게 해낼 수 있다.
소프트맥스
출력 값이 하나면 되는 이항 분류와 다르게 다항 분류는 각 샘플마다의 확률을 따로따로 구해야 합니다. 예를 들어 예측 결과는 다음과 같습니다.
소프트맨스 함수는 각 항목당 예측 확률을 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
# 깃허브에 준비된 데이터를 가져옵니다. 앞에서 이미 가져왔으므로 주석 처리합니다. 5번 예제만 별도 실행 시 주석을 해제한 후 실행해주세요.
from tensorflow.keras.models import Sequential, load_model
# 테스트를 위해 조금 전 사용한 모델을 메모리에서 삭제합니다.
del model
# 모델을 새로 불러옵니다.
model = load_model('./data/model/my_model.hdf5')
# 불러온 모델을 테스트셋에 적용해 정확도를 구합니다.
score=model.evaluate(X_test, y_test)
print('Test accuracy:', score[1])
k겹 교차 검증
: 데이터셋을 여러 개로 나누어 하나씩 테스트셋으로 사용하고 나머지를 모두 합해서 학습셋으로 사용하는 방법.
데이터를 원하는 수만큼 나누어 각각 학습셋과 테스트셋으로 사용되게 하는 함수는 사이킷런 라이브러리의 KFold() 함수입니다.
먼저 몇개의 파일로 나눌 것인지 정해 1의 k 변수에 넣습니다. 사이킷런의 2 kFold() 함수를 불러옵니다. 샘플이 어느 한쪽에 치우치지 않도록 shuffle 옵션을 True로 설정해 줍니다. 정확도가 채워질 3 acc_score라는 이름의 빈 리스트를 준비합니다. 4 split()에 의해 k개의 학습셋, 테스트셋으로 분리되며 for 문에 의해 k번 반복됩니다.
실습| 초음파 광물 예측하기: k겹 교차 검증
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from sklearn.model_selection import KFold
from sklearn.metrics import accuracy_score
import pandas as pd
# 깃허브에 준비된 데이터를 가져옵니다. 앞에서 이미 데이터를 가져왔으므로 추석 처리합니다. 3번 예제만 별도 실행 시 주석을 해제하여 실습하세요.
history=model.fit(X_train, y_train, epochs=50, batch_size=500, validation_split=0.25)# 0.8 x 0.25 = 0.2
# 테스트 결과를 출력합니다.
score=model.evaluate(X_test, y_test)
print('Test accuracy:', score[1])
모델 업데이트하기
에포크마다 모델의 정확도를 함께 기록하면서 저장하는 방법.
50번째 에포크의 검증셋 정확도가 0.9346이라면 50-0.9346.hdf5라는 이름으로 저장됩니다.
학습 중인 모델을 저장하는 함수는 케라스 API의 Modelcheckpoint() 입니다. 모델이 저장될 곳을 정하고 진행되는 현황을 모니터할 수 있도록 verbose는 1(True)로 설정합니다.
추가되는 코드는 아래와 같습니다.
그래프로 과적합 확인하기
적절한 학습 횟수를 정하기 위해서는 검증셋과 테스트셋의 결과를 그래프로 보는 것이 가장 좋다.
- loss: 학습을 통해 구한 예측 값과 실제 값의 차이(=오차)
- accuracy: 전체 샘플 중에서 정답을 맞춘 샘플이 몇 개인지의 비율
- val_loss: 학습한 모델을 검증셋에 적용해얻은 오차
- val_accuracy: 검증셋으로 얻은 정확도
이 값이 저장된 history는 model.fit()의 결과를 가진 파이썬 객체로, history.params에는 model.fit()의 설정 값들이, history.epoch에는 에포크 정보가 들어 있게 됩니다. 우리에게 필요한 loss, accuracy, val_loss, val_accuracy는 history.history에 들어 있습니다.
학습셋에서 얻은 오차는 파란색으로, 검증셋에서 얻은 오차는 빨간색으로 표시하겠습니다.
# y_vloss에 테스트셋(여기서는 검증셋)의 오차를 저장합니다.
y_vloss=hist_df['val_loss']
# y_loss에 학습셋의 오차를 저장합니다.
y_loss=hist_df['loss']
#x 값을 지정하고 테스트셋(검증셋)의 오차를 빨간색으로, 학습셋의 오차를 파란색으로 표시합니다.