아래 내용은 XAI를 공부하며 'XAI 설명 가능한 인공지능, 인공지능을 해부하다' 서적을 요약 정리한 내용입니다. 실습을 통해 본 컴퓨터 세팅에 따라 코드 부분이 다를 수 있습니다.
연관게시글
앞서 실습한 예제는 XGBClassifier()의 기본 파라미터를 사용하였습니다. 이제 모델 파라미터를 튜닝하면서 최적의 정확도를 찾아보겠습니다.
1. 기본 모델 결과
위 모델은 Glucose와 Age, BMI 피처만 사용해 당뇨를 진단하고 있습니다. 학습에 사용한 피처는 총 6개인데 의사 결정 트리에서 나온 분기는 3가지뿐입니다. 물론 해당 모델은 81.17%의 높은 테스트 정확도를 보이고 있습니다. 그렇지만 1%의 성능 향상도 중요하고 다른 피처들에 대해서도 의사 결정 트리의 분기가 발생하는 지점이 궁금할 것입니다. 또 정확도뿐만 아니라 민감도(sensitivity), 정밀성(precision), 특이성(specialty)에 따라서 모델을 수정할 수 있어야 합니다.
2. GridSearchCV
알고리즘의 파라미터를 일일이 수정하며 최적값을 찾을 수 도 있지만 scipy 패키지에 있는 GridSearchCV클래스는 복수 개의 하이퍼파라미터를 일일이 입력하지 않아도 최적의 파라미터를 찾을 수 있게 조합해 모델을 만듭니다.
import numpy as np
from sklearn.model_selection import GridSearchCV
cv_params = {
'max_depth':np.arange(1, 6, 1)
}
fix_params = {
'booster' : 'gbtree',
'objective' : 'binary:logistic'
}
csv = GridSearchCV(XGBClassifier(**fix_params),
cv_params,
scoring = 'precision',
cv = 5)
csv.fit(x_train, y_train)
print(csv.best_params_)
# 테스트 데이터 예측하기
y_pred = csv.predict(x_test)
predictions = [round(value) for value in y_pred]
# 정확도 평가
accuracy = accuracy_score(y_test, predictions)
print("Accuracy : %.2f%%"%(accuracy*100.0))
{'max_depth': 1}
Accuracy : 77.92%
cv_params의 키 값은 파라미터 이름, 밸류 값에는 리스트 형태로 실험하고 싶은 모든 파라미터 입력할 수 있습니다. numpy 패키지의 arange는 기본 함수인 range와 비슷하게 동작하지만 range 함수는 정수형에 대해서만 동작하는 반면 arange는 실수형에 대해서도 동작합니다.
fix_params에서는 모델에 적용할 고정 파라미터를 입력합니다. 'booster':'gbtree'는 XGBoost 모델의 기본 부스터로 그래디언트 부스트를 사용하겠다는 의미이며, 'objective':'binary:logistic'은 목적함수가 로지스틱 이진 분류 함수를 사용한다는 뜻입니다. XGBClassifier(**fix_params)은 고정 변수를 제외한 그리드를 만들고 반복해서 모델을 생성하게 됩니다.
GridSearchCV에 의하면 우리가 만든 모델은 의사 결정 모델의 트리 깊이가 1일 때 정확도가 가장 높으며, 이때의 정확도는 77.92%입니다. 이는 우리가 원하는 결과가 아니고 처음 모델 성능보다 낮습니다.
3. GridSearchCV에 다양한 파라미터 조합
cv_params = {
'max_depth':np.arange(1, 6, 1),
'learning_rate' : np.arange(0.05, 0.6, 0.05),
'n_estimators' : np.arange(50, 300, 50)
}
fix_params = {
'booster' : 'gbtree',
'objective' : 'binary:logistic'
}
csv = GridSearchCV(XGBClassifier(**fix_params),
cv_params,
scoring = 'precision',
cv = 5)
csv.fit(x_train, y_train)
print(csv.best_params_)
# 테스트 데이터 예측하기
y_pred = csv.predict(x_test)
predictions = [round(value) for value in y_pred]
# 정확도 평가
accuracy = accuracy_score(y_test, predictions)
print("Accuracy : %.2f%%"%(accuracy*100.0))
# GridSearch를 사용한 모든 조합 출력
for parameter in csv.cv_results_['params']:
print(parameter)
{'learning_rate': 0.1, 'max_depth': 1, 'n_estimators': 50}
Accuracy : 75.97%
{'learning_rate': 0.05, 'max_depth': 1, 'n_estimators': 50}
{'learning_rate': 0.05, 'max_depth': 1, 'n_estimators': 100}
..이하생략..
{'learning_rate': 0.55, 'max_depth': 5, 'n_estimators': 200}
{'learning_rate': 0.55, 'max_depth': 5, 'n_estimators': 250}
위 예제는 GridSearchCV를 사용해 당뇨병 진단 모델의 의사 결정 모델 최적 깊이와 학습률, 추정치 모델의 모든 그리드 탐색 조합을 통해 최적의 하이퍼파라미터를 찾습니다. 마지막 줄은 GridSearchCV 클래스의 cv_results_ 딕셔너리를 탐색하고 params에는 그리드 탐색에 사용되는 모든 파라미터의 조합이 들어있습니다.
위의 모델의 최적값은 (0.1, 1, 50)으로 해당 모델은 기존 모델보다 깊이가 얕기 때문에 공신력을 얻기 어렵습니다. 저자가 미리 찾아놓은 최적의 파라미터는 다음과 같습니다.
model = XGBClassifier(
booster='gbtree',
objective = 'binary:logistic',
learning_rate = 0.03,
n_estimators = 150,
reg_alpha = 0.15,
reg_lambda=0.7,
max_depth=4
)
# 의사 결정 트리 시각화
model.fit(x_train, y_train)
plot_tree(model)
plt.show()
# 예측하기
y_pred = model.predict(x_test)
predictions = [round(value) for value in y_pred]
# 평가하기
accuracy = accuracy_score(y_test, predictions)
print('Accuracy : %.2f%%'%(accuracy*100))
위 모델에 대한 테스트 데이터의 정확도는 84.42%입니다. 이 모델은 의사 결정 트리의 깊이가 4이기 때문에 더욱 많은 피처를 사용해 당뇨병을 진단할 수 있을 것입니다.
4. Confusion Matrix를 사용한 정확도
모델의 정확도, 정밀성, 재현도, 민감도 등 다양한 기준에 대해 컨퓨전 행렬(Confusion Matrix)를 사용하여 얻을 수 있고 보기 좋게 시각화하기 위해 아래 코드를 따라하면 행렬값을 받아 2x2 크기의 사각 행렬이 그려집니다.
from sklearn.metrics import confusion_matrix
import itertools
cm = confusion_matrix(y_test, y_pred)
def plot_confusion_matrix(cm,
classes,
normalize=False,
title="Confusion matrix",
cmap=plt.cm.Blues):
plt.imshow(cm, interpolation = 'nearest', cmap=cmap)
plt.title(title)
plt.colorbar()
tick_marks = np.arange(len(classes))
plt.xticks(tick_marks, classes, rotation=45)
plt.yticks(tick_marks, classes)
if normalize:
cm = cm.astype('float')/cm.sum(axis=1)[:, np.newaxis]
thresh = cm.max()/2
for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
plt.text(j, i, cm[i,j], horizontalalignment='center',
color='white' if cm[i, j] > thresh else "black")
plt.tight_layout()
plt.ylabel('True Label')
plt.xlabel('Predicted Label')
plt.show()
def show_data(cm, print_res=0):
tp=cm[1,1]
fn=cm[1,0]
fp=cm[0,1]
tn=cm[0,0]
if print_res ==1:
print('Precision = {:.3f}'.format(tp/(tp+fp)))
print('Recall (TPR) = {:.3f}'.format(tp/(tp+fn)))
print('Fallout(FPR) = {:.3f}'.format(fp/(fp+tn)))
return tp/(tp+fp), tp/(tp+fn), fp/(fp+tn)
plot_confusion_matrix(cm, ['0', '1'], )
show_data(cm, print_res=1)
참고자료
[도서] XAI 설명 가능한 인공지능, 인공지능을 해부하다
혼자 공부하면서 정리하는 개념으로 작성하여 많이 부족합니다.
틀린부분이나 첨언해주실 내용 있으시면 댓글 부탁드려요 ^^*
'머신러닝&딥러닝 > 책요약및리뷰' 카테고리의 다른 글
[혼자공부하는머신러닝+딥러닝] 3. 회귀 알고리즘과 모델 규제 (0) | 2022.06.15 |
---|---|
[혼자공부하는머신러닝+딥러닝] 2. 데이터 다루기 (0) | 2022.06.13 |
[혼자공부하는머신러닝+딥러닝] 1. 마켓과 머신러닝 (0) | 2022.06.10 |
[XAI 설명가능한 인공지능] 2. 모델 생성 및 해석 실습-Xgboost (0) | 2022.05.16 |
[XAI 설명가능한 인공지능] 1. 'XAI' 개념 및 개발 준비 (0) | 2022.05.16 |