1-17 sklearn DecisionTreeClassifier 의 Gini impurity 계산 사례

View this thread on: d.buzz | hive.blog | peakd.com | ecency.com
·@codingart·
0.000 HBD
1-17 sklearn DecisionTreeClassifier 의 Gini impurity 계산 사례
![noname01.png](https://cdn.steemitimages.com/DQmZZGoGnX3BexwYWQpFqSRjGbkqNAyr2SHXUVnmmHhqeuu/noname01.png)

DecisionTreeClassifier를 사용하는 머신 러닝은 방법론 차원에서 여타의 머신 러닝 기법들과 비교해 볼 때에 가장 간단하다고 볼 수 있다. 워낙 간단하기 때문에 변호사들이나 검사들이 순진한 증인들을 대상으로 유도 신문할 때 즐겨 쓰는 이유가 아닐까? 하지만 머신 러닝 코드로 구현하기 위해서는 오히려 더욱 어렵게 느껴지는 것은 무슨 이유일까?

Setosa, Versicolor, Virginica 각각 50개의 데이터로 구성된 Iris flowers data는 150개 중 70%를 학습 데이터를 사용하여  DecisionTreeClassifier 학습 결과가 위 그림에 나타나 있다. 각 50개로 구성된 합 150개의 70%를 취하면 sample =105 즉 value = [35, 35, 35] 가 된다.

첫 번째 즉 “petal_width(꽃받침 폭) 가 0.75 cm 보다 작은가?“라는 질문을 통해 Setosa를 classification 해 보자. 105개의 petal_width 학습 데이터를 대상으로 if 문에 의해 간단하게 처리 될 수 있다. 우;l 그림을 참조하면 Setosa 는 petal_width 가 0.75 cm 보다 작다는 조건 하나로 깔끔하게 분류가 됨을 알 수 있다.

K개의 class 라벨이 있는 샘플들의 Classification 작업에서 Gini impurity는 다음과 같이 정의 된다. 엔트로피에 비해서는 상대적으로 쉽게 계산이 가능하다.

![noname02.png](https://cdn.steemitimages.com/DQmQNv9QVLzy3qp1iEL9SSGyz9a51KbuSri3tCWeXsZtVSb/noname02.png)

만약 class 즉 샘플의 종류가 3 이라면 K=3이 되며 Gini impurity는 다음과 같이 간략화 된다.

![noname03.png](https://cdn.steemitimages.com/DQmaCpqUbd8Mp8MXMGxXCiaDpYrydFit7oWG1uU4f6LPS9R/noname03.png)

Decision Tree 알고리듬의 특성상 매 단계별 노드에서 binary형 질문을 하지만 현재의 DecisionTreeClassifier에서는 3개의 꽃 종류가 다루어지게 된다. 즉 “petal_width 가 0.75 보다 작은가 아니면 큰가? “ 하지만 105개 샘플 중 이 범위에 들어오는 35개가 Setosa이고(확률 1/3), 35개는 Versicolor이며(확률 1/3), 35개는 Virginica 이다(확률 1/3). 이로부터 Jini impurity를 계산해 보자.

![noname04.png](https://cdn.steemitimages.com/DQmShbgMJUNvKr3ipN4CwTAAfx9erKPpHKtQo9xXeL3qXyC/noname04.png)

gini impurity 계산과 아울러 1단계 classification 이 완료되면 105개([35,35,35])의 데이터가 True 일 때 35개([35,0,0]) 와 False 일 때의 70개([0,35,35])로 분리된다.

![noname05.png](https://cdn.steemitimages.com/DQmc3GBYzHADCXdxWwYRxkuoQTPR9maDjKw48im2gQ2rv55/noname05.png)

True 일 때의 35개 데이터에 대한 gini impurity를 계산해 보자. 35개 전체가 Setosa 일 확률이 1.0 이고 Versicolor 나 Verginica 일 확률이 0.0 이다.

![noname06.png](https://cdn.steemitimages.com/DQmXAzXXPHPfUxNGQP1qut4Ub6dVS8oFSqi9ZQ9LxHqwWoG/noname06.png)

samples = 70, value - [0. 35, 35] 데이터가 넘어오게 되는 False 일 경우의 Jini impurity를 계산해 보자.

![noname07.png](https://cdn.steemitimages.com/DQmNsE9dn8mzMgAGPcBwyDQGuH7rdCeMAeJeRuba3VEygPs/noname07.png)

70개의 sample  데이터 중에서 Versicolor를 분류해 내기 위해서 “petal_length 가 4.75cm 보다 작은가?” 라는 질문을 해보자. 이 질문에 따라서 데이터 파일이 값을 조사하여 보니 Vergicolor 35개 중에서 30개가 만족을 하였다. 
70개 중에서 petal_length 가 4.75cm 보다 작은가? 질문이 True 인 경우 30개 데이타만이 Versicolor 로 확인이 되었고 나머지 samples=40, value=[0, 5, 35] 가 False가 되었다. 이때의 gini impurity를  계산해 보자. Vergicolor일 확률은 (5/40) 이며 Virginica 일 확률은 (35/40) 이 된다.

![noname08.png](https://cdn.steemitimages.com/DQmbU8WpLbBha6vKEVAeiamoEFkHt9kzatHPkRvGX6bCyss/noname08.png)

![noname09.png](https://cdn.steemitimages.com/DQmYTtc4duBfShjYHjkoEUbATQW7z1jD2Sy9vMGyqcjDvMp/noname09.png)

이 단계에서 더욱 세부적으로 나머지 Virginica를 찾기 위해 petal_width 가 1.75cm 보다 작은지 조사를 계속해 나간다.

![noname10.png](https://cdn.steemitimages.com/DQmdmZ4R8pArBYHxX3yCu5Px49k6JwjD7jQtcJmq1Qwk3zX/noname10.png)

이러한 과정을 되풀이 하다보면 항상 gini impurity 값이 0.0 이 되는 영역은 classification 이 완료된 부분이다. 한편 남은 샘플 중에서  gini impurity 가 0.5 인 경우는 2종류의 샘플들이 여전히 섞여 있는 상태이므로 추가로 Decision Tree 작업을 이어나가야 한다.

아래의 Tree 는 4단계 Decision Tree작업의 결과이지만 아직 약간의 Versicolr 와 Viginica 가 조금 남아 있는 상태이다. 결론적으로 말해서 DecisionTreeClassifier 가 중요하긴 하지만 방법론 상 세부적인 결론을 얻어내기엔 시원찮아 보인다.

![noname11.png](https://cdn.steemitimages.com/DQmVzYC4u397944JHu6AwtJtYqKRMwgSaHjCsNS7LtcBtJM/noname11.png)

![마나마인로고.png](https://cdn.steemitimages.com/DQmeePhYx37SUt2zaQJZjJZenWLWSyeK2zKiEp2erB77Lhb/%EB%A7%88%EB%82%98%EB%A7%88%EC%9D%B8%EB%A1%9C%EA%B3%A0.png)
👍 , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,