Визуально исследуйте, настраивайте и выбирайте модели машинного обучения

Содержание

  • Введение
  • Демонстрация классификации
  • Заключение
  • Рекомендации

Введение

Хорошо известно, что данные являются важной частью проектов машинного обучения (ML), особенно данные, которые используются в качестве входных данных для алгоритмов ML. Однако есть также данные, которые генерируются в процессе разработки модели, которым уделяется немного меньше внимания.

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

Практики могут просто распечатать или свести в таблицу некоторые из этих данных, но визуализация — это очень естественный способ быстро понять большую часть данных, полученных во время разработки модели. К сожалению, такие библиотеки, как matplotlib, предоставляют слишком низкоуровневый интерфейс для высокой производительности, а seaborn лучше подходит для статистической визуализации.

В этом посте рассказывается о Yellowbrick, библиотеке Python, которая представляет высокоуровневый интерфейс, построенный на основе matplotlib и scikit-learn, чтобы помочь нам построить общие визуализации, относящиеся к обучению, настройке и оценке модели.

Демонстрация классификации

В этом разделе я демонстрирую очень наглядный подход к разработке моделей ML с использованием scikit-learn и Yellowbrick путем обучения и оценки двух классификаторов деревьев решений для набора данных WINE [4] с использованием scikit-learn [5] и Yellowbrick [1].

Импорт и инициализация констант

import numpy as np
from sklearn.datasets import load_wine
from sklearn.model_selection import (
    cross_val_score,
    train_test_split
)
from sklearn.tree import DecisionTreeClassifier
from yellowbrick.classifier import confusion_matrix
from yellowbrick.model_selection import (
    learning_curve,
    validation_curve,
    cv_scores
)
from yellowbrick.target import class_balance
RANDOM_STATE = 42
CV = 10
NJOBS = -1
SCORING = "accuracy"
%matplotlib inline

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

wine = load_wine()
X, y = wine.data, wine.target

Проверить баланс классов

class_balance(y)

Функция Yellowbrick class_balance [6] позволяет нам легко визуализировать гистограмму частот классов для нашего набора данных. Гистограмма показывает, что WINE — это крошечный набор данных со скудными 178 примерами и что его классы достаточно сбалансированы. С помощью этой визуализации мы можем быстро определить наличие (или отсутствие) дисбаланса классов, что, в свою очередь, информирует нас о выборе метрик оценки и о том, нужны ли нам методы выборки, такие как избыточная выборка классов меньшинства или недостаточная выборка классов большинства.

Поскольку классы WINE достаточно сбалансированы, нам не потребуются какие-либо методы выборки, а стандартная метрика точности — достойный выбор для этой демонстрации.

Разделить данные

Здесь мы выполняем стратифицированное разделение набора данных WINE, чтобы использовать 75% его данных для обучения модели, а оставшиеся 25% — для тестирования. Функция train_test_split Scikit-learn по умолчанию выполняет стратифицированное разделение, которое сохраняет пропорции вхождений классов между полным набором данных и данными разделения.

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, random_state=RANDOM_STATE
)

Мы можем увидеть это с первого взгляда, передав метки обучения и теста функции class_balance.

class_balance(y_train=y_train, y_test=y_test)

Модели поездов

dt = DecisionTreeClassifier(random_state=RANDOM_STATE)
dt.fit(X_train, y_train)

Деревья решений — это простые, легко интерпретируемые модели со многими желательными свойствами, такими как небольшая подготовка данных и способность решать задачи прогнозирования нескольких классов. Тем не менее, изучающие деревья решений печально известны тем, что изучают слишком сложные деревья, что, как правило, приводит к моделям, которые подходят и плохо обобщаются.

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

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

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

learning_curve(
    estimator=dt,
    X=X_train,
    y=y_train,
    cv=CV,
    train_sizes=np.linspace(0.1,1.0,5),
    n_jobs=NJOBS,
    random_state=RANDOM_STATE,
    scoring=SCORING,
)

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

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

График предполагает, что у нас есть модель с высокой дисперсией, которая может выиграть от дополнительных данных. У нас также есть возможность использовать менее сложную модель того же типа или вообще модель другого типа. С любым из этих вариантов мы будем искать потенциальное снижение оценки обучения и улучшение оценки перекрестной проверки (восходящий тренд с уменьшенной изменчивостью).

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

Во-первых, давайте просмотрим максимальную глубину текущего дерева. Это не глубокое дерево при любом натяжении воображения, и этого следовало ожидать, учитывая размер набора данных WINE.

print(dt.tree_.max_depth) # 4

Затем мы можем использовать кривую проверки, чтобы построить график влияния гиперпараметра max_depth на показатели обучения и перекрестной проверки, чтобы узнать, может ли модель не соответствовать или не соответствовать некоторым значениям max_depth [3].

validation_curve(
    estimator=dt,
    X=X_train,
    y=y_train,
    param_name="max_depth",
    param_range=np.arange(1, 5),
    cv=CV,
    n_jobs=NJOBS,
    random_state=RANDOM_STATE
)

Подобно тому, что мы наблюдали на кривой обучения, наблюдается постоянно высокая вариабельность оценок перекрестной проверки. Мы также видим, что при прочих равных условиях дерево решений с max_depth, равным 3 (более простая модель, хотя и ненамного) может давать такие же результаты, как и полностью сформированное дерево.

Мы также могли бы визуализировать влияние других гиперпараметров, таких как min_samples_split и min_samples_leaf, но вы обнаружите, что их влияние меркнет по сравнению с влиянием max_depth для этой проблемы.

Теперь давайте изучим дерево решений с максимальной глубиной 3 и посмотрим, как оно сравнивается с полностью выросшим деревом с максимальной глубиной 4.

dt_md3 = DecisionTreeClassifier(
    max_depth=3, random_state=RANDOM_STATE
)
learning_curve(
    estimator=dt_md3,
    X=X_train,
    y=y_train,
    cv=CV,
    train_sizes=np.linspace(0.1,1.0,5),
    n_jobs=NJOBS,
    show=True,
    random_state=RANDOM_STATE,
    scoring=SCORING,
)

Эта кривая обучения очень похожа на кривую обучения необрезанного дерева решений. Есть некоторое возмущение в оценках обучения и перекрестной проверки, но кривая по-прежнему указывает на это новое дерево, демонстрирующее те же характеристики, что и первое. Модель остается более чувствительной к ошибкам из-за дисперсии, поскольку оценки обучения и перекрестной проверки сходятся в высшей точке. Больше обучающих данных и тип модели, который лучше учитывает эту дисперсию, по-прежнему остаются лучшими способами изучения модели, которая, скорее всего, будет хорошо обобщать.

Графики, которые следуют, показывают нам, насколько похожи два изученных дерева решений. Их оценки перекрестной проверки и матрицы путаницы очень похожи. Не так много можно сделать, чтобы значительно повысить производительность классификатора дерева решений в этом наборе данных.

Тем не менее, предыдущие шаги можно повторить для разных типов моделей (например, опорных векторов и knn), чтобы найти наиболее эффективную модель.

Сравнение результатов перекрестной проверки

cv_scores(
    dt,
    X_train,
    y_train,
    cv=CV,
    n_jobs=NJOBS,
    scoring=SCORING,
    random_state=RANDOM_STATE
)

cv_scores(
    dt_md3,
    X_train,
    y_train,
    cv=CV,
    n_jobs=NJOBS,
    scoring=SCORING,
    random_state=RANDOM_STATE
)

Сравнение матриц путаницы

confusion_matrix(dt, X_train, y_train, X_test, y_test)

confusion_matrix(dt_md3, X_train, y_train, X_test, y_test)

Заключение

Данные, сгенерированные во время разработки модели, необходимы для будущих итераций и экспериментов. Визуализации — это естественный способ осмысления этих данных, а Yellowbrick — это простая в использовании библиотека Python с высокоуровневым интерфейсом для построения общих визуализаций, относящихся к обучению, настройке и оценке моделей с помощью scikit-learn.

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

Рекомендации

  1. Yellowbrick: Визуализация машинного обучения
  2. Yellowbrick: Визуализация машинного обучения — кривая обучения
  3. Yellowbrick: визуализация машинного обучения — кривая валидации
  4. Дуа, Д. и Графф, К. (2019). Репозиторий машинного обучения UCI [http://archive.ics.uci.edu/ml]. Ирвин, Калифорния: Калифорнийский университет, Школа информационных и компьютерных наук. Набор данных WINE.
  5. Scikit-learn: Машинное обучение на Python
  6. Yellowbrick: визуализация машинного обучения — баланс классов

Akava будет рада помочь вашей организации адаптировать, развивать и внедрять инновации в ваши инициативы по модернизации. Если вы хотите обсудить, разработать стратегию или внедрить какой-либо из этих процессов, обратитесь по адресу [email protected] и укажите ссылку на этот пост.

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