Создание дерева решений

В этом модуле вы будете использовать библиотечный поезд YDF (Yggdrasil Decision Forest) и интерпретировать дерево решений.

Этот модуль создан на основе руководства 🧭 «Начало работы с YDF» .

Предварительные сведения

Прежде чем изучать набор данных, сделайте следующее:

  1. Создайте новый блокнот Colab .
  2. Установите библиотеку YDF, поместив и выполнив следующую строку кода в новом блокноте Colab:
    !pip install ydf -U
    
  3. Импортируйте следующие библиотеки:
    import ydf
    import numpy as np
    import pandas as pd
    

Набор данных «Пингвины Палмера»

Этот Colab использует набор данных Palmer Penguins , который содержит измерения размеров трех видов пингвинов:

  • Ремешок для подбородка
  • Генту
  • Адели

Это проблема классификации: цель состоит в том, чтобы предсказать вид пингвинов на основе данных из набора данных Palmer's Penguins. Вот пингвины:

Three different penguin
species.

Рисунок 16. Три разных вида пингвинов. Изображение @allisonhorst

Следующий код вызывает функцию pandas для загрузки набора данных 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)

В следующей таблице представлены первые три примера набора данных Palmer Penguins:

Таблица 3. Первые 3 примера в Palmer Penguins

разновидность остров bill_length_mm bill_глубина_мм флиппер_длина_мм body_mass_g секс год
0 Адели Торгерсен 39,1 18,7 181,0 3750,0 мужской 2007 год
1 Адели Торгерсен 39,5 17,4 186,0 3800,0 женский 2007 год
2 Адели Торгерсен 40,3 18,0 195,0 3250,0 женский 2007 год

Полный набор данных содержит сочетание числовых (например, bill_depth_mm ), категориальных (например, island ) и отсутствующих объектов. В отличие от нейронных сетей, леса решений изначально поддерживают все эти типы функций, поэтому вам не нужно выполнять мгновенное кодирование, нормализацию или дополнительную функцию is_present.

Следующая ячейка кода разделяет набор данных на обучающий и тестовый набор :

# 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 вы можете использовать мышь для отображения сведений о конкретных элементах, таких как распределение классов в каждом узле.

A decision tree trained with default
hyperparameters.

Рисунок 17. Дерево решений, обученное с использованием гиперпараметров по умолчанию.

Colab показывает, что корневое условие содержит 243 примера. Однако вы, возможно, помните, что набор обучающих данных содержал 272 примера. Остальные 29 примеров были автоматически зарезервированы для проверки и обрезки дерева.

Первое условие проверяет значение bill_depth_mm . В таблицах 4 и 5 показана вероятность появления разных видов в зависимости от исхода первого условия.

Таблица 4. Вероятность существования разных видов, если bill_depth_mm ≥ 42.3

Разновидность Вероятность
Адели (красная) 8%
Генту (синий) 58%
Подбородочный ремень (зеленый) 36%

Таблица 5. Вероятность существования разных видов, если bill_depth_mm < 42.3

Разновидность Вероятность
Адели (красная) 97%
Генту (синий) 2%
Подбородочный ремень (зеленый) 0%

bill_depth_mm — числовой признак. Таким образом, значение 42,3 было найдено с использованием точного разделения для двоичной классификации с алгоритмом числовых признаков .

Если bill_depth_mm ≥ 42.3 имеет значение True, дальнейшая проверка того, может ли flipper_length_mm ≥ 207.5 почти идеально отделить Gentoos от Gentoos+Adelie.

Следующий код обеспечивает точность обучения и тестирования модели:

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 примером содержит смесь меток Adelie и Chinstrap. Почему алгоритм не разделил этот лист дальше? Есть две возможные причины:

  • Возможно, достигнуто минимальное количество образцов на лист (по умолчанию min_examples=5 ).
  • Дерево могло быть разделено, а затем подрезано, чтобы предотвратить переобучение.

Уменьшите минимальное количество примеров до 1 и посмотрите результат:

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

A decision tree trained with
min_examples=1.

Рисунок 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

Точность случайного леса лучше, чем у нашего простого дерева. На следующих страницах вы узнаете, почему.

Использование и ограничения

Как упоминалось ранее, одно дерево решений часто имеет более низкое качество, чем современные методы машинного обучения, такие как случайные леса, деревья с градиентным усилением и нейронные сети. Однако деревья решений по-прежнему полезны в следующих случаях:

  • В качестве простой и недорогой основы для оценки более сложных подходов.
  • Когда существует компромисс между качеством модели и интерпретируемостью.
  • В качестве прокси для интерпретации модели леса решений, которую в курсе мы рассмотрим позже.