Помогают защитить Большой Барьерный Риф с TensorFlow на Kaggle Присоединяйтесь вызов

Усиленные деревья с использованием оценщиков

Посмотреть на TensorFlow.org Запускаем в Google Colab Посмотреть исходный код на GitHub Скачать блокнот

Этот учебник представляет собой пошаговое руководство конца в конце тренировки повышающий модель Gradient с использованием деревьев решений с tf.estimator API. Модели Boosted Trees являются одними из самых популярных и эффективных подходов к машинному обучению как для регрессии, так и для классификации. Это ансамблевой метод, который объединяет прогнозы из нескольких (например, 10, 100 или даже 1000) моделей дерева.

Модели Boosted Trees популярны среди многих практиков машинного обучения, поскольку они могут достичь впечатляющей производительности с минимальной настройкой гиперпараметров.

Загрузите набор данных titanic

Вы будете использовать титанический набор данных, цель которого (довольно болезненная) - предсказать выживаемость пассажиров с учетом таких характеристик, как пол, возраст, класс и т. Д.

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)

Набор данных состоит из обучающего набора и оценочного набора:

  • dftrain и y_train является обучение набора -The данных в модели используется , чтобы учиться.
  • Модель тестируется против Eval набора, dfeval и y_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

На борту самолета пассажиров-мужчин примерно в два раза больше, чем пассажиров-женщин.

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

PNG

Большинство пассажиров находились в «третьем» классе.

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

Создание столбцов функций и функций ввода

Оценщик повышения градиента может использовать как числовые, так и категориальные функции. Столбцы функций работают со всеми оценщиками 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)

Далее вам нужно создать функции ввода. Они укажут, как данные будут считываться в нашу модель как для обучения, так и для вывода. Вы будете использовать from_tensor_slices метод в tf.data API для чтения в данных непосредственно из панд. Это подходит для небольших наборов данных в памяти. Для больших наборов данных, то 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 функции.
  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.837121
accuracy_baseline         0.625000
auc                       0.871993
auc_precision_recall      0.858760
average_loss              0.406563
label/mean                0.375000
loss                      0.406563
precision                 0.797872
prediction/mean           0.384452
recall                    0.757576
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/tmp98s7_n3y/model.ckpt-100
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
Exception ignored in: <function CapturableResource.__del__ at 0x7ff2fb5bd950>
Traceback (most recent call last):
  File "/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/training/tracking/tracking.py", line 269, in __del__
    with self._destruction_context():
AttributeError: 'TreeEnsemble' object has no attribute '_destruction_context'

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