머신러닝 & 딥러닝
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. 패키지 설치
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
본 내용은 아이티윌 '빅데이터&머신러닝 전문가 양성 과정' 을 수강하며 작성한 내용입니다.