[혼공머신] 5-1. 결정 트리

Seyi·2025년 1월 20일
0

이번 학습 목표는

🥕 결정트리 알고리즘을 사용해서 분류 문제 해결하기

입니다!!



이번에는 레드와인과 화이트 와인을 알코올 도수, 당도, pH 값으로 구분하는 분류 모델을 만들어 보려고 합니다. 우선 로지스틱 회귀 모델을 적용해서 작업해보겠습니다.

1. 로지스틱 회귀로 와인 분류

데이터 준비

와인 샘플 데이터를 불러온 후 확인해보겠습니다.

  • alcohol: 알코올 도수
  • sugar: 당도
  • pH: pH
  • class: 타깃값으로 0이면 레드와인, 1이면 화이트 와인

각 컬럼값에 대해서 살펴보았다면 이번에는 info( ) 매서드를 사용해서 데이터프레임의 각 열의 데이터 타입과 누락된 데이터가 있는지 확인해보겠습니다.

총 6427개의 샘플이 있고, 4개의 열은 모두 실수값(float64)입니다.
non-null(결측치)이 6427개이므로 누락된 값은 없습니다.

결측치가 있는 경우 해당하는 데이터를 삭제하거나 평균값으로 채워서 사용할 수 있습니다.

describe( ) 매서드를 사용해서 열에 대한 통계값을 확인합니다.

평균(mean), 표준편차(std), 최소(min), 최대(max)값과 중간값(50%), 1사분위수(25%), 3사분위수(75%)를 확인할 수 있습니다.

특성값을 넘파이 배열로 바꿔서 data 배열에 저장하고, class 열을 넘파이 배열로 바꿔서 target 배열에 저장하고, 훈련 세트와 테스트 세트를 나눕니다.

알코올 도수, 당도, pH 값의 스케일이 다르기 때문에 StandardScaler 클래스를 사용해서 특성을 표준화하겠습니다.

train_scaled와 test_scaled 데이터를 사용해서 로지스틱 회귀 모델을 훈련시켰는데요, 훈련점수와 테스트 점수가 모두 낮은 것을 보면 과소적합된 것 같습니다.


설명하기 쉬운 모델과 설명하기 어려운 모델

로지스틱 회귀 모델에 대해서 설명하기 위해 모델이 학습한 계수와 절편을 출력해보겠습니다.

알코올 도수와 당도가 높을 수록 화이트와인일 가능성이 높고, pH가 높을수록 레드와인일 가능성이 높은 것 같습니다.

하지만 정확히 숫자가 어떤 의미인지는 설명하기 어려운데요, 대부분 머신러닝 모델은 학습 결과를 설명하기 어렵습니다. 하지만 설명하기 쉬운 결정트리 모델이 있습니다.




2. 결정트리

결정트리는 스무고개처럼 질문을 하나씩 던져서 정답을 맞춰가는 방식으로 알고리즘이 작동합니다. 사이킷런의 DecisionTreeClassifier 클래스를 사용해서 결정트리 모델을 학습할 수 있습니다.

훈련 세트에 대한 점수가 매우 높네요. 하지만 테스트 성능은 그에 비해 낮기 때문에 과대적합된 모델이라고 볼 수 있습니다.

결정트리 모델은 사이킷런의 plot_tree( )함수를 사용해서 모델을 그림으로 표현할 수 있습니다.

노드(node)

  • 훈련 데이터의 특성에 대한 테스트 표현

가지(branch)

  • 테스트 결과(True, False)를 나타냄

결정트리는 위에서부터 아래로 자라나며, 맨 위의 노드를 루트 노드, 맨 아래 끝에 달린 노드를 리프 노드라고 합니다.

max_depth 매개변수

  • 1로 주면 루트노드를 제외하고 하나의 노드를 더 확장하여 그림

filled 매개변수

  • 클래스에 맞게 노드의 색을 칠함

feature_names 매개변수

  • 특성의 이름을 전달

위 그림에서 루트 노드는 당도가 -0.239 이하인지를 질문합니다.
샘플의 당도가 -0.239 이하이면 왼쪽 가지로 이동하고, 그렇지 않으면 오른쪽 가지로 이동합니다.

루트 노드의 샘플은 5197개이고 이중에서 음성클래스인 레드와인은 1258개, 양성클래스인 화이트와인은 3939개입니다.

노드의 색깔을 보면, 루트노드보다 오른쪽 노드가 더 진하고 왼쪽 노드는 연합니다. filled=True로 지정하면 특정 클래스의 비율이 높아지면 점점 진하나 색으로 표시합니다.

결정트리에서는 리프 노드에서 가장 많은 클래스가 예측 클래스가 됩니다. 만약 결정 트리의 성장을 위 그림의 지점에서 멈춘다면 왼쪽 노드에 도달한 샘플과 오른쪽 노드에 도달한 샘플은 모두 양성 클래스로 예측됩니다.

불순도

노드 안의 gini는 지니 불순도를 의미합니다.

DecisionTreeClassifier 클래스의 criterion 매개변수의 기본값은 'gini'입니다.

criterion

  • 결정트리의 노드에서 데이터를 분할하는 기준을 정하는 매개변수
지니불순도=1(음성클래스비2+양성클래스비2)지니 불순도 = 1 - (음성 클래스 비율^2 + 양성 클래스 비율^2)

결정 트리 모델은 부모노드와 자식 노드의 불순도 차이가 가능한 클도록 트리를 성장시킵니다.

부모노드와 자식 노드의 불순도 차이는 자식 노드의 불순도를 샘플 개수에 비례하여 모두 더한 후 부모 노드의 불순도를 빼면됩니다. 이러한 부모노드와 자식 노드의 불순도 차이를 정보이득(information gain)이라고 합니다.

지니 불순도 외에도 엔트로피 불순도도 있습니다.

엔트로피불순도=1log2(음성클래스비율)+log2(양성클래스비율)엔트로피 불순도 = 1 - log_2(음성 클래스 비율) + log_2(양성 클래스 비율)

가지치기

결정트리 알고리즘으로 학습한 모델이 너무 깊게 학습이 되어 과적합되는 현상이 있었습니다. 결정트리 모델은 가지치기를 통해서 과적합을 방지할 수 있습니다.

가지치기

  • 결정트리의 성장을 제한함으로서 과적합을 방지

max_depth 매개변수를 3으로 지정해서 루트 노드 아래로 최대 3개의 노드까지만 학습을 시켰습니다.

plot_tree( ) 함수로 학습한 트리 그래프도 확인해보았습니다.

결정트리는 불순도를 기준으로 샘플을 나누며, 불순도는 클래스별 비율을 계산하기 때문에 표준화 전처리 과정이 필요하지 않습니다.

이번에는 표준화 전처리 적용하지 않은 데이터로 모델을 학습해보겠습니다.

결과가 정확히 같다는 것을 알 수 있습니다.


특성 중요도

결정 트리는 어떤 특성이 가장 유용한지 나타내는 특성 중요도를 계산해줍니다.

두번째 특성인 당도가 0.87 로 특성 중요도가 가장 높습니다. 특성 중요도를 모두 더하면 1이 됩니다.

특성 중요도는 각 노드의 정보 이득과 전체 샘플에 대한 비율을 곱한 후 특성별로 더하여 계산합니다.

특성 중요도

  • 결정 트리에 사용된 특성이 불순도를 감소하는데 기여한 정도를 나타내는 값


여기까지 학습을 마치고 다음장에서는 결정트리의 하이퍼파라미터를 자동으로 찾는 방법에 대해 알아보겠습니다~!!

자료출처: 한빛미디어

profile
머신러닝 딥러닝 학습기록

0개의 댓글

관련 채용 정보