본문 바로가기
Archive/데이터 분석 관련

[Data] 분류 알고리즘 - Decision Tree, Random Forest

by 다람이도토리 2021. 6. 1.

분류 문제의 개요

머신러닝 문제, 그 중 지도학습 문제중 하나인 분류 문제는 주어진 데이터가 어느 클래스에 속할 것인지를 예측해야 하는 문제이다. 이진 분류 문제일수도 있고 여러 개의 클래스로 분류할수도 있다.

 

분류 문제의 지표

분류 문제에서는, 얼마나 틀렸나? 를 확인하면 될 것이다. 즉 원하는 클래스가 아닌 다른 클래스로 배치되는 정도를 지표로 만들면 될 것이다. 이를 불순도 지표라고 한다.

불순도 지표에는 여러가지 예시가 있는데 대표적으로는 엔트로피, 지니불순도, 분류 오차가 있다.

엔트로피

만일 분류가 100% 정확하게 분류되어서, 엔트로피 값은 0이 되나, class가 2개의 샘플에 1 : 1로 동일하게 분포될 경우 엔트로피가 1의 값을 가지게 된다.

지니 불순도

잘못 분류될 확률을 최소화 시키기 위한 기준으로 여사건을 활용하는 방법이다.
만일 class가 2개의 샘플에 1 : 1로 동일하게 분포될 경우 지니 불순도가 0.5로 최대가 된다.

Decision Tree

scikit-learn의 Decision Tree는 스무고개와 비슷한 원리로, True/False를 바탕으로 데이터를 분류한다.

Iris data를 통해 결정트리의 예시를 확인해본다.

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier

iris = load_iris()

X = iris['data']
y = iris['target']
decision_tree = DecisionTreeClassifier(random_state = 0, 
                                      max_depth=4, 
                                      criterion='gini')
decision_tree = decision_tree.fit(X,y)

한편으로, 트리의 결과를 시각화 하는 방법이 있다. graphiz 패키지를 통해 이를 할 수 있다.

import graphviz
dot_data = tree.export_graphviz(decision_tree, out_file=None,
                                feature_names = iris.feature_names,
                                filled = True,
                                class_names=iris.target_names)
graph = graphviz.Source(dot_data)
graph

 

Random Forest

랜덤 포레스트는, 머신러닝 앙상블 기법 중 하나인 Bagging에 속한다.

랜덤 포레스트에서는 여러개의 결정 트리가 생성된다. 각자의 방법으로 데이터를 sampling하여 독립적으로 학습한다. 각 분류기에서 나온 결과를 최종적으로 voting을 통해 데이터에 대한 예측을 수행한다.

여기서. Bagging을 사용한다는 것은 샘플을 나눠서 각 트리별로 별도로 학습을 시킨다는 것을 의미한다.

Example

from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score

forest = RandomForestClassifier(n_estimators = 100, # 트리의 개수
                                max_depth = 5, # 각 트리당 최대 깊이
                                criterion='gini') # 분류지표
forest.fit(X_train, y_train)

y_pred = forest.predict(X_test)
print(accuracy_score(y_test, y_pred))