47 의사결정트리 이론 - p.193
데이터들이 가진 속성들로부터 분할 기준 속성을 판별하고 분할 기준 속성에 따라 트리 형태로 모델링하는 분류 예측 모델을 의사결정트리 모델이라고 합니다.
회귀분석, 의사결정트리는 현업에서 선호하는 머신러닝 알고리즘
신경망이 정확도는 훨씬 뛰어난데 의사결정트리를 더 선호하는 경우가 있는 이유는 신경망의 경우 신경망 내부가 블랙박스이다 보니 설명이 안되어서 고객들이 이해를 못하는 경우가 많음. 의사결정트리와 회귀분석은 설명이 가능해서 왜 이렇게 기계가 분류하고 예측을 했는지 설명할 수 있음. 그래서 더 선호하는 분류모델.
> 물고기가 정답컬럼
> 수중과 지느러미는 독립변수인 컬럼
ㅇ의사결정트리는 어떻게 만들어지는가?
1. 정보획득량이 높은 컬럼을 선별하고 그 컬럼을 먼저 물어봄
2. 물어보면서 자식노드로 내려올 때 데이터의 분류가 점점 명확해져야 되므로 부모 노드 때보다 자식 노드때의 데이터가 더 불순도(entropy)가 낮아져야 함. 점점 순도가 높아지게끔 가지를 치고 내려오면서 데이터를 분류하는 것.
순수도? 목표변수(정답)의 특정범주에 개체들이 포함되어져 있는 정도 (관심범주 o, 관심범주 x)
부모 노드의 순수도에 비해서 자식 노드들의 순수도가 증가하도록 자식 노드를 형성해 나가면서 의사결정트리를 만듦니다.
불순도(entropy)의 공식? - p.202
정보획득량의 공식? - p.203
정보획득량 = 분할 전 엔트로피 - 분할 후 엔트로피
여기서 0.95는 분할 전 엔트로피
이제 분할 후 엔트로피를 구해보자
정보획득량 = 분할 전 엔트로피 - 분할 후 엔트로피 = 0.95 - 0.75 = 0.2
# python
import math
-3/5 * math.log2(3/5) - 2/5 * math.log2(2/5)
분할 전 엔트로피 = 0.9709505944546686
분할 후
= 3/5*(- 3/3 * math.log2(3/3) - 0/3 * math.log2(0/3)) + 2/5*( - 2/2 * math.log2(2/2) - 0/2 * math.log2(0/2))
3/5*(-1 * math.log2(1)) + 2/5*( - 1 * math.log2(1))
분할 후 엔트로피 = 0
정보획득량 = 0.97 - 0 = 0.97
ㅇ 화장품 구매에 영향을 크게 미치는 변수(컬럼)이 무엇인지 정보획득량을 구하시오.
데이터 : skin.csv
# 1. 데이터 로드
skin <- read.csv("c:\\data\\skin.csv")
head(skin)
# 2. 정보획득량 구하기
install.packages("FSelector")
library(FSelector)
wg <- information.gain(cupon_react ~ ., skin, unit = 'log2')
wg
> information.gain(정답컬럼 ~ 모든컬럼(.), 데이터 프레임명, unit = 'log2')
> 출력결과
attr_importance
cust_no 0.00000000
gender 0.06798089
age 0.00000000
job 0.03600662
marry 0.18350551
car 0.02487770
결혼유무(marry)가 정보획득량이 제일 높게 나타나고 있음
문제264. 지방간을 일으키는 원인 중에서 가장 큰 영향력을 보이는 요인이 무엇인지 정보획득량을 구해서 알아내시오.
데이터 : fatliver2.csv
# 1. 데이터 로드
fat <- read.csv("c:\\data\\fatliver2.csv")
head(fat)
# 2. 정보획득량 구하기
library(FSelector)
fliver <- information.gain(FATLIVER ~ ., fat, unit = 'log2')
fliver
attr_importance
AGE 0.032256902
GENDER 0.028650604
DRINK 0.012189492
SMOKING 0.009812076
나이가 정보획득량이 가장 높음.
ㅇ 정보획득량을 파이썬 판다스로 구하기
1. 데이터 로드
# python
import pandas as pd
skin = pd.read_csv("c:\\data\\skin.csv")
skin
2. skin데이터 프레임에서 정답 컬럼인 coupon_react컬럼의 데이터만 x라는 변수에 담기
x = skin['cupon_react']
x
3. 구매여부와 결혼유무와의 정보획득량을 구하기 위해 확률을 판다스의 crosstab함수를 이용해 결과를 출력하시오.
ct = pd.crosstab(x, skin['marry'], margins = True)
ct
4. 위의 ct데이터 프레임에서 데이터를 추출해서 분할 전 엔트로피를 구하기 위한 데이터를 before라는 리스트에 넣으시오.
데이터프레임명.loc[ 행이름, 열이름]
# before = [17/30, 13/30] <- 우리가 만들어야 하는 것
ct.loc['NO','All'] #17
ct.loc['YES','All'] #13
ct.loc['All','All'] #30
before = []
for i in ['NO','YES']:
before.append(ct.loc[i,'All']/ct.loc['All','All'])
before
# 한줄 for문으로 작성 가능
before = [ct.loc[i,'All']/ct.loc['All','All'] for i in ['NO','YES']]
before
[0.5666666666666667, 0.43333333333333335]
문제265. 분할전 엔트로피를 구하기 위한 데이터를 before에 넣었습니다. 이번에는 분할 후 엔트로피를 구하기 위한 데이터를 after에 아래와 같이 넣으시오.
before = [17/30, 13/30]
after = [9/10, 1/10, 8/20,12/20]
after = []
col = ['NO','YES']
for i in col:
for k in col:
after.append(ct.loc[k,i]/ct.loc['All',i])
'Study > class note' 카테고리의 다른 글
머신러닝 / 파이썬으로 의사결정트리 모델 만들기 (0) | 2022.02.09 |
---|---|
머신러닝 / R로 의사결정트리 모델 구현하기 (0) | 2022.02.08 |
머신러닝 / 나이브베이즈 복습 (0) | 2022.02.07 |
머신러닝 / 파이썬으로 나이브 베이즈 모델 생성하기 (0) | 2022.02.04 |
머신러닝 / 나이브베이즈 예제 연습 (0) | 2022.02.04 |