brunch

You can make anything
by writing

C.S.Lewis

by 스토너 Dec 12. 2022

캐글 Kaggle 대회 데이터를 분석해보자(final)

RandomForest ML로 실제 SUV 구매를 예측해보자

지난 번 그리드서치 적용하여 최적의 하이퍼파라미터를 적용한 90% 정확도의 모델을 만들었습니다.

 

변수가 많은 실무에서는 80%대 이상의 정확도 높은 모델만 나와도 잘 나온 편이라고 하지만 

SUV 구매 예측 데이터셋은 400개의 데이터와 5개의 변수밖에 없으니 90%보다 좀 더 높은 정확도가 나와야할 듯 싶습니다.


같은 트리계열이지만 앙상블 모델로 성능이 좀 더 좋은 Random Forest ML을 사용해 정확도를 높여보겠습니다.


지난번과 동일한 라이브러리를 import해줍니다. 


library import



Train / test data set 분류하기


앞서 DecisionTree ML을 만드는 과정과 마찬가지로 독립변수를 각각 나이(Age), 

연봉(EstimatedSalary), 여성(Gender_Female), 남성(Gender_Male)을 설정하여 data 변수로 묶습니다.  


독립변수가 영향을 끼쳐서 SUV를 구매하는지 안하는지에 대한 여부를 알려주는 구매여부(Purchased)를 종속변수인 target으로 묶습니다.


DecisionTree의 경우 각 변수를 배열로 변환해야 하는 과정을 거치지만 DecisionTree를 보완한 앙상블 모델인 random forest는 numpy 변환을 생략합니다.


그리고 훈련(train data), 테스트(test data) 셋을 나눕니다. 

(일반적으로 테스트 데이터 셋은 25% 비율로 나눕니다.)



각 비율을 살펴보면 320개와 80개로 나뉜 걸 알 수 있습니다.



Grid Search, Random Forest



먼저 최적의 하이퍼 파라미터를 찾는 Random Forest의 하이퍼파라미터 변수 범위를 임의로 설정해줍니다. DecisionTree ML 과정에서는 range함수를 설정했지만 Random Forest에서는 일부 값만 넣어보기로 했습니다. 


n_estimators : 생성할 트리 갯수
max_depth : 트리 최대 깊이
min_sampls_leaf : 가장 말단의 자식노드가 되기 위해 필요한 최소 샘플 수
min_samples_split : 자식 노드를 분할하는데 필요한 최소 샘플 수


앞서 SUV 구매 결정 예측 ML을 만들었던 DecisionTree는 성능은 좋지만 일부 데이터셋에 과적합(overfitting)되는 문제점이 있습니다. 


Random Forest는 그런 단점을 보완한 앙상블 ML로 결정트리를 랜덤하게 만들어 각 결정트리 예측을 사용해 최적의 예측 ML을 만듭니다.



Random Forest의 원리



같은 트리계열이지만 DecisionTree와의 차이점은 무엇일까요? 


Random Forest는 랜덤하게 샘플을 추출하는데 중복을 허용하여 훈련 데이터를 만듭니다. 이렇게 만들어진 샘플을 부트스트랩 샘플이라고 합니다. 부트스트랩 샘플은 훈련 데이터(train data)셋 크기와 동일하게 만듭니다. 


Random Forest는각 노드를 분할할 때 일부 요인을 무작위로 골라 최선의 분할을 찾습니다. Random Forest는는 분류와 회귀 모델 모두 분석할 수 있습니다. 그중 분류 모델인 RandomForestClassifier는 전체 독립변수 갯수의 제곱근 크기의 변수를 선택합니다.


예를 들어 16개의 독립변수가 있다면 노드마다 4개를 랜덤하게 선택합니다. 이런식으로 선택한 특성을 훈련하여 각 트리의 클래스별 확률을 평균으로 가장 높은 확률의 클래스를 통해 예측 정확도를 도출합니다. 


바로 이 랜덤하게 선택한 샘플을 사용하기 때문에 성능을 안정적으로 유지하면서 과적합되는 것을 막아주는 것입니다.


Random Forest 이미지


DecisionTree는 왠지 한개의 나무의 이미지이지만 Random Forest는 말 그대로 이러한 트리들을 무수히 모아높은 숲이 떠오릅니다.


그럼 SUV 구매 예측 알고리즘을 Random Forest ML로 만들어보겠습니다.


그리드 서치를 수행하기 전에 먼저 Random Forest 객체를 생성합니다.

앞서 설정한 params로 그리드서치를 수행합니다.


91.25% 정확도가 나오는 최적의 하이퍼 파라미터 값을 도출했습니다.



그리드서치로 도출한 파라미터 값으로 Random Forest ML 학습을 시켜봅니다.



테스트 데이터 셋을 넣고 돌리니 마찬가지로 91.25%라는 정확도가 나왔습니다.

전에 DecisionTree에서 나온 90%의 정확도보다 1.25%가 더 높네요.






ML을 만들었으면 성능을 평가를 해야 합니다. ML을 평가하는 대표적인 성능 평가 지표는 Confusion Matrix, F1 Score, ROC curve 등이 있습니다. 각 ML에 적합한 평가 지표를 골라 ML 성능을 평가하면 됩니다.


여기서는 F1 score를 사용하여 ML성능을 한번 평가해보도록하겠습니다.


머신러닝 성능 평가해보기


F1 score


여기서 Precision이란 구매할 사람을 몇명이나 맞췄는지 퍼센티지로 나타낸게 정밀도(Precision)입니다.


Random Forest의 F1 score의 precision을 보면 SUV를 구매결정을 안할 사람을 맞춘 정밀도는 96%, SUV 구매결정을 할 사람을 맞추는 정밀도가 84%로 나왔습니다. 


그렇다면 여기서 recall은 뭘까요? 

여기서 recall은 재현율을 뜻하는 것으로 ML이 실제로 SUV를 구매한 사람을 맞추지 못할 수도 있습니다. 그래서 전체 SUV 구매한 사람 중에 머신러닝이 얼마나 실제 구매한 걸 맞췄나를 보는 게 recall입니다.


여기서 SUV를 실제로 구매하지 않은 사람을 맞춘건 90%이고, SUV를 실제로 구매한 사람을 맞춘 것이 93%가 나왔습니다. 


하지만 여기서 좀 뭔가 이상하지 않나요?


 Precision은 실제 Suv구매여부를 빼놓고 나이, 연봉, 성별이란 변수만 놓고 봤을 때 SUV를 구매했을 것이다. 구매하지 않았을 것이다를 맞추는 것입니다. 


하지만 recall은 실제 SUV 구매한 사람을 예측한다고 했을 때 얼마나 사실적으로 맞추었나를 보는 것입니다. 

즉 둘의 관계는 반비례(Trade-off) 관계로 언뜻 모순적으로 보입니다. 


머신러닝 기준을 정교하게 만들면 만들수록 Precision은 높아질 수 있으나 반면에 recall은 정교해진 머신러닝 기준으로 실제로 SUV 구매한 사람을 맞출 확률이 줄어듭니다. 


하지만 이 두 지표의 값을 모두 높일 수 있는 방법이 있습니다.


Precision과 Recall 두 지표의 평균을 구하면 됩니다. 


일반적인 평균은 산술 평균을 말하는 것으로 여기서 산술평균을 사용한다면 특정값에 치우쳐질 확률이 있을 위험이 있습니다. 

(오히려 일반적인 평균은 어느 값에 치우쳐 있는지 확인하는 용도로 계산하기도 합니다.)


일반적으로 말하는 5:5 평균을 구하는 것이 기계학습에서는 정확한 평균을 구하는 것을 뜻하지 않는다.



F1 score ML 성능을 평가하는 두 지표의 평균을 구할 때는 어느 한 값이 치우쳐지지 않도록 이를테면 낮은 값에 좀 더 가중치를 줘서 Precision, Recall 두 지표다 높은 결과에 도달하도록 조화평균을 사용합니다. 


이 조화평균의 원리로 F1 score는 Precision과 Recall 모두 높은 점수를 낼 수 있는 식을 만듭니다. 



여기서 F1 score는 SUV를 구매하지 않을 사람을 예측하는 Precision, Recall의 두 지표를 모두 높여 93%를 만들었고 SUV를 구매할 사람을 예측하는 두 지표의 F1 score는 88%입니다. 


평균 정확도인 Accuracy는 Random Forest의 정확도와 같은 91%입니다. 


ROC Curve



Roc curve도 1에 근접하게 꺾인 모형으로 나왔습니다.


90%보다 좀 더 높게 나온 정확도이지만 썩 만족한 정확도는 아닙니다. 

나중에 시간이 주어진다면 좀 더 정확도를 높일 수 있는 방법을 더 연구해보고 싶네요. 



그렇다면 SUV를 실제로 구매할 확률이 높은 사람이 가지고 있는 특성은 뭘까?



트리 계열의 ML의 장점은 어떤 특성이 구매예측 여부에 영향을 끼쳤는지 요인을 알기가 좋다는 점입니다.

(무엇을 어떻게 왜 어떤 것을 근거로 이렇게 예측을 했는지 알 수 없는 알고리즘의 과정을 블랙박스라고 말하기도 합니다.)


그렇다면 Random Forest의 feature_importances를 통해 어떤 특성이 가장 SUV 구매를 할 확률이 올라가는지 확인해보겠습니다.


Feature Importances



결과적으로 나이와 연봉이 제일 큰 영향을 끼쳤습니다. 의외로 성별은 상관이 없었습니다. 


그렇다면 나이와 연봉 두가지 요인이 어떻게 작용해야 SUV를 구매할 확률이 높아질까요?


그러면 지금까지 만든 Random Forest ML을 가지고 테스트 데이터를 통해 SUV 구매 결정 여부를 실제로 예측을 해보겠습니다. 


왼쪽부터 순서대로 나이, 연봉, 여성일 겨우, 남성일 경우입니다. 

각 데이터 숫자를 임의로 정해서 모델에 돌려보았습니다.


                    


정확도 91.25%의 Random Forest ML로 여러 case를 실험해본 결과 

나이가 많고, 소득이 많을수록 SUV를 구매할 확률이 높다는 것을 예측할 수 있었습니다. 

나이와 소득 둘 중 비교하자면 더 큰 요인은 나이입니다.


이 같은 결과를 토대로 SUV 판매 프로모션을 한다면 

연령대가 높고, 연봉이 높은 고객군이 선호하는 연령대에 맞는 프리미엄 서비스 등의 마케팅을 펼치는 전략을 사용하면 sales를 높일 수 있을 것 같습니다.


그렇다면 그 연령대 기준은 몇살부터인지?

만약 50대라면 선호하는 취향, 관심사는 무엇인지? 등등

자세히 파고 들어가자면 끝이 없지만

여기서부터 데이터 인사이트를 가지고 전략을 짜는 건 마케터의 몫이라 할 수 있겠습니다.


여기에 Xgboost ML도 데이터 학습을 통해 만들었으나 Random Forest와 동일한 정확도가 나왔습니다.



구매 결정 여부에 대한 Precision과 Recall이 Random Forest와 차이가 있을 뿐, 전체적인 정확도는 비슷합니다. (Xgboost는 후에 다른 데이터셋으로 ML을 만들 때 다시 설명드리도록 하겠습니다.)


Xgboost가 더 높은 성능을 낼거라 생각했는데 결과는 비슷하네요.

SUV 구매 예측 머신러닝을 해보는 실습시간은 충분히 한 것 같으니 여기서 마치도록 하겠습니다. 


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari