Python을 이용한 Decision Tree (1)

DT Assignment1

주의사항

  • 본인이 구현한 함수임을 증명하기 위해 주석 꼼꼼히 달아주세요.

  • 이 데이터셋 뿐만 아니라 변수의 class가 더 많은 데이터에도 상관없이 적용 가능하도록 함수를 구현해 주세요.

    변수의 class가 3개를 넘는 경우 모든 이진분류 경우의 수를 따져 보아야 합니다.

    Hint) itertools 라이브러리의 combination 함수 & isin 함수 등이 활용될 수 있으며 이 밖에도 본인의 방법대로 마음껏 구현해주세요.

  • 함수에 들어가는 변수나 flow 등은 본인이 변경해도 무관하며 결과만 똑같이 나오면 됩니다.

우수과제 선정이유

함수마다 잘 작동하는지 확인하는 과정을 거치는 것이 인상적이였습니다.

또한 1번 과제의 3번 문제를 해결할 때 데이터 프레임을 나누는 함수를 만들고 문제에서 요구하는 것보다 한층 더 깊게 살펴보는 모습이 굉장히 좋았습니다.

Data Loading

In [1]:

import pandas as pd 
import numpy as np

In [2]:

pd_data = pd.read_csv('https://raw.githubusercontent.com/AugustLONG/ML01/master/01decisiontree/AllElectronics.csv')
pd_data.drop("RID",axis=1, inplace = True) #RID는 그냥 순서라서 삭제

1. Gini 계수를 구하는 함수 만들기

  • Input: df(데이터), label(타겟변수명)

  • 해당 결과는 아래와 같이 나와야 합니다.

In [3]:

In [4]:

In [5]:

Out[5]:

In [6]:

Out[6]:

In [35]:

Out[35]:

2. Feature의 Class를 이진 분류로 만들기

ex) {A,B,C} -> ({A}, {B,C}), ({B}, {A,C}), ({C}, {A,B})

  • CART 알고리즘은 이진분류만 가능합니다. 수업때 설명했던데로 변수가 3개라면 3가지 경우의 수에 대해 지니계수를 구해야합니다.

  • 만약 변수가 4개라면, 총 7가지 경우의 수가 가능합니다. (A, BCD) (B, ACD) (C, ABD) (D, ABC) (AB, CD) (AC, BD) (AD, BC)

  • Input: df(데이터), attribute(Gini index를 구하고자 하는 변수명)

  • 해당 결과는 아래와 같이 나와야 합니다.

In [7]:

In [48]:

In [61]:

In [59]:

In [60]:

Out[60]:

In [37]:

Out[37]:

3. 다음은 모든 이진분류의 경우의 Gini index를 구하는 함수 만들기

  • 위에서 완성한 두 함수를 사용하여 만들어주세요!

  • 해당 결과는 아래와 같이 나와야 합니다.

  • 결과로 나온 Dictionary의 Key 값은 해당 class 들로 이루어진 tuple 형태로 들어가 있습니다.

In [88]:

In [89]:

Out[89]:

In [39]:

Out[39]:

여기서 가장 작은 Gini index값을 가지는 class를 기준으로 split해야겠죠?

결과를 확인해보도록 하겠습니다.

In [90]:

In [40]:

다음의 문제를 위에서 작성한 함수를 통해 구한 값으로 보여주세요!

문제1) 변수 ‘income’의 이진분류 결과를 보여주세요.

문제2) 분류를 하는 데 가장 중요한 변수를 선정하고, 해당 변수의 Gini index를 제시해주세요.

문제3) 문제 2에서 제시한 feature로 DataFrame을 split한 후 나눠진 2개의 DataFrame에서 각각 다음으로 중요한 변수를 선정하고 해당 변수의 Gini index를 제시해주세요.

In [91]:

Out[91]:

In [94]:

Out[94]:

In [116]:

Age의 Gini Index가 0.35로 가장 적기때문에 가장 중요한 변수이며 그중에서도 'middle_aged'가 Split의 기준이 될 것이다.In [4]:

In [141]:

In [125]:

In [126]:

Out[126]:

age

income

student

credit_rating

class_buys_computer

2

middle_aged

high

no

fair

yes

6

middle_aged

low

yes

excellent

yes

11

middle_aged

medium

no

excellent

yes

12

middle_aged

high

yes

fair

yes

In [127]:

Out[127]:

위에서 만든 함수를 이용해 구한 결과 모두 0이 나와 최적의 상태라 볼 수 있음In [137]:

Out[137]:

age

income

student

credit_rating

class_buys_computer

0

youth

high

no

fair

no

1

youth

high

no

excellent

no

3

senior

medium

no

fair

yes

4

senior

low

yes

fair

yes

5

senior

low

yes

excellent

no

7

youth

medium

no

fair

no

8

youth

low

yes

fair

yes

9

senior

medium

yes

fair

yes

10

youth

medium

yes

excellent

yes

13

senior

medium

no

excellent

no

In [138]:

In [139]:

Student 가 no인지 아닌지에 대한 지니계수가 0.319로 최소임으로 이에 따른 분류가 최적이라는 것을 알 수 있다.In [142]:

In [143]:

Out[143]:

age

income

student

credit_rating

class_buys_computer

0

youth

high

no

fair

no

1

youth

high

no

excellent

no

3

senior

medium

no

fair

yes

7

youth

medium

no

fair

no

13

senior

medium

no

excellent

no

In [144]:

Out[144]:

2번째 좌측(True) 가지에선 Age - youth 조합이 지니계수 0.2로 최적의 변수임을 알 수 있다.In [145]:

Out[145]:

age

income

student

credit_rating

class_buys_computer

4

senior

low

yes

fair

yes

5

senior

low

yes

excellent

no

8

youth

low

yes

fair

yes

9

senior

medium

yes

fair

yes

10

youth

medium

yes

excellent

yes

In [146]:

Out[146]:

2번째 우측(False) 가지에선 'credit_rating', ('fair',) 조합이 지니계수 0.2로 최적의 변수임을 알 수 있다.

Last updated

Was this helpful?