def get_gini(df, label):
D_len = df[label].count() # 데이터 전체 길이
# 각 클래스별 Count를 담은 Generator 생성
count_arr = (value for key, value in df[label].value_counts().items())
# reduce를 이용해 초기값 1에서 각 클래스 (count / D_len)^2 빼기
return reduce(lambda x, y: x - (y/D_len)**2 ,count_arr,1)
In [5]:
pd_data['class_buys_computer']
Out[5]:
0 no
1 no
2 yes
3 yes
4 yes
5 no
6 yes
7 no
8 yes
9 yes
10 yes
11 yes
12 yes
13 no
Name: class_buys_computer, dtype: object
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]:
import itertools
In [48]:
import itertools # 변수의 모든 클래시 조합을 얻기 위해 itertools 불러오기
def get_binary_split(df, attribute):
attr_unique = df[attribute].unique()
# 이중 For loop List Comprehension
result = [
list(item)
for i in range(1, len(attr_unique)) # 1부터 변수의 클래스 갯수-1 까지 Iteration
for item in itertools.combinations(attr_unique, i) # i를 길이로 하는 조합 생성
]
return result
In [61]:
# 검증을 위한 테스트데이터 제작
df = pd.DataFrame([1,2,3,4,2,1,3], columns=['d'])
print(df['d'].unique())
a = get_binary_split(df,'d')
[1 2 3 4]
In [59]:
# get_binary_split 검증, 짝을 찾아 전체 클래스가 나오는지 확인
for i in range(len(a) // 2):
b = a[i] + a[len(a)-i-1]
b.sort()
print(a[i], a[len(a)-i-1], '=>', b)
Age의 Gini Index가 0.35로 가장 적기때문에 가장 중요한 변수이며 그중에서도 'middle_aged'가 Split의 기준이 될 것이다.In [4]:
##문제3 답안
In [141]:
# Split 함수 생성
def split_by_vals(attr, vals, df=pd_data):
t_index = pd_data[attr].map(lambda x: x in vals)
# Index 에 따라 DF 분리
return df[t_index], df[~t_index]
In [125]:
# 기준에 따라 데이터프레임 2개 생성
df_split_t, df_split_f = split_by_vals('age',('middle_aged',))
Student 가 no인지 아닌지에 대한 지니계수가 0.319로 최소임으로 이에 따른 분류가 최적이라는 것을 알 수 있다.In [142]:
# df_split_f 가지에서 한 번 더 분류 시도
df_split2_t, df_split2_f = split_by_vals(s_attr, s_vals, df=df_split_f)
/Users/josang-yeon/tobigs/lib/python3.7/site-packages/ipykernel_launcher.py:5: UserWarning: Boolean Series key will be reindexed to match DataFrame index.
"""