В этом модуле вы будете использовать библиотечный поезд YDF (Yggdrasil Decision Forest) и интерпретировать дерево решений.
Этот модуль создан на основе руководства 🧭 «Начало работы с YDF» .
Предварительные сведения
Прежде чем изучать набор данных, сделайте следующее:
- Создайте новый блокнот Colab .
- Установите библиотеку YDF, поместив и выполнив следующую строку кода в своем новом блокноте Colab:
!pip install ydf -U
- Импортируйте следующие библиотеки:
import ydf import numpy as np import pandas as pd
Набор данных «Пингвины Палмера»
Этот Colab использует набор данных Palmer Penguins , который содержит измерения размеров трех видов пингвинов:
- подбородочный ремень
- Генту
- Адели
Это проблема классификации: цель состоит в том, чтобы предсказать вид пингвинов на основе данных из набора данных Palmer's Penguins. Вот пингвины:
Рисунок 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 вы можете использовать мышь для отображения сведений о конкретных элементах, таких как распределение классов в каждом узле.
Рисунок 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 примера), поэтому оценка точности является зашумленной.
На практике для такого небольшого набора данных было бы предпочтительнее использовать перекрестную проверку , поскольку она позволит вычислить более точные значения показателей оценки. Однако в этом примере для простоты мы продолжим обучение и тестирование.
Улучшение гиперпараметров модели
Модель представляет собой единое дерево решений, обученное со значениями гиперпараметров по умолчанию. Чтобы получить более точные прогнозы, вы можете:
Используйте более мощное средство обучения, такое как случайный лес или модель деревьев с градиентным усилением . Эти алгоритмы обучения будут объяснены на следующей странице.
Оптимизируйте гиперпараметр, используя свои наблюдения и интуицию. Руководство по улучшению модели может оказаться полезным.
Используйте настройку гиперпараметров для автоматического тестирования большого количества возможных гиперпараметров.
Поскольку мы еще не видели алгоритм случайного леса и деревьев с усилением градиента, а количество примеров слишком мало для автоматической настройки гиперпараметров, вы будете улучшать модель вручную.
Дерево решений, показанное выше, небольшое, а лист с 61 примером содержит смесь меток Adelie и Chinstrap. Почему алгоритм не разделил этот лист дальше? Есть две возможные причины:
- Возможно, достигнуто минимальное количество образцов на лист (по умолчанию
min_examples=5
). - Дерево могло быть разделено, а затем подрезано, чтобы предотвратить переобучение.
Уменьшите минимальное количество примеров до 1 и посмотрите результат:
model = ydf.CartLearner(label=label, min_examples=1).train(train_dataset)
model.plot_tree()
Рисунок 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
Точность случайного леса лучше, чем у нашего простого дерева. На следующих страницах вы узнаете, почему.
Использование и ограничения
Как упоминалось ранее, одно дерево решений часто имеет более низкое качество, чем современные методы машинного обучения, такие как случайные леса, деревья с градиентным усилением и нейронные сети. Однако деревья решений по-прежнему полезны в следующих случаях:
- В качестве простой и недорогой основы для оценки более сложных подходов.
- Когда существует компромисс между качеством модели и интерпретируемостью.
- В качестве прокси для интерпретации модели леса решений, которую в курсе мы рассмотрим позже.