
https://www.kaggle.com/code/satyaprakashshukl/mushroom-classification-analysis/notebook
🌴Mushroom🎉Classification📈Analysis
Explore and run machine learning code with Kaggle Notebooks | Using data from multiple data sources
www.kaggle.com
완성된 XGBoost 모델로 추정을 시작하자!
lime 패키지를 불러오는데 이는 머신러닝 모델의 예측을 설명하는 데 사용된다.
redict_fn_xgb라는 함수는 (왜 앞에 p가 빠졌는지는 모르겠다,, 단순 오타가 아니라 이후에도 계속 이렇게 사용된다) 입력값 x를 받으면 이에 해당하는 클래스별 예측 확률을 반환한다.
train_X뒤에 .values를 붙인 이유는 이렇게 해야 pandas의 dataframe을 numpy의 array로 바꿀 수 있기 때문이다. 그런데 이보다는 동일한 기능을 하는 "to_numpy()"를 사용하는 게 더 좋다고 한다. (가독성 때문인 듯?)
마지막 줄을 다시 가져오면,
explainer = lime.lime_tabular.LimeTabularExplainer(
X,
feature_names=train_X.columns,
class_names=['Poisnous', 'edible'],
kernel_width=5
)
LimeTabularExplainer라는 객체는 예측의 '이유'를 알려주는 고마운 친구다.
X는 앞서 변환한 array이고,
columns들도 각각 가져오고,
class_names에는 타겟 클래스의 이름을 지칭한다.
마지막의 kernel_width에 대한 설명은 chatGPT를 참고하자.
기본적으로 머신러닝 모델은 블랙박스기 때문에 예측을 설명하기가 어렵다.
LIME은 원래의 데이터 포인트와 비슷한 데이터 포인트를 생성하고, 이 새로운 데이터에 대해 모델이 어떻게 예측하는지를 본다. 아주 약간의 차이가 있는 데이터들마다 최종 예측값들은 다를 것이다.
이를 바탕으로 간단한 선형 모델을 학습시켜서 예측 성분별로 중요도를 평가하는 것이다. 첫 번째 column을 바꿨는데 변화가 없고, 두 번째 column을 바꿨는데 결과가 바뀐다면 두 번째 column의 예측 시의 중요도가 높은 것이다.
그렇다면 kernel_width는 "얼마나 넓은 범위에서" 비슷한 샘플들을 만들어낼지를 결정하는 값이다. 이 값이 작으면 아주 미세한 차이가 있는 데이터들만 생성되기 때문에 세밀하게 파악할 수 있고, 크다면 모델의 일반적인 패턴을 파악할 수 있다.
기본값은 column의 개수에 따라 달라지기 때문에, 보통은 0.75 * sqrt(number_of_features)를 사용한다고 한다.
이제 시각화하자!
choosen_instance = test_X.loc[[1584520]].values[0]
exp = explainer.explain_instance(choosen_instance, redict_fn_xgb,num_features=15)
exp.show_in_notebook(show_all=False)
잠깐 데이터셋에 대한 용어가 혼동을 줄 수 있으니 정리하면,,
df_train을 train과 validation으로 쪼갠 것이 곧 train_x, test_x이고,
df_test는 우리가 최종적으로 답을 낼 때 사용할 그냥 df_test이다.
암튼 test_x에서 임의로 하나를 뽑고 choosen_instance로 만들자.
(이게 values[0]이라고 쓰여있길래 첫 번째 column을 선택하는 줄 알았는데 그게 아니고 그냥 만들어진 array에서 0번째 인덱스를 가져오는 것이었다.. 가독성이 넘 구데기인데 앞서 말한 to_numpy()를 사용하면 choosen_instance = test_X.to_numpy()[1584520] 으로 표현할 수 있다.)
그럼 이렇게 예쁘게 예측 확률과 각 feature들의 설명도를 보여준다.
그런데 의문이 들었다.
gill-spacing이 28이하면 edible이라고 설명해 준다는데, 우리가 고른 데이터는 gill-spacing이 정확히 28이다! 경계에 걸쳐있다는 것이다. 그렇다면 독성 설명도는 0이어야 하지 않을까?
질문을 여러 번 바꿔서 했는데도 명쾌한 해답은 얻지 못했다,, 혹시 아시는 분 있으면 댓글 부탁,,
모델 성능은 상당히 좋다!
이제 진짜 테스트 데이터에 넣고
이 값을 제출하면 된다~
'분명 전산학부 졸업 했는데 코딩 개못하는 조준호 > AI, ML, DL' 카테고리의 다른 글
한국은행 들어갈 때까지만 합니다
조만간 티비에서 봅시다