Random Forest Classifier을 사용해 포켓몬이 전설인지 아닌지 예측해 보기

Adam Lee
6 min readOct 23, 2020

--

포켓몬 게임을 좋아하는 사람들에겐 익숙하겠지만, 포켓몬 게임 중 마지막 컨텐츠는 전설의 포켓몬을 잡는 것으로 마무리 되는 경우가 많다.

전설의 포켓몬이란, 포켓몬 세계관 상 한마리만 존재하는 매우 특수한 포켓몬으로, 모든 전설의 포켓몬이 그런건 아니지만, 대부분의 경우 성능이 매우 뛰어나다.

7세대 까지 등장한 모든 전설의 포켓몬들

포켓몬 데이터셋을 갖고 해당 포켓몬이 전설의 포켓몬인지 아닌지 판단하는 모델을 한번 만들어 보려고 한다.

# 데이터 불러오기

Kaggle에 있는 포켓몬 데이터를 파이썬 환경으로 불러와 보도록 하겠다.

Kaggle에 올라온 데이터에는, 각 포켓몬의 도감 번호, 이름, 상성, 능력치, 등장한 버전, 전설 여부가 기록되어 있다.

우리가 예측하려는 값은 Legendary항목이며, 범주형 데이터를 인코딩하는 방식은 One Hot Encoder를 사용할 예정이다.

One Hot Encoding은 범주형 데이터를 인코딩하는 방식으로, 하나의 범주에 해당하는 데이터에 해당하는 열을 새로 생성하는 방식으로 인코딩이 된다.

그렇기 때문에 데이터 전체를 One Hot Encoding을 진행하게 된다면, 각 포켓몬의 이름에 해당하는 열이 생성이 되게 될 것이고, 데이터가 너무 커지며, 어차피 도감번호라는 고유값이 존재하기 때문에 이름을 전처리를 통해 제거하도록 하겠다.

# 데이터를 사이킷런 라이브러리를 활용하여 분류하기

파이썬에는 사이킷런이라는 머신러닝을 위한 라이브러리가 존재하며, 해당 라이브러리 안에는 여러 유용한 패키지가 존재한다.

이 중 train_test_split이라는 패키지를 활용해 데이터를 훈련/ 검증/ 테스트 셋으로 나눠 보도록 하겠다.

여기서 y_로 시작하는 데이터는 우리가 검증하려는 타겟만 있는 데이터 셋으로, 통상적으로 소문자 y로 표기한다고 하며, X_로 시작하는 데이터셋은 우리가 사용하려는 피쳐들을 갖고 있는 데이터셋으로 통상적으로 대문자 X로 표기한다고 한다.

# 모델 만들기

데이터를 분류해보았으니, 사이킷런에 있는 make_pipeline 패키지를 사용하여 파이프라인을 만들도록 하겠다.

파이프라인이랑 여러 코드들을 한꺼번에 돌리는 과정을 단순하게 하는 과정을 의미한다.

여기서 기본적으로 사용할 모델은 Random Forest Classifier모델로, Decision Tree를 여러번 사용하는 모델로 생각하면 간단할 것 같다.

이때 결과 값은 아래와 같다.

Accuracy score: 0.9765625

검증 세트를 통해 검증을 해봤을때 해당 모델의 정확도가 97%가 넘어 매우 정확한 편에 속한다고 볼 수 있다.

# Confusion Matrix를 통해 Precision과 Recall 구하기

여기서 만든 모델의 목적은 피처들을 정확히 사용하여 해당 포켓몬이 전설인지 아닌지 여부를 판단하는 것이다.

하지만, 앞서 말했던 것과 마찬가지로 전설의 포켓몬은 적기 때문에 모델이 무조건적으로 False를 예측하여도 Accuracy score 자체는 낮지 않을 것이다.

그렇기 때문에 이 모델이 정확히 학습을 통해 예측을 잘하고 있는지 확인을 하기 위해 precision과 recall을 확인하는 것 역시 중요하다.

Precision은 선택된 정보 중 실제로 관련이 되어있는 데이터는 얼마나 되는지를 측정하는 비율, recall은 관련이 있는 데이터가 얼마나 선택이 되었는지를 확인하는 지표라고 보면 된다.

예시로, 자동차 회사에서 리콜을 진행할때는 하자가 있는 자동차를 예측할때는 recall값을 최대한 높게 생각해 진행한다고 생각하며 되며, 반대로 유튜브 추천 알고리즘은 시청자의 취향에 최대한 맞추기 위해 precision값을 최대한 높인다고 이해를 하면 조금 수월할 것 같다.

Precision과 recall값을 구하기 앞서, TP, FP, TN, FN에 대한 개념을 이해하는 것이 중요할 것이라고 생각된다.

TP: True Positive, 모델이 참일것이라 예측했으며 실제로 참인 경우

TN: True Negative, 모델이 거짓일 것이라 예측했으며, 실제로 거짓인 경우

FN: False Negative, 모델이 거짓일 것이라 예측하였으나, 실제로는 참인 경우

FP: False Positive, 모델이 참일 것이라고 예측하였으나, 실제로 거싯인 경우

보다 이해를 쉽게하기 위해 이를 검증세트의 내용으로 시각화 해보도록 하겠다.

여기서 TN, TP, FN, FP값들은 아래와 같으며, precision과 recall을 구하는 공식은 아래와 같다.

precision is 0.42857142857142855
recall is 0.75

그 결과 해당 모델은 리콜값이 조금 높은 것으로 보이며, 이는 전설의 포켓몬이 아니더라도 전설의 포켓몬으로 판단할 확률이 조금 높다는 것을 의미한다.

# 테스트 데이터 값을 예측하고 정확도 보기

테스트 데이터값을 예측하기 위해선 모델에 X_test를 돌려보면 된다.

1.0

그 결과 테스트 데이터에 있는 데이터를 100퍼센트 맞췄다.

실생활에서 사용하는 모델이 100퍼센트의 성능을 갖는 것은 거의 없으나, 해당 포켓몬 데이터는 데이터의 샘플 자체가 적기 때문에 이와 같은 결과가 나온 것으로 보인다.

# 모델에 사용된 피쳐의 중요도 보기

모델을 만들때 피처 중 영향을 많이 준 피처들이 있는 반면, 영향을 적게 준 피처들도 있다.

Matplotlib를 통해 해당 피처들의 중요도를 시각화 해보도록 하겠다.

그 결과 포켓몬의 능력치의 총합인 ‘Total’이라는 피처가 해당 모델에서 가장 중요한 것으로 보인다.

서론에서 말했듯이, 전설의 포켓몬은 대부분의 성능이 대부분 훌륭하기 때문에 이런 결과가 나온 것이 아닐까 싶다.

또한 눈에 띄는 것이 도감번호를 나타내는 피처인 “#”가 4번째로 영향이 큰 피처인 것으로 확인되는데, 전설의 포켓몬은 각 세대의 가장 마지막 도감 번호를 차지하는 현실을 모델이 잘 학습하고 반영한 것으로 보인다.

#글을 마치며

Test 데이터를 예측을 할때 정확도가 100퍼센트 나와서 사실 놀라웠다.

당연하겠지만, 데이터의 크기가 커졌다면 결과가 전혀 다르게 나왔을 것 같다.

다음 번에는 조금 더 큰 데이터 셋을 갖고 모델을 짜보는 연습을 해봐야 할 것 같다.

--

--

Adam Lee
Adam Lee

No responses yet