결정 트리 만들기

이 단원에서는 YDF (Yggdrasil)를 사용하여 결정 포레스트) 라이브러리가 학습하고 결정 트리를 해석합니다.

이 단원은 🧭 YDF 시작하기 튜토리얼을 확인하세요.

예비 과정

데이터 세트를 연구하기 전에 다음을 수행합니다.

  1. Colab 만들기 노트북을 참조하세요.
  2. 다음 코드 줄을 배치하고 실행하여 YDF 라이브러리를 설치합니다. 새 Colab 노트북에서 다음과 같이 작업하세요.
    !pip install ydf -U
    
  3. 다음 라이브러리를 가져옵니다.
    import ydf
    import numpy as np
    import pandas as pd
    

파머 펭귄 데이터 세트

이 Colab에서는 <ph type="x-smartling-placeholder"></ph> Palmer Penguins 데이터 세트로, 펭귄 종:

  • 턱끈
  • 젠투
  • Adelie

이것은 분류 문제입니다. 목표는 생물학적으로 존재하는 생물의 종을 파머 펭귄 데이터 세트의 데이터를 기반으로 하는 연구자입니다. 다음은 펭귄입니다.

세 마리의 펭귄
있습니다.

<ph type="x-smartling-placeholder"></ph> 그림 16. 세 가지 다른 펭귄 종 이미지 제공: @allisonhorst

 

다음 코드는 판다 함수를 사용하여 Palmer Penguins 데이터 세트를 메모리에 로드합니다.

path = "https://storage.googleapis.com/download.tensorflow.org/data/palmer_penguins/penguins.csv"
dataset = pd.read_csv(path)
label = "species"

# Display the first 3 examples.
dataset.head(3)

다음 표는 파머펭귄의 처음 3개 예에 대한 서식을 지정합니다. 데이터 세트:

<ph type="x-smartling-placeholder"></ph> 표 3. 파머 펭귄스의 처음 3가지 사례 를 통해 개인정보처리방침을 정의할 수 있습니다.

bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex
0 Adelie Torgersen 39.1 18.7 181.0 3,750,000 남성 2007
1 Adelie Torgersen 39.5 17.4 186.0 3,800 여성 2007
2 Adelie Torgersen 40.3 18.0 195.0 3,250 여성 2007

전체 데이터 세트에는 숫자가 혼합된 값 (예: bill_depth_mm)이 포함됩니다. 범주형 (예: island) 및 누락된 특성 신경과는 달리 결정 포레스트는 기본적으로 이러한 모든 특성 유형을 지원하므로 원-핫 인코딩, 정규화 또는 추가 is_present 특성을 수행할 필요가 없습니다.

다음 코드 셀은 데이터 세트를 학습 세트와 테스트로 분할합니다. set:

# Use the ~20% of the examples as the testing set
# and the remaining ~80% of the examples as the training set.
np.random.seed(1)
is_test = np.random.rand(len(dataset)) < 0.2

train_dataset = dataset[~is_test]
test_dataset = dataset[is_test]

print("Training examples: ", len(train_dataset))
# >> Training examples: 272

print("Testing examples: ", len(test_dataset))
# >> Testing examples: 72

기본 초매개변수를 사용하여 결정 트리 학습

CART (분류 및 분류)를 사용하여 첫 번째 결정 트리를 학습시킬 수 있습니다. 회귀 트리) 학습 알고리즘 (학습자)을 초매개변수를 조정합니다 ydf.CartLearner 학습자가 적합한 기본값을 제공하기 때문입니다. 초매개변수 값을 조정할 수 있습니다 이러한 유형의 모델이 작동하는 방식에 대해 자세히 알아볼 것입니다. 자세히 알아보겠습니다

model = ydf.CartLearner(label=label).train(train_dataset)

이전 호출에서 다음으로 사용할 열을 지정하지 않았습니다. 입력 특성을 정의합니다. 따라서 학습 세트의 모든 열이 사용됩니다. 호출 의미 (예: 숫자, 범주형, 텍스트)도 지정하지 않았습니다. 학습합니다. 따라서 특성 시맨틱스는 자동으로 추론됩니다.

model.plot_tree()를 호출하여 결과 결정 트리를 표시합니다.

model.plot_tree()

Colab에서 마우스를 사용하여 특정 요소에 관한 세부정보를 표시할 수 있습니다. 클래스 분포입니다.

기본값으로 학습된 결정 트리
초매개변수를 조정합니다

<ph type="x-smartling-placeholder"></ph> 그림 17. 기본 초매개변수로 학습된 결정 트리 를 통해 개인정보처리방침을 정의할 수 있습니다.

Colab에 따르면 루트 조건에 243개의 예가 포함되어 있습니다. 그러나 학습 데이터 세트에 272개의 예가 있다는 것을 기억하세요. 나머지 29개는 검증과 트리 가지치기를 위해 예시가 자동으로 예약되었습니다.

첫 번째 조건은 bill_depth_mm의 값을 테스트합니다. 표 4와 표 5는 첫 번째 조건의 결과에 따라 다른 종의 가능성을 나타냅니다.

<ph type="x-smartling-placeholder"></ph> 표 4. bill_depth_mm ≥ 42.3인 경우 다른 종의 가능성 를 통해 개인정보처리방침을 정의할 수 있습니다.

가능성
Adelie (빨간색) 8%
Gentoo (파란색) 58%
턱끈 (초록색) 36%

 

<ph type="x-smartling-placeholder"></ph> 표 5. 다른 종의 가능성 bill_depth_mm < 42.3 를 통해 개인정보처리방침을 정의할 수 있습니다.

가능성
Adelie (빨간색) 97%
Gentoo (파란색) 2%
턱끈 (초록색) 0%

bill_depth_mm는 숫자 특성입니다. 따라서 값 42.3이 발견되었습니다. 숫자로 이진 분류에 정확한 분할 사용 특성 알고리즘을 기반으로 작동합니다.

bill_depth_mm ≥ 42.3가 True이면 flipper_length_mm ≥ 207.5는 선행 학습된 신경망을 사용하여 젠투스와 젠투스+아델리의 아티스트입니다.

다음 코드는 모델의 학습 및 테스트 정확성을 제공합니다.

train_evaluation = model.evaluate(train_dataset)
print("train accuracy:", train_evaluation.accuracy)
# >> train accuracy:  0.9338

test_evaluation = model.evaluate(test_dataset)
print("test accuracy:", test_evaluation.accuracy)
# >> test accuracy:  0.9167

드물긴 하지만, 테스트 정확성이 학습 데이터보다 높을 가능성도 있습니다. 있습니다. 이 경우 테스트 세트가 학습 세트와 다를 수 있습니다. 그러나 여객선에서 운항하는 열차와 테스트가 분할되었습니다. 무작위로 생성됩니다. 이보다는 테스트 데이터 세트가 너무 작아서 테스트 데이터 세트가 72개 예시)을 제공하므로 정확도 추정에 노이즈가 있습니다.

실제로 이러한 작은 데이터 세트의 경우 교차 검증 를 사용하면 더 정확한 평가 측정항목 값을 계산할 수 있으므로 더 좋습니다. 그러나 이 예시에서는 계속해서 학습하고 애플리케이션 환경을 제공합니다

모델 초매개변수 개선

모델은 기본 초매개변수로 학습된 단일 결정 트리입니다. 값으로 사용됩니다. 더 나은 예측을 얻으려면 다음을 수행하면 됩니다.

  1. 다음과 같이 더 강력한 학습자를 사용하세요. 랜덤 포레스트 또는 그라데이션 부스티드 트리 있습니다. 이러한 학습 알고리즘은 다음 페이지에서 설명합니다.

  2. 관찰 및 직관을 사용하여 초매개변수 최적화 이 모델 개선 가이드 도움이 될 수 있습니다

  3. 초매개변수 조정 사용 초매개변수를 자동으로 테스트할 수 있습니다

랜덤 포레스트와 경사 부스티드 트리를 아직 보지 못했으므로 예시의 수가 너무 적어서 자동으로 예측하기에 초매개변수 조정을 통해 모델을 수동으로 개선해 나갈 것입니다.

위에 표시된 결정 트리는 작으며, 61개의 예시가 있는 리프에는 혼합된 라벨을 사용합니다. 알고리즘이 이 리프를 나누지 않은 이유 어떻게 해야 할까요? 다음과 같이 두 가지 원인이 있습니다.

  • 리프당 최소 샘플 수 (기본값 min_examples=5)에는 다음이 있을 수 있습니다. 도달할 수 있습니다
  • 트리를 나눈 다음 가지치기하여 과적합을 방지했을 수 있습니다.

최소 예시 수를 1개로 줄이고 결과를 확인합니다.

model = ydf.CartLearner(label=label, min_examples=1).train(train_dataset)
model.plot_tree()

인코더-디코더 아키텍처에 관해 학습된
min_examples=1입니다.

<ph type="x-smartling-placeholder"></ph> 그림 18. min_examples=1로 학습된 결정 트리 를 통해 개인정보처리방침을 정의할 수 있습니다.

 

61개의 예가 포함된 리프 노드는 여러 개의 표시됩니다.

노드를 더 분할하는 것이 가치가 있는지 확인하기 위해 이 새 모델을 테스트 데이터 세트에 추가합니다.

print(model.evaluate(test_dataset).accuracy)
# >> 0.97222

모델의 품질이 향상되면서 테스트 정확성이 0.9167에서 0.97222입니다. 이러한 초매개변수 변경은 좋은 생각이었습니다.

결정 포레스트의 이전

계속해서 초매개변수를 개선하면 있습니다. 그러나 이러한 수동 프로세스 대신 더 강력한 모델을 학습시킬 수 있습니다. 이 모델이 더 나은지 확인할 수 있습니다.

model = ydf.RandomForestLearner(label=label).train(pandas_train_dataset)
print("Test accuracy: ", model.evaluate(pandas_test_dataset).accuracy)
# >> Test accuracy: 0.986111

랜덤 포레스트의 정확성은 단순한 트리보다 낫습니다. 사용자는 다음 작업을 수행합니다. 그 이유를 알아보겠습니다.

사용 및 제한사항

앞서 언급했듯이 단일 결정 트리는 최신 버전보다 품질이 낮은 경우가 많습니다. 랜덤 포레스트, 경사 강화 트리, 신경망과 같은 머신러닝 방법 네트워크 그러나 결정 트리는 다음과 같은 경우에도 여전히 유용합니다.

  • 더 복잡한 접근 방식을 평가하기 위한 간단하고 경제적인 기준
  • 모델 품질과 해석 가능성 간에 절충사항이 있는 경우
  • 결정 포레스트 모델 해석의 프록시로 사용됩니다. 이 과정은 나중에 살펴보겠습니다