본문 바로가기
프로그래머스/데이터분석 데브코스 프로젝트

ML 예측 모델 구현 프로젝트 셀프리뷰

by 포잉띠 2024. 5. 15.

 

xgboost 모델 구현, 학습 notebook

https://www.kaggle.com/code/arinmu/pubg-xgb/notebook

 

pubg xgb

Explore and run machine learning code with Kaggle Notebooks | Using data from PUBG Finish Placement Prediction (Kernels Only)

www.kaggle.com

 

EDA, 전처리 과정 notebook

https://www.kaggle.com/code/arinmu/pubg-eda

 

pubg eda

Explore and run machine learning code with Kaggle Notebooks | Using data from PUBG Finish Placement Prediction (Kernels Only)

www.kaggle.com

 

 

이미지 파일을 포함한 github

https://github.com/sfr9802/programmers_dadev2nd_3rdproject

 

GitHub - sfr9802/programmers_dadev2nd_3rdproject

Contribute to sfr9802/programmers_dadev2nd_3rdproject development by creating an account on GitHub.

github.com

 

1차 2차를 진행했을때는 사실 얻어가는게 있을까? 라는 생각이 들었다.

다만 3차는 자신있게 얻어간게 많다고 이야기 할 수 있다.

완벽하고 깔끔한 결과물을 얻었다고는 할 수 없다. 

하지만 이 부족한 부분에서 많은것을 얻었다.

 

가장 큰 부분은 EDA, 전처리를 진행한 후 머신러닝 모델 input으로 사용해야만 한다는 고정관념이 부숴졌다.

모델마다 중요하다고 판단한 피쳐들이 달랐고 결과도 달랐다.

클러스터링 결과가 유의미하기도 했고 변수중요도를 추출해 봤을 때 EDA, 전처리 과정에 도움이 되는 부분도 존재했다.

 

이러한 부분들을 고려하지 못한 채 EDA, 전처리, 모델링 과정에서 여러모로 순서가 뒤죽박죽이 되었다. 

하지만 전체적으로 애자일한 분석방식이 정확히 어떤것인지 깨달았다.

또한 쉽고빠른 scikit learn 라이브러리가 효자손인 이유도 깨달았다.

 

EDA 과정, 전처리 과정에서 지표를 보고 사람이 판단하는것이 아니라 머신러닝 결과를 보고 판단하며 특정 전처리 기법을 적용하고 또 머신러닝 결과를 확인해 보고, 또 다른 기법을 적용해 보거나 수정하거나 하고 머신러닝 결과를 확인해 보고

이런 방식으로 진행하는게 베스트라고 느꼈다.

이렇게 진행하기 위해서는 비용소모가 막대한 딥러닝 모델보다는 쉽고빠르고가벼운 scikit learn이 선호되는게 당연하겠다 싶었다.

 

EDA, 전처리 > 머신러닝 모델 > 결과 분석 > 데이터 점검 > EDA, 전처리 > 머신러닝 모델 이런식의 루프가 아니라 전체 과정이 유연하게 돌아가는게 진짜 애자일한 방식이 아니었을까 생각이 들었다.

 

뿐만 아니라 다중공선성 문제에 이렇게 대응하면 안된다 를 배웠다.

어? 다중공선성 발생했네? 얘가 타겟변수랑 상관계수가 좀 더 낮으니까 날릴까? 

는 절대 하면 안된다는것을 깨달았다.

다중공선성 문제를 회피하는 방법의 첫번째로는 다중공선성이 발생한 변수를 하나씩 제거하고 다시한번 다중공선성을 계산해 또 다른 변수와 다중공선성이 발생하는지 확인한 후,

만약 없다면 변수 하나가 없는 상태로 머신러닝 모델을 돌려서 변수중요도를 추출한다.

다른 변수도 같은 방법으로 진행하여 모델이 판단했을 때 더 낮은 변수중요도를 가진 변수를 제거하거나 조합하여 새로운 파생변수를 만들거나 하는 방식으로 다중공선성을 회피할 수 있다고 한다.

 


의사결정트리 기반 모델을 사용했기에 다중공선성 문제를 크게 생각하지 않아도 되었다. 라는 결론에 도달했다.

변수들을 독립적으로 사용하기때문에 다중공선성 문제에도 강하다는 사실을 뒤늦게 알았다. 하지만 아무리 모델이 다중공선성 문제에 강하다고 하더라도, 대처하는 방법은 알아두는게 좋을 것 같다.특정 변수를 제거한 데이터셋을 사용한 모델링 성능지표보다, 모든 변수가 포함된 데이터셋을 사용한 모델링 성능지표가 더 좋게 나온것은 이 부분이 가장 큰 원인이라고 생각된다.


 

 

두번째는 PCA를 활용하는 것이다.

이번 프로젝트에서 PCA를 진행하지 않은건 아닌데, 결과를 해석하는 방법, 사용하는 방법이 아예 잘못되었었다.

나는 단순히 차원축소 = 컬럼 수 줄이기 라고 생각해서 각 주성분마다 비중이 적은 컬럼들을 제거하자는 쪽으로 의견을 냈었다.

하지만 이는 매우 잘못된 방법이었고 사실 PCA 결과의 수치들은 각 데이터포인트의 패턴이 주성분에 얼마만큼 포함되었는지를 나타내는 것이었다.

그리고 PCA진행할 때 주성분의 갯수를 임의로 마음에 드는 숫자를 주었는데 이또한 잘못된 부분이었다.

원래는 주성분의 고유값을 구하여 시각화 한 후 elbow포인트, 고유값이 급격하게 하락하는 지점을 주성분 갯수로 삼거나

랜덤서치 해서 최적의 하이퍼파라미터를 찾듯이 파이프라인을 만들어 교차검증을 진행해서 가장 좋은 성능을 보이는 주성분 값을 찾아낸다고 한다.

 

 


이후 리서치, 멘토님의 피드백 과정에서 PCA를 모델 혹은 클러스터링에 사용하면 성능이 떨어진다는 정보를 확인했다.

비용부분에서 확실히 이점이 있지만 모델 성능이 하락하기에 타협이 필요해 보인다. 

하락하는 이유는 특히 트리 기반 모델의 경우 이미 이상치에 강하고 차원이 많아도, 다중공선성이 발생해도 변수들을 독립적으로 판단하여 예측을 진행하기 때문에 PCA가 의미가 없거나 특정 주성분에 편향될 확률이 늘어나고 총 차원 갯수가 줄어드는 만큼 과적합 확률, 제대로 예측하지 못할 확률이 상승하여 성능이 하락하는 느낌이다.클러스터링에서도 비슷한 느낌으로 장점과 단점이 존재하지만, 이번 데이터셋처럼 차원이 아주 많은 경우에는 성능면에서, 군집화 면에서 단점을 상회하는 성능을 낼 수도 있다고 한다. 실제로 클러스터링 결과가 의미있다고 판단했다.


 

 

변수중요도, VIF score는 어떤 존재인지 인식은 하고있었지만 사용할 생각은 해보지 않았는데, 이번 프로젝트를 진행하며 정확히 어떻게 어디에 언제 왜 사용해야 하는지 제대로 공부하게 되었다.

 

모델을 만들고 돌려보고 결과를 추출해내는건 세상이 좋아져서 너무 쉬워졌지만

그것을 바탕으로 분석하고 더욱 개선시키는건 아예 다른 문제라고 느껴졌다.

이제야 진짜 데이터 분석이 뭘 해야하는 건지, 어떤 목표를 가진건지 깨달은 느낌이다.