본문 바로가기

cs,코딩,알고리즘/<파이썬 머신러닝 완벽 가이드>스터디

분류 머신러닝 알고리즘-결정트리(시각화와 과적합)

728x90

명시적인 정답이 있는 데이터를 다룰 때에는 지도학습,

데이터의 피처와 레이블값(결정값, 클래스값)을 머신러닝 알고리즘으로 학습하는 것이 분류

=> "기존 데이터가 어떤 레이블에 속하는지!"

결정트리

 

Base. 직관적인 이해

-결정 트리(Decision Tree, 의사결정트리, 의사결정나무라고도 함)는 분류(Classification)와 회귀(Regression) 모두 가능한 지도 학습 모델 

-스무고개 하듯, if/else구문처럼 예/아니오 질문을 이어가며 학습한다.

-다른 모델들과 다르게 결과를 시각적으로 읽기 쉬운 형태로 나타나는 것이 장정 => 대출을 원하는 사람이 신용평가를 하고 싶을 때(실질적으로 분류하는 경우에 자주 사용)

매, 펭귄, 돌고래, 곰을 구분한다고 생각해봅시다. 매와 펭귄은 날개를 있고, 돌고래와 곰은 날개가 없다. '날개가 있나요?'라는 질문을 통해 매, 펭귄 / 돌고래, 곰을 나눌 수 있습니다. 매와 펭귄은 '날 수 있나요?'라는 질문으로 나눌 수 있고, 돌고래와 곰은 '지느러미가 있나요?'라는 질문으로 나눌 수 있다

활용 예시

 분류: 범주형 레이블을 예측

- 은행 입장에서 대출을 요청하는 고객의 특성에 따라 대출 위험성을 분석하여 대출 여부를 결정한다.

- 고객 프로파일 및 구매 패턴을 분석하여 새로운 제품 구매 여부를 판단한다.

- 환자 특성과 상태에 따라 특정 처방의 적절성 여부를 예측한다.

 

 회귀: 목표변수의 평균값을 예측

- 다양한 신체 측정값을 기반으로 체질 비만도를 예측합니다.

- 주택가격에 영향을 주는 다양한 요인을 분석하여 주택 특성별 가격을 예측합니다.

- 고객 프로파일 및 구매 패턴에 따른 (특정) 제품 또는 매장의 매출액을 예측합니다.

 

=> 주로 분류 문제에서 더 자주 사용

 

트리 구조

이렇게 특정 기준(질문)에 따라 데이터를 구분하는 모델을 결정 트리 모델이라고 한다. 한번의 분기 때마다 변수 영역을 두 개로 구분한다.

 

결정 트리에서 질문이나 정답은 노드(Node)라고 부른다.

맨 처음 분류 기준을 Root Node라고 하고

중간 분류 기준을 Intermediate Node

맨 마지막 노드를 Terminal Node 혹은 Leaf Node라고 합니다.

 

결정 트리의 기본 아이디어는, Leaf Node가  가장 섞이지 않은 상태로 완전히 분류되는 것 , 즉  복잡성(entropy)이 낮도록  만드는 것입니다

균일한 데이터 세트

그렇다면 높은 예측 정확도를 가진 결정 나무를 만들려면 어떻게 해야 할까?

=>데이터를 분류할 때 최대한 많은 데이터 세트가 해당 분류에 속할 수 있도록 결정 노드의 규칙이 정해져야 한다. 트리를 최대한 균일한 데이터 세트를 구성할 수 있도록 분할(split)해야 한다

 첫번 째로 보이는 집합은 하마, 독수리, 너구리, 강아지, 코브라로 되어있다. 이 경우에는 데이터가 다양하지만 균일하지는 않다. 반면 두번째 집합은 너구리와 강아지로만 구성되어있다. 데이터가 다양하지는 않지만 균일하다는 것을 알 수 있다.

만약 위의 집합에서 아무거나 하나를 고르고 예측한다고 가정해보자. 두번째 집합에서는 데이터가 균일하기 때문에 랜덤하게 하나를 뽑아도 너구리라고 예측할 확률이 높다. 하지만 첫번째의 경우에는 혼잡도가 높기 때문에 데이터를 판단하기 쉽지 않다.

 

이와 같이 결정 노드는 정보 균일도가 높은 데이터 세트를 먼저 선택할 수 있도록 규칙 조건을 생성한다.

=>다시 말하자면, 정보 균일도가 높은 데이터 셋으로 나눠질 수 있도록 조건을 찾아 서브 데이터 셋을 생성하고, 생성한 자식 노드도 계속 반복적으로 정보 균일도가 높도록 조건을 찾는다. 이 과정을 통해 데이터 값을 예측하게 된다.

 

결정 노드의 분리기준

 지니 계수(Gini Index)

- 경제학에서 불평등 지수를 나타낼 때 주로 사용합니다.

- 불순도 측정 계수로 부모 노드의 지니 지수를 가장 많이 감소시키는 설명변수와 분리 값을 기준으로 자식노드를 형성합니다.

- 지니 계수가 낮을수록 데이터의 균일도는 높습니다. 따라서 지니 계수가 낮은 속성을 기준으로 분할합니다.

 

 엔트로피 계수(Entrophy Index)

- 엔트로피란 주어진 데이터 집합의 혼잡도를 의미합니다. 서로 다른 값이 섞여있으면 엔트로피가 높고, 같은 값들이 많으면 낮습니다.

- 혼잡도 측정지수로 부모 노드의 엔트로피 지수를 가장 많이 감소시키는 설명변수와 분리 값을 기준으로 자식 노드를 형성합니다.

- 분리에 필요한 기대 정보량으로 엔트로피가 낮을수록 균일도는 높습니다.

- 정보 이득 지수는 1에서 엔트로피 계수를 뺀 값입니다. 1-엔트로피 계수

- 결정 트리는 정보 이득 지수로 분할 기준을 결정하고 정보 이득이 높은 속성 기준으로 분할합니다.

결정 트리의 알고리즘은 데이터 세트를 분할하는 데 가장 좋은 조건(엔트로피 계수나 지니 계수에 의한)을 찾아 자식 노드를 거쳐 계속적으로 반복 분할한 뒤, 데이터가 모두 특정 분류에 속하게 되면 분할을 멈추고 분류를 결정한다

결정트리 모델의 특징

'균일도'->룰이 명활하고 그에 기반해 분류되는 노드들, 그것을 시각화할 수도 있다. 따라서 쉽고 직관적이다.

but 과적합으로 정확도가 떨어진다.

장점_ 직관적이다: 결정 트리 모델 시각화

graphviz패키지를 이용해서!-> 다운받고 계속 오류 떠서 스트레스 받고 죽을 뻔 휴우

https://copycoding.tistory.com/348

https://livetoday.tistory.com/entry/graphviz-%EC%84%A4%EC%B9%98-%ED%9B%84-%EC%98%A4%EB%A5%98-Anaconda

https://2030bigdata.tistory.com/189

다운을 받았는데 graphviz가 c언어 용이라 파이썬 api로 경로랑 이것저것 변경해야 하나부다...

이젠 익숙해진 데이터세트 가져와서 분리하기

export_graphviz()는 Graphviz가 읽어들여서 그래프 형태로 시각화할 수 있게 해준다

 export_graphviz()의 인자로 estimator, output파일 명, 결정 클래스의 명칭, 피처의 명칭을 입력하면 된다

 

톺아보기

gini: 다음의 value=[] 로 주어진 데이터 분포에서의 지니계수

samples: 현 규칙에 해당하는 데이터 건수

value=[]: 클래스 값 기반의 데이터 건수(이번 예제인 붓꽃의 경우 0: Setosa, 1 : Veericolor, 2: Virginia 를 나타냄. value=[1,2,3]이면 각각 1, 2, 3개)

class: value 리스트 내에 가장 많은 건수를 가진 결정값

색깔

-각 노드의 색은 붓곷 데이터의 레이블 값(주황생은 0:Setosa, 초록색은 1:Versicolor, 보라색은 2:Virginica)

-진할 수록 지니계수가 낮고 해당 데이터 레이블에 속하는 데이터가 많다는 것->균일화가 잘 되어 있다

 

 

최대 트리 깊이 제어하기(max_depth)

 

max_depth=3으로

깊이가 3으로 제한된 트리가 생성(위의 트리는 제한이 없었다.)

min_samples_split=4로

samples가 3이고 min_samples_split=4니까 서로 다른 class값이 더 있어도(value가 [0,2,1]과 [0,1,2]) 또 다시 split하지 않고 class를 결정했다

자식 노드로 분할하려면 최소한 샘플의 수가 4개는 필요한데, 3개밖에 없으므로 더이삭 규칙 노드를 위한 분할을 하지 않고 그냥 리프 노드로 놔둠(트리 깊이도 줄고 더 간결한 결정 트리가 만들어짐)

 

장점_직관적이다: 결정 트리의 Feature의 속성

여러 피처들 중 petal_length가 가장 피처 중요도가 높다는 것을 알 수 있다.

feature_importance를 통해 피처별로 중요도 값을 매핑하여 중요도를 알게되면 알고리즘이 어떻게 동작하는지 직관적으로 이해할 수 있다

단점_과적합(Overfitting)

 

트리 생성 제약이 없으면 단 하나의 특징만 삐져나와도(이상치) 그곳에 분류 기준선이 생긴다 예를 들어 파란색 부분에 빨간 점 하나가 있어서 작은 빨간색 규칙을 또 만들게 되었다 이렇듯 조금만 형태가 다른 데이터가 들어와도 정확도가 매우 떨어지게 된다
오히려 이런 식으로 규칙을 만드는 것이 더 간결할 수 있다 이상치에 크게 반응하지 않으면서 일반적인 분류 규칙에 의해 분류되었다

=>Decision Tree의 과적합을 줄이기 위한 파라미터 튜닝

(1) max_depth 를 줄여서 트리의 깊이 제한
(2) min_samples_split 를 높여서 데이터가 분할하는데 필요한 샘플 데이터의 수를 높이기
(3) min_samples_leaf 를 높여서 말단 노드가 되는데 필요한 샘플 데이터의 수를 높이기
(4) max_features를 높여서 분할을 하는데 고려하는 feature의 수 제한