Использование мудрости нескольких классификаторов для повышения производительности

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

Материалы и методы: Используя Scikit-learn, мы генерируем набор данных типа Мадлон для задачи классификации. Затем будут индивидуально обучены классификатор опорных векторов (SVC), Nu-Support Vector classifier (NuSVC), многослойный перцептрон (MLP) и классификатор случайного леса. Эффективность каждого классификатора будет измеряться с использованием площади под рабочей кривой приемника (AUC). Наконец, мы складываем прогнозы этих классификаторов с помощью объекта StackingCVClassifier и сравниваем результаты.

Аппаратное обеспечение: мы обучаем и оцениваем наши модели на рабочей станции, оснащенной Inter (R) Core (TM) i7–8700 с 12 процессорами с тактовой частотой 3,70 ГГц и NVIDIA GeForce RTX 2080.

Примечание. Если вы начинаете с нуля, советую следовать этой статье, чтобы установить все необходимые библиотеки. Наконец, предполагается, что читатель знаком с методами Python, Pandas, Scikit-learn и ensemble. Все содержание этой статьи можно найти на моем GitHub. Добро пожаловать на его форк.

Обозначение: полужирный текст будет представлять либо список, словарь, кортеж, объект Pandas DataFram e, либо будет относиться к рисунку или сценарию. This notation will be used to represent parameters in an object or command lines to run in the terminal.

Что такое стекинг?

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

Чтобы предотвратить утечку информации в тренировку от цели (то, что вы пытаетесь предсказать), при наложении классификаторов следует соблюдать следующее правило:

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

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

Более надежный способ сделать это - использовать k-кратную перекрестную проверку для генерации прогнозов первого уровня. Здесь обучающие данные разбиты на k-кратные сегменты. Затем первые k-1 складок используются для обучения классификаторов первого уровня. Затем свертка проверки используется для генерации подмножества прогнозов первого уровня. Процесс повторяется для каждой уникальной группы. Рисунок 2 иллюстрирует этот процесс.

Заядлый читатель может задаться вопросом, а почему бы не сложить еще один уровень классификаторов? Что ж, вы можете, но это добавит сложности вашему стеку. Например, рассмотрим следующую архитектуру:

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

Сложить или не складывать - вот в чем вопрос.

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

  • Возможно ли получить больше данных? В машинном обучении данные имеют решающее значение (наибольший прирост производительности можно получить, собрав больше данных); поэтому, если это возможно, вам следует сосредоточить свои усилия на сборе большего и разнообразного набора данных.
  • Можно ли добавить дополнительные функции к вашему набору данных? Например, вы можете использовать значения интенсивности пикселей в изображении как функции. Вы также можете извлекать из этих изображений элементы текстуры, что учитывает пространственное распределение значений интенсивности пикселей. Важно собрать как можно больше характеристик из рассматриваемой проблемы. Это должно быть сделано просто потому, что вы не знаете, какие из этих функций являются хорошими предикторами. Помните, что предсказательная сила любой модели должна в основном основываться на функциях, используемых для ее обучения, а не на самом алгоритме.
  • Вы правильно обработали все свои данные? Если вы засунете мусор в модель, мусор должен вылезти наружу. Убедитесь, что вы визуально исследуете все свои функции, чтобы лучше понять их. Позаботьтесь об отсутствующих значениях, выбросах и убедитесь, что ваш набор данных не является чрезмерно несбалансированным. Масштабируйте свои функции, удалите все избыточные функции, примените методы выбора функций, если у вас большое количество функций, и подумайте о проектировании функций.
  • Изучили ли вы прогностическую эффективность большого набора классификаторов с вашим набором данных? Вы тщательно настраивали эти классификаторы?

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

Установка необходимых модулей

Самый простой способ реализовать архитектуру стекирования, показанную на рисунке 2, - использовать библиотеку Python MLXTEND. Чтобы установить его, прочтите их файл ReadMe на GitHub, который находится здесь. Если у вас есть Anaconda в Windows, запустите командную строку Anaconda, перейдите в среду conda, в которую вы хотите установить этот модуль, и выполните следующую команду:

conda install -c conda-forge mlxtend

или вы можете использовать pip:

pip install mlxtend

Отказ от ответственности: я почти уверен, что это не сломает вашу среду Python, но если это не так, не вините меня. Вот руководство Как установить среду машинного обучения на основе Python в Windows с помощью Anaconda для заинтересованного читателя.

Набор данных

Мы сгенерируем синтетический набор данных, подобный Мадлону, с помощью Scikit-learn для задачи классификации. Это тот же набор данных, который я использовал для исследования производительности различных моделей в предыдущей статье, которую я опубликовал в Medium. Набор данных Madelon - это искусственный набор данных, который содержит 32 кластера, размещенных в вершинах пятимерного гиперкуба со сторонами длиной 1. Кластеры случайным образом помечены 0 или 1 (2 класса).

Набор данных, который мы сгенерируем, будет содержать 30 функций, из которых 5 будут информативными, 15 - избыточными (но информативными), 5 из них будут повторяться, а последние 5 будут бесполезны, так как они будут заполнены случайными шум. Столбцы набора данных будут упорядочены следующим образом:

  1. Информационные функции - столбцы 1–5. Эти функции - единственное, что вам действительно нужно для построения вашей модели. Следовательно, пятимерный гиперкуб.
  2. Избыточные функции - столбцы 6–20. Эти признаки создаются путем линейного комбинирования информативных признаков с разными случайными весами. Вы можете думать об этом как о специально разработанных функциях.
  3. Повторяющиеся элементы - столбцы 21–25. Эти элементы выбираются случайным образом из информативных или повторяющихся функций.
  4. Бесполезные функции - столбцы 26–30. Эти особенности наполнены случайным шумом.

Начнем с импорта библиотек.

Теперь мы можем сгенерировать данные.

Разделение и предварительная обработка данных

Получив данные, мы можем приступить к созданию набора для обучения и тестирования.

Теперь мы можем масштабировать наш набор данных. Мы сделаем это с помощью нормализации Z-балла.

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

Классификаторы

В целях иллюстрации мы обучим классификатор опорных векторов (SVC), классификатор многослойного персептрона (MLP), классификатор опорных векторов Nu (NuSVC) и классификатор случайного леса (RF) - классификаторы доступны в Scikit-learn. . Гиперпараметры для этих классификаторов будут установлены - будем считать, что мы сделали все, что могли. Проще говоря, если ваши классификаторы - мусор, их стопка, вероятно, тоже будет мусором. Кроме того, для получения воспроизводимых результатов был исправлен random_state на каждом из этих классификаторов.

Классификатор стекирования

Чтобы сложить их, мы будем использовать StackingCVClassifier из MLXTEND. Я рекомендую вам взглянуть на официальную документацию, поскольку в ней подробно описаны полезные примеры того, как реализовать StackingCVClassifier. Например, он показывает вам, как складывать классификаторы, которые работают с разными подмножествами функций - это так здорово. Наконец, мы установим для параметра use_probas в StackingCVClassifier значение True. Это означает, что классификаторы на первом уровне будут передавать прогнозы, которые являются вероятностями, а не двоичным выходом (0 или 1). Однако это не означает, что вам следует использовать этот параметр. Для вашей работы может оказаться более полезным, если вы установите use_probas в значение False; однако единственный способ узнать это - это сделать это на самом деле. В качестве meta_classifier мы выбираем SVC и используем его параметры по умолчанию.

Наконец, для удобства мы поместили все классификаторы в словарь.

Учебные классификаторы

Мы обучаем каждый классификатор и сохраняем его в словаре с пометкой классификаторы. После обучения классификатор будет сохранен в том же словаре.

Прогнозы

Теперь мы готовы делать прогнозы на тестовой выборке. Здесь мы сначала создаем results, объект DataFrame pandas. Затем, используя цикл for, мы перебираем обученные классификаторы и сохраняем прогнозы в результатах. Наконец, в строке 14 мы добавляем новый столбец с меткой «Цель» с фактическими целями, либо

Визуализация результатов

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

Отлично! Каждый классификатор индивидуально получил AUC менее 0,909; однако, сложив их, мы получили AUC = 0,918. Это неплохой импульс, не правда ли?

Настройка классификатора стекирования

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

100 * 100 * 100 * 100 = 100 миллионов моделей, которые вам нужно уместить

Если предположить, что для установки каждой модели требуется 0,5 секунды, это займет 50 миллионов секунд или больше, проще говоря 1,6 года. На это ни у кого нет времени. В этом расчете не учитывался тот факт, что мета-классификатор не является фиксированным и содержит собственные параметры, которые необходимо настроить. Вот почему я бы порекомендовал вам сначала настроить классификаторы индивидуально. После этого их можно складывать и настраивать только мета-классификатор. Если вы все же решили настроить стек классификаторов, убедитесь, что вы настроили оптимальную точку в пространстве параметров для каждого из них.

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

The AUC of the tuned Stacking classifier is 0.923

Отлично, нам удалось поднять AUC классификатора стекирования с 0,918 до 0,923, настроив мета-классификатор. Однако на этом мы не закончили. Посмотрим, сможем ли мы получить больше от классификатора Stacking. Для этого мы создадим набор классификаторов стекирования, каждый с уникальной комбинацией / стеком классификаторов на первом уровне. Для каждого классификатора Stacking будет настроен мета-классификатор. Результаты будут распечатаны на консоли.

AUC of stack ('SVC', 'MLP'): 0.876
AUC of stack ('SVC', 'NuSVC'): 0.877
AUC of stack ('SVC', 'RF'): 0.877
AUC of stack ('MLP', 'NuSVC'): 0.876
AUC of stack ('MLP', 'RF'): 0.877
AUC of stack ('NuSVC', 'RF'): 0.877
AUC of stack ('SVC', 'MLP', 'NuSVC'): 0.875
AUC of stack ('SVC', 'MLP', 'RF'): 0.876
AUC of stack ('SVC', 'NuSVC', 'RF'): 0.879
AUC of stack ('MLP', 'NuSVC', 'RF'): 0.875
AUC of stack ('SVC', 'MLP', 'NuSVC', 'RF'): 0.923

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

Заключительные замечания

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

Вы можете найти меня в LinkedIn.