Привет, Хабр! Меня зовут Александр Серов, я Data Scientist и являюсь участником профессионального сообщества NTA.  Сегодня загляну «под капот» алгоритмов, использующих в своей основе деревья решений. Один из самых мощных алгоритмов контролируемого машинного обучения на сегодня – градиентный бустинг (Catboost, XBGR), построен на столь казалось легком и базовом элементе, как бинарное дерево, или же дерево решений. Оно является строительным блоком данного алгоритма, в данном случае можно привести притчу про веник и его части, но в этом случае, иногда даже одно дерево решений способно выдать неплохой результат в решениях задач классификации и регрессии. Сегодня я рассмотрю его подробнее, на примере Decision Tree и Random Forest из библиотеки sklearn, а также визуализирую работу.  В практике всегда возникает проблема верного выявления гипотез, в моей работе с этим помогают модели машинного обучения, но и их необходимо контролировать. Визуализация весов - один из способов это сделать. Обучать и тестировать модели буду на двух наборах данных, взятых из открытого источника - Kaggle. Данные с числовыми признаками для задачи классификации наличия диабета у человека. Данные с категориальными признаками для задачи предсказания оценок по математике.  Начну с задачи классификации. Набор данных основан на определенных диагностических измерениях, ограничен 1000 значений, где были выбраны женщины из индейского племени Пима. Изучим подробное описание каждого признака: Pregnancies – количество беременностей; Glucose – концентрация глюкозы в плазме крови; BloodPressure – дистолическое давление крови; SkinThickness – толщина кожи трицепса; Insulin – содержания инсулина в крови; BMI – индекс массы тела; DiabetesPedigreeFunction – показатель функции генетического диабета; Age – возраст; Outcome – наша целевая переменная, где 0 – нет диабета, 1 – есть. Цель, как указывалось выше, переменная "Outcome", то есть бинарный признак. В следующем шаге разделим набор данных на тренировочную выборку и тестовую, с пропорциями 71:29 (можете поэкспериментировать с данным показателем, допустим разброс, зависимый от количества данных и их разнообразия). После того, как подготовил данные, начну обучение с модели DecisionTreeClassifier. Это всё то же бинарное дерево решений, для автоматического подбора параметров модели используем GridSearchCV. Необходимо для нахождения оптимального решения и оптимизации затрат по времени. Точность на тренировочных данных: 74.31Точность на тестовых данных: 72.65 Полученная точность нашей модели - 72%, что уже довольно неплохо, а это ведь только 1 дерево. К сведению, если применять данную модель в реальных условиях мы можем уменьшить порог для классификации положительного результата (tresholding), так как в жизни ложноположительный результат лучше, чем ложноотрицательный, потому что можно провести углубленные исследование. Но для этой модели сейчас важна абсолютная точность. Теперь попробуем визуализировать результат и посмотреть, как модель распределяла веса для классификации целевого признака.   Нужно добавить немного теории, чтобы понять нашу визуализацию. Модель выбрала алгоритм работы на основе энтропии: Энтропия в свою очередь направлена на максимизацию получения информации. Это можно легко представить, как будто мы угадываем загаданного персонажа. И чтобы как можно быстрее это сделать, нам необходимо сужать круг вариантов как можно больше с каждым вопросом. Также популярен другой вариант, это коэффициент Gini: С индексом Джини в качестве цели дерево выбирает на каждом шаге признак и порог, который будет их разделять. Но мне больше нравится другой способ визуализации c помощью библиотеки dtreeviz, давайте посмотрим на него.  Инфографика процесса представлена более подробно. Видим, как дерево отбирает решения, максимизирует информацию. Глубина дерева получилось всего 3, где задействованы все признаки, а это отличный результат для анализа. Это действительно полезно, так как можем сравнить полученную информацию с медицинскими гипотезами, подтвердив точность своей модели. Судя из графиков, при высоком уровне сахара в крови - шанс наличия диабета повышен, что совпадает с общепринятыми данными. Сейчас предлагаю рассмотреть вариант с задачей регрессии (предсказания). Для этого используем второй набор данных об успеваемости студентов на экзамене. Он состоит из полученных оценок по различным предметам. Gender – пол студента; Race/ethnicity – этническая группа (данные обезличены); Parental level of education – уровень образования родителей; Lunch – тип питания; Test preparation score – оценка подготовки к экзаменам; Math score – оценка по математике; Reading score – оценка по чтению; Writing score – оценка по письму. Выберу целевой признак - оценки по математике (math score), метрику - абсолютную ошибку. Так как данные являются категориальными, необходимо их обработать и перевести в числовой формат, использую для этого LabelEncoder. Обучу модель, применяя аналогичный подход с авто-параметрами. Средняя абсолютная ошибка на тестовых данных: 5.722 Дерево решений получилось глубже, чем в первом случае, так как задача регрессии здесь требует больше данных. Здесь алгоритмом работы бинарного дерева выступала средняя абсолютная ошибка. По визуализации весов можно сделать несколько выводов: Модель в основном задействовала оценки по другим предметам. Навыки письма имеют связь с гендером, то есть значительно коррелируют. Этническая принадлежность студента не использовалась*. Образование родителей также не влияет на оценки*. "*" - имеют очень малое влияние, поэтому бинарное дерево выбрало другие признаки Возможно, исключив оценки по другим предметам, были бы задействованы не вошедшие факторы, но пострадала бы и точность предсказания. В моем случае разброс +-6 баллов из 100. И настал заключительный момент, проверить визуализации весов на алгоритме случайного леса. Он является ансамблевой моделью, то есть он использует для предсказания переменной несколько моделей внутри себя. В данном случае модель обучает несколько бинарных деревьев (со случайной генерацией random_seed) и усредняет их показатели, в результате повышается точность. Обучать буду модель классификации, после чего выведу визуализацию всех деревьев в его ансамбле. Точность на тестовых данных: 77.8% Как можно увидеть - выросла точность предсказания с 72% до 77%, в общем итоге, в «лесу» 12 бинарных деревьев, в идеале можно вывести каждые из них и проанализировать. Для примера я вывел 5 первых деревьев, чтобы в общем рассмотреть их структуру. Сохранять изображение лучше в векторном формате «svg», чтобы можно было увеличить изображения без потери качества. Анализируя структуру вижу, что увеличилась глубина деревьев, она выросла до 7, также многие из них стали несимметричные (одна из веток имеет значительно больше разветвлений). Обобщу полученные в ходе работы результаты. Деревья решений - строительный блок более серьёзных и эффективных моделей, поэтому, контролируя его, аналитики повышают общие результаты работы. В нашем случае, визуализация помогает не только выполнять прямое назначение - видеть результаты работы весов внутри обученной модели, но и помогает создавать и подтверждать гипотезы, которые предлагает машинное обучение, как видно на примере классификации диабета. Проделанной работой можно повысить качество любого исследования, а также предоставить специалистам, не работающим с машинным обучением, полезную информацию.  Профессиональное сообщество