머신러닝 & 딥러닝

3. [지도학습] 의사결정트리 (Decision Tree)

김초송 2023. 3. 17. 14:31

의사결정 트리 (Decision Tree)

  • 데이터들이 가진 속성들로 부터 분할 기준 속성을 판별하고
    분할 기준 속성에 따라 트리 형태로 모델링하는 분류 예측 모델
  • 의사결정 규칙을 나무 모양으로 나타내어 전체 자료를 몇 개의 소집단으로 분류하거나 예측을 수행하는 기법
  • 데이터 사이에 존재하는 패턴을 예측 가능한 규칙들의 조합으로 나타내는 알고리즘
머신러닝 알고리즘 관련 수학 이론
KNN 유클리드 거리 계산 공식
naive bayes (나이브 베이즈) 나이브 베이즈 확률 공식
decision tree (의사결정 트리) 정보획득량

 

엔트로피

  • 우선순위를 정하는 확률

엔트로피 공식

 

 

 

 

 

엔트로피 높음

 

 

 

 

 

 

 

 

 

엔트로피 낮아짐

 

 

 

 

  • 전체 엔트로피에서 컬럼별로 분할했을 때 엔트로피를 빼면 정보 획득량을 알 수 있음
  • 정보 획득량 = 분할 전 엔트로피 - 분할 후 엔트로피
  • 정보 획득량(0에서 1 사이 값)이 1에 가까울 수록 중요한 특성
  • 정보 획득량이 높을 수록  의사결정트리 모델을 생성할 때 상단에 위치하는 질문
skin <- read.csv("/content/skin.csv")
skin

# FSelector 패키지 다운로드
install.packages("FSelector", lib = .libPaths()[1])
library(FSelector)

information.gain( cupon_react ~  .  ,  skin,  unit='log2' ) 
                               
# cust_no	0.00000000
# gender	0.06798089       <---  2등 
# age	0.00000000
# job	0.03600662       <---  3등 
# marry	0.18350551          <--- 1등 
# car	0.02487770         <--- 4등
  • information.gain( 종속변수 ~  .  ,  데이터 프레임명,  unit='로그함수') 
    . = 모든 컬럼

 

R 로 의사결정나무 구현

  1. 패키지 설치
  2. 데이터 로드
  3. 결측치 확인
  4. 훈련 / 테스트 데이터 분리
  5. 의사결정나무 모델 생성 
  6. 결과 예측
  7. 모델 성능 측정
  8. 모델 성능 개선
# 화장품 구매 고객 데이터의 구매여부에 대한 머신러닝 모델을 생성

# 1. 패키지 설치
install.packages("C50", lib = .libPaths()[1])

# 2. 데이터 로드 (문자형 팩터형으로 변환)
skin <- read.csv("C:/Data/skin.csv", stringsAsFactors = TRUE)
skin

# 3. 결측치 확인
colSums(is.na(skin))

# 4. 훈련 / 테스트 데이터 분리
install.packages("caret", lib = .libPaths()[1])
library(caret)
set.seed(1)

# 훈련데이터 index 번호
train_num <- createDataPartition(skin$cupon_react, p=0.8, list=F)
train_num

train <- skin[train_num, ]
test <- skin[-train_num, ]

nrow(train)
nrow(test)
prop.table(table(train$cupon_react))
prop.table(table(test$cupon_react))

# 5. 의사결정나무 모델 생성 
library(C50)
model <- C5.0(train[ , c(-1, -7)], train[, 7])
summary(model)

# 시각화 : 결혼여부가 가장 중요
plot(model)

# 6. 결과 예측
# predict(모델명, 테스트 데이터)
prediction <- predict(model, test[, c(-1, -7)]) # 고객번호, 정답 제외
prediction

# 7. 모델 성능 측정
sum(prediction == test[, 7]) / nrow(test) * 100

# 8. 모델 성능 개선 - 랜덤 포레스트
prediction2 <- predict(model, test[, c(-1, -7)], trails=5)
prediction2
sum(prediction2 == test[, 7]) / nrow(test) * 100
  • C50 : 엔트로피 알고리즘
    • 엔트로피 공식으로 정보획득량을 이용해서 의사결정나무를 생성하는 알고리즘
    • 불순도(엔트로피) 측정 측도
    • 이산형 : 지니지수
      연속형 : 이진분리
  • caret : 훈련 데이터와 테스트 데이터 분리 함수 패키지
  • set.seed(1) : 랜덤 시드값을 같은 숫자로 지정하면 항상 같은 결과값 리턴
  • train[ , c(-1, -7)] : [ 행, 열 ] - 고객번호와 정답은 제외
  • 결혼여부가 나머지 컬럼보다 정보획득량 (분할 전 엔트로피 - 분할 후 엔트로피) 가 가장 높음
  • trails : 분류 나무 갯수
    의사결정나무 모델의 하이퍼 파라미터 = trails

 

랜덤 포레스트 (Random Forest)

  • 의사결정나무 (분류 나무 1개) -> 랜덤 포레스트 (분류 나무 여러 개)
  • 여러 개의 분류 나무들이 다수결로 예측
  • 부트스트래핑 기반 샘플링을 활용한 의사결정나무 생성 이후 배깅 기반 나무들을 모아 앙상블 학습하여 숲을 형성
  • 데이터 갯수가 작아도 학습이 잘 됨

 

파이썬으로 랜덤 포레스트 구현

# 1. 패키지 설치
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from sklearn.ensemble import RandomForestClassifier

# 2. 데이터 로드
iris = pd.read_csv("C:/Users/itwill/seaborn-data/iris.csv")
iris.head()
 
# 3. 결측치 확인
iris.isnull().sum()

# 4. 독립변수와 종속변수로 분리
x = iris.iloc[:, :-1]
y = iris.iloc[:, -1]

# 5. 데이터 숫자로 변환

# 6. 훈련 데이터 / 테스트 데이터 분리
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.1, random_state=1)
print(x_train.shape, x_test.shape, y_train.shape, y_test.shape)

# 7. 최대최소 정규화
scaler = MinMaxScaler()
scaler.fit(x_train)
x_train2 = scaler.transform(x_train)
x_test2 = scaler.transform(x_test)

#8. 모델 생성
model = RandomForestClassifier(n_estimators=5, random_state=1)

#9. 모델 훈련
model.fit(x_train2, y_train)

#10. 모델 예측
iris_predict = model.predict(x_test2)

#11. 모델 평가 
sum(iris_predict == y_test) / len(y_test) * 100

 

본 내용은 아이티윌 '빅데이터&머신러닝 전문가 양성 과정' 을 수강하며 작성한 내용입니다.