DT_Assignment2.ipynb 파일에 있는 두가지 함수를 만들어 주시면 됩니다. 결과는 주어져 있습니다.
두번째 함수는 출력값이 꼭 주어진 형태와 일치할 필요는 없습니다. 봤을 때 각 변수에 대한 Gain을 알아볼 수 있도록 구성해 주세요.
마찬가지로 주석 꼼꼼히 달아주세요!
우수과제 선정이유
코드 한줄한줄 주석을 굉장히 자세하게 정성스레 적어주셔서 다른 분들이 참고하기 좋기 때문에 우수과제로 선정되었습니다.
import pandas as pd import numpy as npdf = pd.read_csv('https://raw.githubusercontent.com/AugustLONG/ML01/master/01decisiontree/AllElectronics.csv')df.drop("RID",axis=1, inplace =True)#RID는 그냥 Index라서 삭제
In [2]:
df
Out[2]:
age
income
student
credit_rating
class_buys_computer
0
youth
high
no
fair
no
1
youth
high
no
excellent
no
2
middle_aged
high
no
fair
yes
3
senior
medium
no
fair
yes
4
senior
low
yes
fair
yes
5
senior
low
yes
excellent
no
6
middle_aged
low
yes
excellent
yes
7
youth
medium
no
fair
no
8
youth
low
yes
fair
yes
9
senior
medium
yes
fair
yes
10
youth
medium
yes
excellent
yes
11
middle_aged
medium
no
excellent
yes
12
middle_aged
high
yes
fair
yes
13
senior
medium
no
excellent
no
함수 만들기
In [3]:
import mathdefgetEntropy(df,feature) :''' 채우세요! 데이터프레임 df에서 특정 feature에 대한 엔트로피를 구하는 함수입니다. ''' unique =list(df[feature].unique())# df[feature]에 존재하는 값들을 받아내기 위해#unique를 사용해서 그걸 리스트로 받았고 entropy =0for i inrange(len(unique)): p =len(df[df[feature].str.contains(unique[i])])/len(df[feature])#각각yes일때와 no일때를 unique로 받은 리스트를 통해 p를 구했습니다 entropy = entropy - p*math.log(p,2)#엔트로피 식을 이용해 for문 돌리면서 계속 -로 빼가는 방식으로 함수를 만들었습니다return(entropy)
In [4]:
getEntropy(df, "class_buys_computer")
Out[4]:
0.9402859586706309
In [5]:
defgetGainA(df,feature) : info_D =getEntropy(df, feature)# 목표변수 Feature에 대한 Info(Entropy)를 구한다. columns =list(df.loc[:, df.columns != feature])# 목표변수를 제외한 나머지 설명변수들을 리스트 형태로 저장한다.''' 채우세요! 데이터프레임 df에서 feature을 목표변수로 삼고 나머지 각 변수들의 Gain을 구하는 함수입니다. 결과는 Key = 변수명, Value = Information Gain 으로 이루어진 Dictionary 여야 합니다. 미리 주어진 3줄은 문제풀이에 도움을 주기 위해 주어졌으나, 무시하고 각자 원하는 방법으로 풀으셔도 전혀 무방합니다. ''' gains =[]for i in columns: info_Di =0 unique =list(df[i].unique())#각 column에 존재하는 값들을 받기위해 unique함수를 사용했고#unique라는 변수로 list를 저장했습니다for j inrange(len(unique)): new = df.loc[df[i]== unique[j]]#for문을 돌리면서 그 값을 가지는 row들만 뽑아낸 new변수를 만들었습니다 info_Di += (len(new[i])/len(df[i])) *(getEntropy(new, feature))#위에서 만든 entropy함수를 사용해 각각의 entropy를 구하고 확률에 곱한걸 더해서 info_di값을 구합니다 gain = info_D - info_Di#infoD에서 infoDI를 빼서 gain을 얻습니다 gains.append(gain) result =dict(zip(columns,gains))# 각 변수에 대한 Information Gain 을 Dictionary 형태로 저장한다.return(result)
my_dict =getGainA(df, "class_buys_computer")deff1(x):return my_dict[x]key_max =max(my_dict.keys(), key=f1)print('정보 획득이 가장 높은 변수는',key_max, "이며 정보 획득량은", my_dict[key_max], "이다.")
정보 획득이 가장 높은 변수는 age 이며 정보 획득량은 0.2467498197744391 이다.