이 데이터셋 뿐만 아니라 변수의 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]:
from functools import reduce
In [4]:
defget_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 빼기returnreduce(lambdax, 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 불러오기defget_binary_split(df,attribute): attr_unique = df[attribute].unique()# 이중 For loop List Comprehension result = [list(item)for i inrange(1, len(attr_unique))# 1부터 변수의 클래스 갯수-1 까지 Iterationfor 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 inrange(len(a) //2): b = a[i]+ a[len(a)-i-1] b.sort()print(a[i], a[len(a)-i-1], '=>', b)
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.
"""