Использование примеси Джини в ваших интересах в классификаторах дерева решений

Эта статья станет первой частью потенциально продолжающейся серии статей, посвященных математическим концепциям, управляющим ключевыми параметрами алгоритмов машинного обучения, используемых в науке о данных. Моя цель в этих сообщениях будет заключаться в том, чтобы выразить ключевые понятия как можно более простым и нетехническим языком, не жертвуя при этом критической точностью самих понятий. Как известно любому хорошему специалисту по данным, понимание ваших данных — это гораздо больше, чем импорт оценщика из sklearn или statsmodels и ввод .fit() в ваш скрипт, даже если иногда даже самые опытные специалисты по данным могут сделать это так просто. Требуется много решения проблем, критического мышления и даже немного артистизма, причем каждая проблема с данными имеет свои собственные уникальные подходы, ограничения и возможности.

Чтобы быть эффективным, особенно в те разочаровывающие и сложные моменты, когда ваша модель просто не соответствует вашим надеждам или ожиданиям, необходимо быть знакомым и чувствовать себя комфортно с математическими концепциями «под капотом» в ваших алгоритмах машинного обучения. Настройка одного или двух параметров наугад или поиск вслепую по сетке по всем параметрам иногда могут привести вас туда, куда вам нужно, но это неэффективно и может привести к большой трате времени, особенно если обучение ваших моделей занимает несколько часов или больше, или крайний срок ближе, чем вы хотели бы. Бывают также случаи, когда никакая тонкая настройка не решит проблемы, присущие вашему проекту, и заблаговременное осознание этого может сэкономить вам несколько потенциально потерянных дней разочаровывающей и бесплодной работы. В этой статье я углублюсь в метрику по умолчанию, которая определяет, как классификатор дерева решений генерирует узлы, которые он делает, — примесь Джини.

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

Примесь Джини — что это такое?

Прежде всего, примесь Джини — это показатель потерь, а это означает, что более высокие значения менее желательны для вашей модели (и для вас), чем более низкие значения. Во-вторых, он ограничен вариантом классификатора моделей дерева решений, так как он должен подчиняться дискретным целевым значениям (или классам), чтобы дать согласованное значение. Чуть позже мы углубимся в подробности, но, подытоживая, примесь Джини определяет вероятность того, что случайно выбранный класс в подмножестве ваших данных будет неправильно помечен, если вы случайно присвоите этому классу метку. Чем ниже вероятность, тем «чище» класс или тем выше вероятность того, что ваше случайное присвоение класса будет правильным. Например, если подмножество ваших данных содержит только 1 класс, вероятность неправильной маркировки этого класса равна 0. Таким образом, примесь Джини похожа на многие другие метрики и функции потерь, с которыми может быть знаком специалист по данным, например среднеквадратичная ошибка для стандартных моделей регрессии или показатель логарифмических потерь во многих стандартных задачах классификации.

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

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

Как это работает?

Формула примеси Джини:

где C представляет общее количество классов в подмножестве данных, а i – выбранный класс из C. Для тех, у кого нет сильных математических знаний, эта формула может показаться выглядит немного устрашающе, но на самом деле это удивительно просто. Вероятность выбора класса i (это p(i)) умножается на вероятность не выбора i (которая равна 1 — p(i )) очень похоже на типичное биномиальное распределение с двумя испытаниями (1 с событием k и 1 без события k). Когда вы суммируете их для каждого i в вашем наборе классов C, это дает вам общую вероятность неправильного выбора любых случайных данных в вашем подмножестве, если вы случайным образом назначаете класса к нему: или, другими словами, статистическое выражение для «чистоты» классов в вашем подмножестве данных.

Вот краткий и простой пример, чтобы помочь с пониманием. Допустим, у меня в мешке 4 шарика: 2 синих и 2 зеленых. Вероятность выбора синего шарика составляет 2/4, или 50%. У меня также есть 50% вероятность не выбрать синий шарик. Вероятность того, что вы выберете или не выберете зеленый шарик, абсолютно одинакова, поэтому мы ожидаем, что показатель «чистоты» будет равен 0,5 (поскольку есть два равномерно распределенных класса). Вот, вкратце, формула примеси Джини для этого небольшого статистического эксперимента:

Джини = p(B) * (1 - p(B) + p(G) * (1 - p(G)) = 0,5 * 0,5 + 0,5 * 0,5 = 0,25 + 0,25 = 0,5

Вывод здесь таков: если я вытащу шарик из мешка и перед тем, как посмотреть на него, скажу: «Этот шарик зеленый», вероятность того, что я прав, составляет 50%. Это все хорошо, но как мы это интерпретируем? Это «хороший» показатель примесей или «плохой»?

Чтобы понять это, важно знать еще одно небольшое уравнение, которое является ключом к правильной интерпретации оценки примесей Джини и тому, что оно может рассказать вам о ваших данных. Поскольку я определил общее количество классов как Cвыше, возможный диапазон оценок примесей Джини для эксперимента составляет от минимального значения 0 до максимального значения 1 — (1/C), где 0 означает идеальную чистоту одного класса, а (1–1 / C) представляет собой полностью однородное распределение каждого класса и минимально возможную степень чистоты. С этими двумя классами это означает, что наихудший балл, который я мог получить, был 1 — (1/2) = 1–0,5 = 0,5. Итак, это показатель того, что мои занятия вовсе не «чисты» в этом подмножестве моей мраморной сумки. Если бы вместо этого у меня было 3 класса, наименьшая возможная чистая оценка была бы 1 — (1/3) = 0,6667. Чем больше у вас классов, тем выше может быть примесь.

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

Что это может сказать вам о ваших данных?

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

Например, если ваше дерево решений имеет большую глубину с небольшим уменьшением примеси Джини на каждом уровне новых узлов, это может указывать на то, что целевые классы недостаточно хорошо разделены функциями, переданными в модель. Вы можете искусственно ограничить глубину дерева, передав ограничивающий аргумент max_depth, или ограничить размер выборки конечного узла, передав min_samples_leaf, что может упростить слишком сложную модель. Кроме того, аргумент min_impurity_decrease позволит вам указать модели делать только «ценные» разбиения, разделяя данные только в том случае, если примесь Джини уменьшается на заданную величину. Если ни одна из этих корректировок не привела к желаемым результатам, может потребоваться вернуться к этапу EDA, чтобы определить лучшие функции для проектирования или передачи в модель. Если по-прежнему возникают трудности с выявлением сильных учеников в имеющихся у вас функциях, на этом этапе ваши данные могут выиграть от неконтролируемого обучения, такого как анализ основных компонентов или кластеризация k-средних, в целях лучшего разделения ваших целевых классов.

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

class_weight = {0:1, 1:5}

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

В заключение

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

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