Statistics/ML | Python

머신러닝이 뭐여 8탄 (feat. 의사결정나무, 앙상블, 랜덤포레스트)

clodagh 2023. 2. 18. 21:34

Intro

의사결정나무

  1. 의사결정나무의 개념
  2. 지니계수
  3. 의사결정나무의 실습

앙상블과 랜덤포레스트

  1. 앙상블 모델
  2. 랜덤포레스트
  3. 랜덤포레스트 실습

 

의사결정나무

의사결정나무의 개념

  • 의사결정나무(DecisionTree)는 지도학습의 일종으로 데이터에 있는 패턴을 찾아내고 조건을 통해 데이터를 분할하며 예측하는 모델
  • 조건을 통해 데이터를 분리하여 데이터를 나눌 수 있는 기준이 확립되면 새로운 데이터가 들어왔을 때도 조건을 활용해 데이터를 예측할 수

▶ PetalWidth가 0.8보다 작거나 같지 않으면서,

▶ PetalWidth가 1.75보다 작거나 같지 않으면서,

▶ PetalLegnth가 4.85보다 작거나 같지 않은 데이터

▶ 조건이 충족된 데이터에 virginica가 많다면 모델은 앞으로 해당 조건을 가진 데이터를 virginica로 분류

 

 

의사결정나무의 용어

  • 의사결정나무는 위치에 따라 뿌리마디, 자식마디, 부모마디, 끝마디, 중간마디로 구성
  • 뿌리마디 : 나무구조가 시작되는 마디입니다. 예시에서 1번에 해당합니다. 모든 데이터를 담음
  • 부모마디 : 자식마디를 가지고 있는 마디입니다. 즉, 1번 마디는 2,3번의 부모마디
  • 자식마디 : 부모마디에서 갈라져 나온 마디입니다. 2,3번은 1번 마디의 자식마디
  • 끝마디 : 각 나무줄기에서 마지막에 위치하는 마디입니다. 6,7,8,9 마디가 끝 마디. 끝 마디의 개수만큼 규칙이 생성
  • 중간마디 : 뿌리 마디와 끝마디가 아닌 마디를 중간마디
  • 깊이 : 뿌리마디를 제외하고 끝마디까지 연결된 마디의 개수를 의미. 위의 예시에서는 3의 깊이를 가짐

장점과 단점

장점

  1. 해석이 쉬움
  2. 특성의 중요성 비교가능

단점

  1. 모형이 복잡하면 성능이 떨어짐, 해석어려움
  2. 데이터 변형에 민감

 

지니계수

  • 의사결정나무는 각 마디에서 조건으로 구분하며 뻗어나가는 형태
  • 조건을 통해 데이터를 분리했을 때 순수도가 증가하고, 불순도가 감소하도록 조건을 설정

불순도와 순도

  • 불순도(impurity)는 데이터에 서로 다른 카테고리의 데이터들이 얼마나 섞여있는지를 의미
  • 순도(homogeneity)는 반대로 데이터가 얼마나 섞이지 않고 한가지 종류만 있는지를 의미

→ 따라서 지도학습일수밖에 없음

  • 의사결정나무는 결과값이 같은 데이터끼리 잘 묶일 수 있도록 조건을 생성

지니계수

  • 지니계수(Gini Index)는 불순도를 측정하는 지표
  • 지니계수가 낮을수록 '불순도가 낮다' 즉, 비슷한 데이터들끼리 모여있다는 것을 의미
    • 0~0.5의 값

  • 분리된 노드의 지니계수가 낮을수록 해당 노드에는 잘 분류된 데이터가 있는 것

 

실습

import os
import pandas as pd

data = pd.read_csv('./Student_Performance.csv')

data.head()

# math, reading, writing 특성을 사용하여 preparation 특성을 예측하는 모델을 생성

from sklearn.tree import DecisionTreeClassifier

X = data[['math','reading','writing']]
y = data['preparation']

tree_model = DecisionTreeClassifier(max_depth =3)
tree_model.fit(X,y)

score = tree_model.score(X,y)
score

 


앙상블과 랜덤포레스트

앙상블 모델

  • 하나의 복잡한 알고리즘보다 여러 개의 간단한 모델이 더 강력할 수 있다는 아이디어에서 만들어짐
  • 앙상블 기법은 여러 개의 머신러닝 모델을 만들고 결합하여 정확한 결과를 추출
  • 앙상블 기법의 유형으로는 대표적으로 보팅(Voting)과, 배깅(Bagging)
  • 10 개 미만의 모델을 합침

보팅(좀더 전통적)

  • 보팅을 위해서는 여러 종류의 다른 분류 모델을 사용
  • 같은 데이터를 활용하여 여러 종류의 모델에 적용
  • 보팅은 각각의 모델에 대한 산출된 결과 중에서 가장 많이 나온 결과를 채택

배깅(좀더 최근)

  • 보팅이 각기 다른 모델을 선정하여 학습시켰다면 배깅(Bagging)은 하나의 모델을 다양하게 학습
  • 전체 데이터에서 데이터를 추출하여 여러 개의 데이터 샘플을 생성
    • 무작위(Random)으로 추출하고 추출한 데이터를 다시 뽑을 수 있는 복원추출을 사용
  • 아래 그림에서 모델 1부터 모델 10까지는 사용하는 데이터만 다른 같은 알고리즘
  • 배깅은 수행속도가 비교적 빠르고, 성능이 좋아서 많이 활용
  • 랜덤포레스트(RandomForest)는 배깅과 의사결정 나무(Decision Tree) 모델을 사용하는 방법
    • 랜덤포레스트 = 배깅 X 의사결정나무

코딩엑스

랜덤포레스트

의사결정나무의 한계

  • 학습 데이터를 기반으로 조건을 만들고 데이터를 분류, 새로운 데이터에 일반화하기 어려움
    • 가진 데이터에만 잘 작동하는 모델 X, 새로운 데이터들에도 잘 작동하는 모델을 만들어야함

랜덤포레스트란?

  • 의사결정나무 + 배깅
  • 데이터 샘플을 여러개 만들어 각각의 나무에서 훈련을 시킨 후 결과를 투표 → 결과선택

랜덤포레스트의 장점과 단점

장점

  1. 의사결정나무의 한계점 보완
  2. 결측치에 강함

단점

  1. 계산에 많은 메모리가 필요, 속도가 상대적으로 느림

 

실습

from sklearn.ensemble import RandomForestClassifier

rf_model = RandomForestClassifier()
rf_model.fit(X,y)

score = rf_model.score(X,y)
score