이 페이지는 Cloud Translation API를 통해 번역되었습니다.
Switch to English

에스티 메이터를 사용한 부스트 트리

TensorFlow.org에서보기 Google Colab에서 실행 GitHub에서 소스보기 노트북 다운로드

이 튜토리얼은 tf.estimator API와 함께 의사 결정 트리를 사용하여 Gradient Boosting 모델을 훈련하는 엔드 투 엔드 연습입니다. Boosted Trees 모델은 회귀 및 분류 모두에서 가장 인기 있고 효과적인 기계 학습 접근 방식 중 하나입니다. 여러 (10, 100 또는 심지어 1000) 트리 모델의 예측을 결합하는 앙상블 기술입니다.

Boosted Trees 모델은 최소한의 초 매개 변수 조정으로 인상적인 성능을 달성 할 수 있기 때문에 많은 기계 학습 실무자에게 인기가 있습니다.

타이타닉 데이터 세트 불러 오기

성별, 나이, 클래스 등과 같은 특성을 고려하여 승객의 생존을 예측하는 것이 목표 인 타이타닉 데이터 세트를 사용할 것입니다.

import numpy as np
import pandas as pd
from IPython.display import clear_output
from matplotlib import pyplot as plt

# Load dataset.
dftrain = pd.read_csv('https://storage.googleapis.com/tf-datasets/titanic/train.csv')
dfeval = pd.read_csv('https://storage.googleapis.com/tf-datasets/titanic/eval.csv')
y_train = dftrain.pop('survived')
y_eval = dfeval.pop('survived')
import tensorflow as tf
tf.random.set_seed(123)

데이터 세트는 학습 세트와 평가 세트로 구성됩니다.

  • dftrainy_train 은 모델이 학습에 사용하는 데이터 인 학습 세트 입니다.
  • 모델은 eval set , dfevaly_eval 에 대해 테스트됩니다.

교육을 위해 다음 기능을 사용합니다.

기능 이름 기술
섹스 승객 성별
나이 승객의 나이
n_siblings_spouses 탑승 한 형제 자매 및 파트너
볶다 탑승 한 부모와 자녀의
요금 승객이 지불 한 요금입니다.
수업 선박의 승객 클래스
갑판 어느 갑판 승객이 타고 있었습니까?
embark_town 어느 도시 승객이 출발했는지
혼자 승객이 혼자 인 경우

데이터 탐색

먼저 일부 데이터를 미리보고 훈련 세트에 대한 요약 통계를 생성 해 보겠습니다.

dftrain.head()
dftrain.describe()

훈련 및 평가 세트에는 각각 627 개와 264 개의 예제가 있습니다.

dftrain.shape[0], dfeval.shape[0]
(627, 264)

대부분의 승객은 20 대와 30 대입니다.

dftrain.age.hist(bins=20)
plt.show()

png

남성 승객은 여성 승객보다 약 2 배 더 많습니다.

dftrain.sex.value_counts().plot(kind='barh')
plt.show()

png

대부분의 승객은 "3 등"클래스였습니다.

dftrain['class'].value_counts().plot(kind='barh')
plt.show()

png

대부분의 승객은 사우 샘프 턴에서 출발했습니다.

dftrain['embark_town'].value_counts().plot(kind='barh')
plt.show()

png

암컷은 수컷에 비해 생존 확률이 훨씬 더 높습니다. 이것은 분명히 모델의 예측 기능이 될 것입니다.

pd.concat([dftrain, y_train], axis=1).groupby('sex').survived.mean().plot(kind='barh').set_xlabel('% survive')
plt.show()

png

특성 열 및 입력 함수 만들기

Gradient Boosting 추정기는 숫자 및 범주 기능을 모두 활용할 수 있습니다. 특성 열은 모든 TensorFlow 추정기와 함께 작동하며 그 목적은 모델링에 사용되는 특성을 정의하는 것입니다. 또한 원-핫 인코딩, 정규화 및 버킷 화와 같은 일부 기능 엔지니어링 기능을 제공합니다. 이 자습서에서 CATEGORICAL_COLUMNS 의 필드는 범주 형 열에서 원-핫 인코딩 된 열 ( 표시기 열 )로 변환됩니다.

CATEGORICAL_COLUMNS = ['sex', 'n_siblings_spouses', 'parch', 'class', 'deck',
                       'embark_town', 'alone']
NUMERIC_COLUMNS = ['age', 'fare']

def one_hot_cat_column(feature_name, vocab):
  return tf.feature_column.indicator_column(
      tf.feature_column.categorical_column_with_vocabulary_list(feature_name,
                                                 vocab))
feature_columns = []
for feature_name in CATEGORICAL_COLUMNS:
  # Need to one-hot encode categorical features.
  vocabulary = dftrain[feature_name].unique()
  feature_columns.append(one_hot_cat_column(feature_name, vocabulary))

for feature_name in NUMERIC_COLUMNS:
  feature_columns.append(tf.feature_column.numeric_column(feature_name,
                                           dtype=tf.float32))

특성 열이 생성하는 변환을 볼 수 있습니다. 예를 들어 다음은 단일 예에서 indicator_column 을 사용할 때의 출력입니다.

example = dict(dftrain.head(1))
class_fc = tf.feature_column.indicator_column(tf.feature_column.categorical_column_with_vocabulary_list('class', ('First', 'Second', 'Third')))
print('Feature value: "{}"'.format(example['class'].iloc[0]))
print('One-hot encoded: ', tf.keras.layers.DenseFeatures([class_fc])(example).numpy())
Feature value: "Third"
One-hot encoded:  [[0. 0. 1.]]

또한 모든 특성 열 변환을 함께 볼 수 있습니다.

tf.keras.layers.DenseFeatures(feature_columns)(example).numpy()
array([[22.  ,  1.  ,  0.  ,  1.  ,  0.  ,  0.  ,  1.  ,  0.  ,  0.  ,

         0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  1.  ,  0.  ,  0.  ,  0.  ,
         7.25,  1.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  1.  ,
         0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  1.  ,  0.  ]], dtype=float32)

다음으로 입력 함수를 만들어야합니다. 이는 훈련과 추론을 위해 데이터를 모델로 읽어들이는 방법을 지정합니다. tf.data API의 from_tensor_slices 메서드를 사용하여 Pandas에서 직접 데이터를 읽습니다. 이는 더 작은 메모리 내 데이터 세트에 적합합니다. 더 큰 데이터 세트의 경우 tf.data API는 다양한 파일 형식 ( csv 포함)을 지원하므로 메모리에 맞지 않는 데이터 세트를 처리 할 수 ​​있습니다.

# Use entire batch since this is such a small dataset.
NUM_EXAMPLES = len(y_train)

def make_input_fn(X, y, n_epochs=None, shuffle=True):
  def input_fn():
    dataset = tf.data.Dataset.from_tensor_slices((dict(X), y))
    if shuffle:
      dataset = dataset.shuffle(NUM_EXAMPLES)
    # For training, cycle thru dataset as many times as need (n_epochs=None).
    dataset = dataset.repeat(n_epochs)
    # In memory training doesn't use batching.
    dataset = dataset.batch(NUM_EXAMPLES)
    return dataset
  return input_fn

# Training and evaluation input functions.
train_input_fn = make_input_fn(dftrain, y_train)
eval_input_fn = make_input_fn(dfeval, y_eval, shuffle=False, n_epochs=1)

모델 훈련 및 평가

아래에서 다음 단계를 수행합니다.

  1. 기능과 하이퍼 파라미터를 지정하여 모델을 초기화합니다.
  2. train_input_fn 사용하여 모델에 훈련 데이터를 공급하고 train 함수를 사용하여 모델을 train 시킵니다.
  3. 평가 세트 (이 예에서는 dfeval DataFrame)를 사용하여 모델 성능을 평가합니다. 예측이 y_eval 배열의 레이블과 일치하는지 확인합니다.

Boosted Trees 모델을 훈련하기 전에 먼저 선형 분류기 (로지스틱 회귀 모델)를 훈련 해 보겠습니다. 벤치 마크를 설정하려면 더 간단한 모델로 시작하는 것이 좋습니다.

linear_est = tf.estimator.LinearClassifier(feature_columns)

# Train model.
linear_est.train(train_input_fn, max_steps=100)

# Evaluation.
result = linear_est.evaluate(eval_input_fn)
clear_output()
print(pd.Series(result))
accuracy                  0.765152
accuracy_baseline         0.625000
auc                       0.832844
auc_precision_recall      0.789631
average_loss              0.478908
label/mean                0.375000
loss                      0.478908
precision                 0.703297
prediction/mean           0.350790
recall                    0.646465
global_step             100.000000
dtype: float64

다음으로 Boosted Trees 모델을 훈련시켜 보겠습니다. 부스트 트리의 경우 회귀 ( BoostedTreesRegressor ) 및 분류 ( BoostedTreesClassifier )가 지원됩니다. 목표는 클래스 생존 여부를 예측하는 BoostedTreesClassifier 를 사용합니다.

# Since data fits into memory, use entire dataset per layer. It will be faster.
# Above one batch is defined as the entire dataset.
n_batches = 1
est = tf.estimator.BoostedTreesClassifier(feature_columns,
                                          n_batches_per_layer=n_batches)

# The model will stop training once the specified number of trees is built, not
# based on the number of steps.
est.train(train_input_fn, max_steps=100)

# Eval.
result = est.evaluate(eval_input_fn)
clear_output()
print(pd.Series(result))
accuracy                  0.833333
accuracy_baseline         0.625000
auc                       0.874778
auc_precision_recall      0.859794
average_loss              0.406492
label/mean                0.375000
loss                      0.406492
precision                 0.795699
prediction/mean           0.385033
recall                    0.747475
global_step             100.000000
dtype: float64

이제 기차 모델을 사용하여 평가 세트에서 승객을 예측할 수 있습니다. TensorFlow 모델은 한 번에 예제의 일괄 또는 컬렉션에 대한 예측을 수행하도록 최적화되어 있습니다. 이전에 eval_input_fn 은 전체 평가 세트를 사용하여 정의되었습니다.

pred_dicts = list(est.predict(eval_input_fn))
probs = pd.Series([pred['probabilities'][1] for pred in pred_dicts])

probs.plot(kind='hist', bins=20, title='predicted probabilities')
plt.show()
INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from /tmp/tmpgmenxqlc/model.ckpt-100
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.

png

마지막으로 결과의 ROC (수신기 작동 특성)를 살펴보면 참 양성률과 거짓 양성률 간의 트레이드 오프에 대한 더 나은 아이디어를 얻을 수 있습니다.

from sklearn.metrics import roc_curve

fpr, tpr, _ = roc_curve(y_eval, probs)
plt.plot(fpr, tpr)
plt.title('ROC curve')
plt.xlabel('false positive rate')
plt.ylabel('true positive rate')
plt.xlim(0,)
plt.ylim(0,)
plt.show()

png