close_btn
조회 수 704 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print Files
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print Files

<DT 구현>

Data Loading


1
2
3
4
5
6
import pandas as pd 
import numpy as np
 
pd_data = pd.read_csv('https://raw.githubusercontent.com/AugustLONG/ML01/master/01decisiontree/AllElectronics.csv')
pd_data.drop("RID",axis=1, inplace = True) #RID는 그냥 순서라서 삭제
pd_data
cs



1. Gini 계수에 대한 함수 만들기


1
2
3
4
5
6
7
8
9
10
11
12
13
def get_gini(df, label):
    aa = df[label].value_counts()  #label 분포 
    a_class = aa.index   #label 클래스 
    a_counts = aa.values #클래스 각각의 개수 
    mother = a_counts.sum()  #전체 개수
    
    gini = 1
    for value in a_counts:  #gini계수 공식
        gini -= (value/mother)**2
    return gini   
 
get_gini(pd_data, "age")  #0.663265306122449
get_gini(pd_data,'class_buys_computer')  #0.4591836734693877
cs




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

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


1
2
3
4
5
6
7
8
def get_power_set(s):
    power_set=[[]]
    for elem in s:  #하위 집합 루프
        for sub_set in power_set:  #나머지 하위집합 포함하는 새로운 집합 추가
              power_set=power_set+[list(sub_set)+[elem]]   
    return power_set
 
get_power_set(pd_data.age.unique())
cs


1
2
3
4
5
6
7
8
9
def get_binary_split(df, attribute):
    result = []
    cl = get_power_set(df[attribute].unique())  #feature들에 대해서 부분집합 만들기
    cl.pop()  #처음과 끝 집합(공집합, 전체집합) 삭제
    cl.pop(0)
    result = cl
    return result
 
get_binary_split(pd_data,"age")



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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def get_attribute_gini_index(df, attribute, label):
    result = {}
    binarysplit = get_binary_split(df, attribute) #이진분류
    gini_1 = gini_2 = None
    for i in range(len(binarysplit)):
        if len(binarysplit[i]) == 1 :  #분류한 집합 중 원소가 하나 있을 경우 ex) 4 -> (2,2) (1,3) 에서 1
            gini_1 = get_gini(df[df[attribute] == str(binarysplit[i][0])], label)  #분류한 집합 원소에 해당하는 데이터 gini계수 구하기
            gini_2 = get_gini(df[df[attribute] != str(binarysplit[i][0])], label)  #나머지 데이터 gini 계수 구하기
            nrow = df[df[attribute] == binarysplit[i][0]].shape[0]  #아래 result를 구할 때 사용하기 위해 나뉜 후 데이터 개수 저장! 
        elif len(binarysplit[i]) > 1:  #분류한 집합 중 원소가 하나 이상 있을 경우 ex) 4 -> (2,2) (1,3) 에서 2나 3
            a = binarysplit[i]
            d1 = pd.DataFrame()
            for k,j in enumerate(a):  #집합 원소들을 클래스로 가지는 데이터 분류 (원소가 2개 이상이기 때문에 데이터 아래로 붙히기)
                d = df[df[attribute] == j]
                d1 = pd.concat([d1,d])
            d2 = pd_data.drop(d1.index)  #나머지 데이터
            gini_1 = get_gini(d1, label)  #위에서 만든 데이터로 gini계수 구하기
            gini_2 = get_gini(d2, label)  
            nrow = d1.shape[0]   #역시 result를 구할 때 사용하기 위해 나뉜 후 데이터 개수 저장!
            binarysplit[i] = (binarysplit[i][0+ "_" + binarysplit[i][1]).split()  #원소가 2개 이상('youth','senior')일 때 "youth_senior"처럼 한 단어로 이름 변경
        result[binarysplit[i][0]] = (nrow/df.shape[0])*gini_1 + (1-(nrow/df.shape[0]))*gini_2  #최종 gini계수 dictionary형태로 저장 
    return result
 
get_attribute_gini_index(pd_data, "age""class_buys_computer")
min(get_attribute_gini_index(pd_data, "age""class_buys_computer").items())  #가장 작은 값으로 분류해야 함!


cs




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

문제1) income의 이진분류를 얻는 함수 get_binary_split(pd_data, "income")을 통해 보여주세요.


1
get_binary_split(pd_data, "income")
cs

문제2) 가장 Gini계수가 높은 Feature 즉 분류를 하는데 가장 중요한 변수를 선정하시고 get_attribute_gini_index함수를 통해 Gini index를 제시해주세요.


1
2
3
4
5
ginis = {'age':min(get_attribute_gini_index(pd_data, "age""class_buys_computer").values()),  #분류하는 데 가장 중요한 변수 선정
         "income":min(get_attribute_gini_index(pd_data, "income""class_buys_computer").values()),
         'student': min(get_attribute_gini_index(pd_data, "student""class_buys_computer").values()),
        "crdit_rating": min(get_attribute_gini_index(pd_data, "credit_rating""class_buys_computer").values())}
print(min(ginis),ginis[min(ginis)])
cs

문제3) 2에서 구한 Feature로 DataFrame을 분류 해주시고 나눠진 2개의 클래스에서 각각 다음으로 중요한 Feature를 선정해주시고 Gini index를 제시해주세요.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
##문제3
data1 = pd_data[pd_data["age"]=="middle_aged"]  #데이터 분류
data2 = pd_data[pd_data["age"]!="middle_aged"]
 
ginis1 = {"income":min(get_attribute_gini_index(data1, "income""class_buys_computer").values()),  #가장 작은 gini계수와 해당 feature 찾기
         'student': min(get_attribute_gini_index(data1, "student""class_buys_computer").values()),
        "credit_rating": min(get_attribute_gini_index(data1, "credit_rating""class_buys_computer").values())}
ginis2 = {'age':min(get_attribute_gini_index(data2, "age""class_buys_computer").values()),
         "income":min(get_attribute_gini_index(data2, "income""class_buys_computer").values()),
         'student': min(get_attribute_gini_index(data2, "student""class_buys_computer").values()),
        "credit_rating": min(get_attribute_gini_index(data2, "credit_rating""class_buys_computer").values())}
 
print(min(ginis1.items(), key=lambda x: x[1]))
print(min(ginis2.items(), key=lambda x: x[1]))
cs

List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 우수 코드 게시판 이용 관련 공지사항 DataMarket 2014.05.21 40434
148 투빅스 10기&11기 7주차 CNN (Alexnet) - 11기 심은선 file 심은선 2019.03.15 582
147 투빅스 10기&11기 7주차 - NLP - 11기 유기윤 file 유기윤 2019.03.14 571
146 투빅스 10기&11기 6주차 Advanced Neural Network - 11기 김대웅 file 김대웅 2019.03.12 545
145 투빅스 10기&11기 4주차 Algorithm - 10기 정윤호 UNOVATE 2019.03.04 529
144 투빅스 10기&11기 4주차 ML Performance Tuning - 11기 김대웅 김대웅 2019.02.22 545
143 투빅스 10기&11기 4주차 PCA - 11기 임채빈 임채빈 2019.02.22 651
142 투빅스 10기&11기 3주차 Clustering - 11기 한재연 file 한재연 2019.02.16 581
» 투빅스 10기&11기 3주차 Decision Tree - 11기 김유민 file 2019.02.15 704
140 투빅스 10기&11기 3주차 Clustering - 11기 김대웅 file 김대웅 2019.02.15 582
139 투빅스 10기&11기 3주차 Algorithm - 11기 한재연 file 한재연 2019.02.15 558
138 투빅스 10기&11기3주차 앙상블(Kaggle HousePrice) - 11기 이소라 file 소라찌 2019.02.15 592
137 투빅스 10기&11기 2주차 SVM, Naive Bayes, KNN - 11기 유기윤 file 유기윤 2019.02.02 825
136 투빅스 10기&11기 2주차 SVM, Naive Bayes, KNN - 11기 김대웅 file 김대웅 2019.01.31 897
135 투빅스 10기&11기 1주차 Algorithm - 11기 한재연 1 file 한재연 2019.01.31 1182
134 투빅스 10기&11기 1주차 Algorithm - 11기 권혜민 file 권혜민 2019.01.31 1017
133 투빅스 10&11기 1주차 Linear Regression - 11기 유기윤 file 유기윤 2019.01.24 825
132 투빅스 10&11기 1주차 Regression - 11기 강수민 file 수민 2019.01.24 1702
131 투빅스 10&11기 1주차 Logistic Regression - 11기 김대웅 file 김대웅 2019.01.23 946
130 투빅스 9&10기 8주차 CNN - 10기 장유영 장유영 2018.09.20 2861
129 투빅스 9기&10기 7주차 알고리즘 - 10기 이민주 file 이민주 2018.09.18 2301
Board Pagination ‹ Prev 1 2 3 4 5 6 7 8 ... 9 Next ›
/ 9

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5