brunch

You can make anything
by writing

C.S.Lewis

by 스토너 Dec 05. 2022

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

의사결정나무(DecisionTree), 교차 검증, Grid Search

오랜만에 캐글의 SUV 데이터 분석 글을 들고 왔습니다.


이미 예전에 분류 예측 ML을 돌리고 정확도를 비교해보았는데 글은 한참 후에나 올리네요.


다시 전에 공부했던 기억을 되살려 복습을 해보려고 합니다.


DecisionTree, xgboost, randomforest, PCA 등의 머신러닝 모델을 돌려봤지만

각각의 ML성능은 차이가 있었습니다.


ML뿐만 아니라 교차 검증의 유무, 하이퍼 파라미터를 조정하는 그리드서치 적용 유무

또 필요없는 독립변수를 제거하는 차원축소(PCA)을 적용했는지 등에 따라 차이가 있었습니다.


우선 ML중에서도 의사결정나무(DecisionTree) ML을 적용해보았습니다.



출처: https://heartbeat.comet.ml/ 



의사결정나무(DecisionTree)는 분류와 회귀 분석에 모두 사용되는 모델입니다.


여러 개의 독립변수 중 하나의 독립변수를 정하여 전체 데이터 집합(부모 노드)를 기준값을 정하여 기준값보다 작은 데이터 그룹(자식노드1)와 기준값보다 큰 데이터 그룹(자식노드2)로 나눕니다.


각각의 부모 노드와 자식 노드를 통해 분할을 반복하여 하위의 자식노드를 만들내면서 부모 노드와 자식 노드의 불순도 차이를 계산하여 정보이득이 최대가 되도록 데이터를 나눕니다.

가지치기(prunin)를 하여 대상의 범위를 좁혀 나가는 알고리즘입니다.


노드는 훈련 데이터의 특성에 대한 테스트를 표현하는 것으로 하나의 노드 당 2개의 가지를 가집니다. 가지는 테스트의 결과인 True or False를 나타냅니다.


그 모양이 나무를 뒤집어놓은 것과 비슷 같다고 해서 의사결정나무라고 한다.


그렇다면 노드를 나누는 기준값은 무엇일까요? gini 불순도와 엔트로피 불순도를 사용하는데요. 

(criterion 매개변수를 gini로 지정하거나 entropy를 지정할 수 있습니다.) 


쉽게 말하면 불순도는 순도의 반댓말이죠. 불확실성을 최소화한다고 이해하면 됩니다. 정답을 찾아나간다라는 표현보다는 좀 더 보수적입니다. 


gini불순도와 entrophy불순도를 구하는 복잡한 식을 직접 계산하지 않고 사이킷 런(sklearn) 패키지를 사용해 알고리즘을 적용해볼 수 있다는 것이 파이썬의 매력이 아닌가 싶습니다.


gini impurity를 구하는 식



library import



훈련/검증/테스트 data set 분류하기


SUV 데이터셋에는 총 5개의 변수가 있습니다. 우리는 여기서 나이, 연봉, 여성, 남성 중 어느 요인이 SUV차량을 구매할지에 대한 여부를 분류하여 예측하는 ML을 만들 것이기 때문에 각각 독립변수와 종속변수를 설정해주어야 합니다.


먼저 독립변수를 각각 나이(Age), 연봉(EstimatedSalary), 여성(Gender_Female), 남성(Gender_Male)을 설정하여 data 변수로 묶습니다.  


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


DecisionTree의 경우 각 변수를 배열로 변환해야 하는 과정을 거쳐야 합니다.

(random forest와 xgboost는 자체적으로 배열로 변환하여 계산해주기 때문에 생략가능합니다.)


data와 target을 훈련(train data), 테스트(test data) 셋을 나눕니다. 

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



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


교차 검증을 위해 훈련 셋(train data)에서 20% 떼어내 검증 셋을 만듭니다. 




교차 검증 후 ML 학습 


검증 후 DecisionTree 학습을 시킵니다.



모델 정확도가 0.87% 가 나왔습니다.



교차검증, 그리드 서치 후 ML 학습


이번에는 교차검중 후 최적의 하이퍼파라미터를 고르는 그리드 서치를 적용해보려고 합니다.


하이퍼 파라미터는 min_impurity_decrease와 max_dapth, min_samples_split 3개의 변수에만

np.arange함수와 range함수로 범위를 설정했습니다. 


min_impurity_decrease : 최소 불순도
max_dapth : 트리 깊이(값이 클수록 복잡도가 올라감)
min_samples_split : 자식 노드를 분할하는데 필요한 최소 샘플 수



max_depth는 트리 깊이를 뜻하는 것이라 했죠. range(5, 20, 1)의 뜻은 트리의 깊이를 5부터 20까지 1씩 증가하는 숫자를 ML에 일일이 대입해서 가장 정확도 높은 하이퍼파라미터를 찾아내라는 명령입니다.


min_samples_split 도 마찬가지입니다. ML 패키지가 발전했기에 우리는 일일이 수학적으로 모두 계산해서 답을 구해낼 필요가 없습니다. 컴퓨터가 대신 계산해주니까요.



그리드 서치가 최적의 파라미터 범위를 찾아 도출해냅니다. n_jobs=1로 파라미터를 조정하니 ascii오류가 발생했으나 dask를 삭제했더니 오류가 해결됐습니다.


최적의 하이퍼 파라미터를 print로 찍어보니 min_impurity_decrease는 0.0001,  max_depth는 5,

 min_samples_split는 12가 나왔습니다.



정확도 결과


도출한 그리드 서치 결과로 검증 데이터로 정확도 90%가 나왔네요.

그리드 서치를 적용하니 교차검증만 적용했을 때보다 0.125%가 높았습니다.


의사결정나무는 독립변수가 종속변수에 미치는 요인을 다른 ML에 비해 어느정도 투명하게 보여준다는 점과 성능이 좋다는 장점이 있지만 특정 데이터에 과적합(overfitting)되는 문제가 있습니다.


다음엔 의사결정나무 ML의 예측 성능을 보완한 random forest와 Xgboost 학습을 시킨 후

정확도를 비교해보도록 하겠습니다.

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