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

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

Я считаю, что развитие этого навыка является обязательным, чтобы стать лучшим инженером по машинному обучению.
С этой целью я начал разрабатывать библиотеку Python woodpecker, чтобы помочь мне понять структуру модели и причину, по которой модель работает. . Первая версия библиотеки содержит логику для DecisionTreeClassifier из библиотеки sklearn, но если библиотека окажется полезной для меня или для сообщества, я продолжу использовать ее для других алгоритмов, таких как DecisionTreeRegression, RandomForest или другие. ансамбли на основе дерева.

В этой статье предполагается, что у вас есть базовое понимание того, как работает дерево решений, и вы знакомы с такими терминами, как узлы разделения / листьев, энтропия или получение информации. Если нет, просто поищите в Интернете, там полно хороших руководств :). Мне лично нравится этот список видеоуроков (качество звука не очень хорошее)

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

  • 1-й = верхний
  • 2-й = средний
  • 3-й = Нижний

Возраст: возраст является дробным, если он меньше 1. Если возраст оценен, указывается ли он в форме xx.5
Стоимость: цена билета
Sex_label: обозначить закодированный объект для необработанного объекта "Секс". Он представляет пол пассажира:

  • 0 = женский
  • 1 = Мужской

Cabin_label: обозначение закодированного объекта для необработанного объекта "Кабина". Он представляет собой номер каюты.
Embarked_label: метка закодированного объекта для необработанного объекта Embarked. Он представляет собой порт посадки.

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

  • 1 = выжил
  • 0 = не выжил

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

А теперь давайте представим, что это первый раз, когда мы видим набор данных и у нас очень мало знаний о нем в предметной области.
Наша первая попытка - это дерево решений с глубиной = 10.

Характеристики модели следующие:

  • точность поезда 0,917
  • действительная точность 0,821

Как мы видим, наша модель переоснащается. Это могло быть вызвано слишком большой глубиной, несоответствующим разделением поезда / проверки или другими причинами. У нас нет четкой подсказки, поэтому давайте визуализируем дерево и попытаемся понять его структуру.

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

Когда я решил разработать эту библиотеку, я начал ее преследовать две основные цели:

  • чтобы помочь мне лучше понять структуру модели и ее производительность
  • чтобы помочь мне объяснить прогнозы моделей для технических / нетехнических специалистов.

Вы можете установить его, просто запустив pip install git +« https://github.com/tlapusan/woodpecker.git « в своем терминале. После его установки вы можете получить доступ к возможностям библиотеки для DecisionTreeClassifier с помощью класса DecisionTreeStructure.

Как видите, я инициализировал его с помощью обученной модели solution_tree, с обучающим набором, списком функций и целевой переменной.

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

  • энтропия измеряет степень загрязнения узла. Значение диапазона для энтропии составляет [0,1], где 1 означает, что узел полностью нечистый (плохой), а 0 означает, что узел полностью чистый (хороший).
  • samples: количество выборок из обучающей выборки, достигающих узла.

Используя дятел, мы можем очень просто получить общий обзор примесей в листьях.

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

Как видим, на большинстве листьев очень мало образцов. Теперь мы точно знаем, почему наша модель переоснащается, и у нас есть подсказка, какие гиперпараметры нужно изменить, чтобы уменьшить переобучение. В этом сценарии рекомендуется уменьшить значение max_depth и / или увеличить значения min_samples_split и min_samples_leaf.

Выше мы рассмотрели информацию о листьях в целом, но что, если мы хотим получить представление о листьях по отдельности.

Эти две визуализации содержат информацию для каждого листа, на ax oX у нас есть идентификаторы листовых узлов:

  • первая визуализация содержит примеси листьев (ax oY)
  • второй содержит образцы листьев по классам (ax oY)

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

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

Интересно, что все женщины (Sex_label = 0), из более высокого социально-экономического статуса (Pclass ± 1), купили дорогой билет (средний (тариф) = 78,5), и большинство из них в возрасте от 22 до 38 лет. Эта информация имеет значение для улучшения наши знания предметной области по набору данных titanic.

Теперь давайте посмотрим в противоположном направлении, лист 98, примерно с 23 образцами и все с меткой класса 0 (не сохранились).

Все мужчины (Sex_label = 1), имеют более низкий социально-экономический статус (Pclass ± 2,7), купили более дешевый билет (средний (тариф) = 10,9), и большинство из них в возрасте от 16 до 18 лет. мы уже можем видеть закономерности в нашем наборе данных. У богатых женщин молодого и среднего возраста был очень высокий шанс выжить, а у молодых бедняков - нет. Интересный !

Давайте посмотрим на 129-й лист, у которого как-то 50/50 шансов выжить.

Все образцы выглядят как мужчины (Sex_label = 1), из более высокого социально-экономического статуса (Pclass = 1), купившие дорогой билет (средний (тариф) = 59,7), и большинство из них в возрасте от 28 до 45 лет. идеи, почему ... давайте посмотрим на отдельные образцы из этого листа:

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

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

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

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

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

Это все для этого поста! Надеюсь, вы нашли библиотеку woodpecker полезной

Вы можете ознакомиться с ним поближе на github: https://github.com/tlapusan/woodpecker

Я буду очень рад, если у вас появятся предложения, как его улучшить или какие еще визуализации добавить. Просто дайте комментарий ниже 😉

Первоначально опубликовано на http://tudorlapusan.ro 20 мая 2019 г.