что плохого в случайных лесах random forest

Алгоритм классификации Random Forest на Python

Случайный лес (Random forest, RF) — это алгоритм обучения с учителем. Его можно применять как для классификации, так и для регрессии. Также это наиболее гибкий и простой в использовании алгоритм. Лес состоит из деревьев. Говорят, что чем больше деревьев в лесу, тем он крепче. RF создает деревья решений для случайно выбранных семплов данных, получает прогноз от каждого дерева и выбирает наилучшее решение посредством голосования. Он также предоставляет довольно эффективный критерий важности показателей (признаков).

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

Алгоритм Random Forest

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

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

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

Вышеупомянутый процесс принятия решения состоит из двух частей.

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

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

Как работает случайный лес?

Алгоритм состоит из четырех этапов:

что плохого в случайных лесах random forest. Смотреть фото что плохого в случайных лесах random forest. Смотреть картинку что плохого в случайных лесах random forest. Картинка про что плохого в случайных лесах random forest. Фото что плохого в случайных лесах random forest

Поиск важных признаков

Random forest также предлагает хороший критерий отбора признаков. Scikit-learn предоставляет дополнительную переменную при использовании модели случайного леса, которая показывает относительную важность, то есть вклад каждого показателя в прогноз. Библиотека автоматически вычисляет оценку релевантности каждого признака на этапе обучения. Затем полученное значение нормализируется так, чтобы сумма всех оценок равнялась 1.

Такая оценка поможет выбрать наиболее значимые показатели и отбросить наименее важные для построения модели.

Случайный лес использует критерий Джини, также известный как среднее уменьшение неопределенности (MDI), для расчета важности каждого признака. Кроме того, критерий Джини иногда называют общим уменьшением неопределенности в узлах. Он показывает, насколько снижается точность модели, когда вы отбрасываете переменную. Чем больше уменьшение, тем значительнее отброшенный признак. Таким образом, среднее уменьшение является необходимым параметром для выбора переменной. Также с помощью данного критерия можете быть отображена общая описательная способность признаков.

Сравнение случайных лесов и деревьев решений

Создание классификатора с использованием Scikit-learn

Вы будете строить модель на основе набора данных о цветках ириса, который является очень известным классификационным датасетом. Он включает длину и ширину чашелистика, длину и ширину лепестка, и тип цветка. Существуют три вида (класса) ирисов: Setosa, Versicolor и Virginica. Вы построите модель, определяющую тип цветка из вышеперечисленных. Этот датасет доступен в библиотеке scikit-learn или вы можете загрузить его из репозитория машинного обучения UCI.

Источник

Случайный лес vs нейросети: кто лучше справится с задачей распознавания пола в речи (ч.2)

Первая часть нашего гайда была посвящена интересной задаче машинного обучения – распознаванию пола по голосу. Мы описали общий подход к большинству задач speech processing и с помощью случайного леса, обученного на статистиках акустических признаков, решили задачу с довольно большой точностью – 98,4% верно классифицированных аудиофрагментов.

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

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

Очередная глава о том, как работают нейронные сети

Считается, что искусственная нейронная сеть (нейросеть) – это математическая модель человеческого мозга. На самом деле нет: 50-60 лет назад биологи на определенном уровне изучили электрические процессы в мозге, а математики создали упрощенную модель и запрограммировали.

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

Но не все так гладко: нейросеть может научиться отличать гепарда от леопарда, а может посчитать одним из этих животных пятнистый диван. Кроме того, процессы обучения человека и машины разные: компьютеру нужны тысячи обучающих примеров, тогда как человеку хватает нескольких. Очевидно, что работа искусственных нейронных сетей не сильно похожа на мышление человека, и они являются не компьютерной моделью мозга, а лишь еще одним классом моделей в списке: Random Forest, SVM, XGBoost и т.д., хоть и с выгодными особенностями.

Исторически первая рабочая архитектура нейронной сети – многослойный персептрон. Он состоит из слоев, а каждый слой – из нейронов. Сигнал передается в одну сторону – от первого слоя к последнему, и каждый нейрон текущего слоя связан со всеми нейронами предыдущего, причем с разными весами. Вес связи между двумя нейронами имеет физический смысл ее значимости: чем больше его значение, тем больший вклад будет внесен в выходное значение нейрона. Обучить нейросеть – значит найти такие значения весов, чтобы на выходном слое получалось то, что нам нужно.

что плохого в случайных лесах random forest. Смотреть фото что плохого в случайных лесах random forest. Смотреть картинку что плохого в случайных лесах random forest. Картинка про что плохого в случайных лесах random forest. Фото что плохого в случайных лесах random forest

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

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

Сегодня самой широко применяемой рекуррентной архитектурой является Long Short-Term Memory (LSTM). В простейшей реализации в каждой ячейке присутствуют три особенных элемента: входной, выходной и вентиль забывания. Они определяют, в каких пропорциях нужно «смешать» обработанные входные данные и запомненные значения, чтобы на выходе получился наиболее полезный сигнал. Обучить LSTM сеть – значит найти такие параметры вентилей и веса связей между LSTM ячейками на первых слоях и нейронами последних слоев, при которых для входной последовательности выходной слой возвращал бы вероятности принадлежности к каждому из классов.

что плохого в случайных лесах random forest. Смотреть фото что плохого в случайных лесах random forest. Смотреть картинку что плохого в случайных лесах random forest. Картинка про что плохого в случайных лесах random forest. Фото что плохого в случайных лесах random forest

Первоначальные настройки

Надеемся, что вы прочитали первую часть этого гайда. В ней можно найти описание речевой базы, вычисленных признаков, а также результаты работы классификатора Random Forest. Он обучался на статистиках признаков, подсчитанных на хороших (до определенного предела), отфильтрованных участках речи – фреймах. Для каждого признака считались среднее, медианное, минимальное и максимальное значения, а также стандартное отклонение.

Нейросети более требовательны к количеству обучающих примеров. В прошлой части мы обучались на 436 аудиофрагментах от 109 спикеров (по четыре высказывания для каждого), взятых из базы VCTK. Оказалось, что ни одна из проверенных нами нейросетевых архитектур не смогла обучиться до разумных значений точности, и мы взяли больше фрагментов – всего 5000. Однако увеличенная выборка не привела к значительному росту точности – 98,5% верно классифицированных фрагментов. Первый эксперимент, который мы хотим поставить, заключается в обучении полносвязной нейронной сети на том же наборе признаков.

Весь код продолжаем писать на Python, реализацию нейронных сетей берем из Keras – удобнейшей библиотеки, посредством которой можно реализовать нужные архитектуры за пару строк.

Импортируем все, что нам понадобится:

Реализацию случайного леса берем из sklearn, оттуда же – кросс-валидацию по группам. Из Keras берем базовый класс для моделей, слои, враппер Bidirectional, позволяющий использовать двунаправленную LSTM, а также функцию to_categorical, кодирующую метки классов в one-hot вектора.

И получаем выборку:

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

Дальше нужно реализовать полносвязную нейронную сеть:

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

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

Dense – непосредственно полносвязные слои. Их выходы представляют собой классическую взвешенную с некоторыми весами сумму входных сигналов, нелинейно преобразованную с помощью функции активации. На первых слоях это tanh, а на последнем – softmax, чтобы сумма выходного сигнала равнялась единице и соответствовала вероятностям быть в одном из классов. Model checkpoint – это скорее декоративная штука, перезаписывающая модель после каждой эпохи обучения, только если мера ошибки на тестовой выборке – validation loss – меньше, чем у прошлой сохраненной модели. Так гарантируется, что в model.weights будет записана наиболее эффективная модель.

Остается описать процесс кросс-валидации по спикерам и сравнить описанную выше полносвязную сеть и случайный лес на одних и тех же данных:

Получили примерно одинаковые значения точности – 98,6% для случайного леса и 98,7% для нейронной сети. Вероятно, можно оптимизировать параметры и получить более высокую точность, но сразу приступим к тому, ради чего все и затевалось: к рекуррентным сетям.

Для начала требуется составить выборку из последовательностей. Keras, несмотря на свою простоту, иногда бывает привередливым, и тут необходимо, чтобы входные переменные в методы .fit или .fit_on_batch могли быть естественным образом преобразованы в тензоры. Например, последовательности разной длины (а у нас именно этот случай) таким свойством не обладают.

Это сугубо техническое ограничение библиотеки можно обойти несколькими способами. Первый – обучение на батчах размера 1. Очевидные минусы такого подхода – неприменимость batch normalization и катастрофическое увеличение времени обучения.

Второй способ заключается в дописывании нулей к последовательности (padding), чтобы получилась нужная размерность. На первый взгляд это кажется неправильным, но сеть обучается не реагировать на такие значения. Также эти методы можно комбинировать – разбить последовательности по длине на несколько групп, внутри каждой провести padding и обучать.

Мы рассмотрим последовательности длины 100 – это соответствует одной секунде речи. Для этого длинные последовательности обрежем так, чтобы осталось ровно 100 точек, причем симметричных относительно середины, а короткие дополним нулями в начале и конце до искомой длины.

Враппер Bidirectional с помощью merge_mode склеивает выходы слоя-аргумента для обычной входной последовательности и в обратном порядке. В нашем случае это LSTM слой со 100 ячейками. Флаг return_sequences определяет, будет ли возвращаться последовательность внутренних состояний ячеек, либо вернется только последняя.

Внутри LSTM и после рекуррентных слоев применяется dropout, а после последнего слоя (у которого return_sequences=False) стоит softmax функция активации. Также модель компилируется с оптимизатором Rmsprop – модификацией стохастического градиентного спуска. На практике часто оказывается, что для рекуррентных сетей он работает лучше, хотя это строго не доказано и всегда может быть по-другому.

Ура! 99,1% верно классифицированных точек на 5-fold кросс-валидации по спикерам. Это лучший результат среди всех рассмотренных архитектур.

Заключение

Львиная доля гидов по машинному обучению, статей и научно-популярных материалов посвящены распознаванию изображений. Сильно реже – обучению с подкреплением. Еще реже – audio processing. Отчасти, наверное, это связано с тем, что методы «из коробки» для обработки аудио не работают, и приходится тратить свое время на понимание процессов, предобработку данных и прочие неизбежные итерации. Но ведь именно сложность делает задачу интересной.

Распознавание пола кажется простой задачей, ведь человек справляется с ней практически безошибочно. Но ее решение методами машинного обучения «в лоб» демонстрирует точность около 70%, что объективно мало. Однако даже простые алгоритмы позволяют достичь точности около 97-98%, если делать всё правильно: например, отфильтровать исходные данные. Сложные нейросетевые подходы увеличивают точность до более чем 99%, что едва ли принципиально отличается от человеческих показателей.

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

Над материалом работали:

Источник

Реализация и разбор алгоритма «случайный лес» на Python

Авторизуйтесь

Реализация и разбор алгоритма «случайный лес» на Python

что плохого в случайных лесах random forest. Смотреть фото что плохого в случайных лесах random forest. Смотреть картинку что плохого в случайных лесах random forest. Картинка про что плохого в случайных лесах random forest. Фото что плохого в случайных лесах random forest

Использование готовых библиотек, таких как Scikit-Learn, позволяет легко реализовать на Python сотни алгоритмов машинного обучения.

В этой статье мы научимся создать и использовать алгоритм «случайный лес» (Random Forest) на Python. Помимо непосредственного изучения кода, мы постараемся понять принципы работы модели. Этот алгоритм составлен из множества деревьев решений, поэтому сначала мы разберёмся, как одно такое дерево решает проблему классификации. После этого с помощью алгоритма решим проблему, используя набор реальных научных данных. Весь код, используемый в этой статье, доступен на GitHub в Jupyter Notebook.

Как работает дерево решений

Дерево решений — интуитивно понятная базовая единица алгоритма случайный лес. Мы можем рассматривать его как серию вопросов да/нет о входных данных. В конечном итоге вопросы приводят к предсказанию определённого класса (или величины в случае регрессии). Это интерпретируемая модель, так как решения принимаются так же, как и человеком: мы задаём вопросы о доступных данных до тех пор, пока не приходим к определённому решению (в идеальном мире).

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

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

Дерево решений для простой задачи

Начнём с проблемы простой бинарной классификации, изображённой на диаграмме.

что плохого в случайных лесах random forest. Смотреть фото что плохого в случайных лесах random forest. Смотреть картинку что плохого в случайных лесах random forest. Картинка про что плохого в случайных лесах random forest. Фото что плохого в случайных лесах random forest

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

18–20 ноября, Онлайн, Беcплатно

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

Мы используем Scikit-Learn, чтобы создать дерево решений и обучить ( fit ) его, используя наши данные.

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

Можно проверить точность предсказаний нашей модели:

Разумеется, мы получим точность 100 %, так как сообщили модели правильные ответы ( y ) и не ограничивали глубину дерева. Но следует помнить, что подобная подгонка дерева решений под тренировочные данные может спровоцировать переобучение модели.

Визуализация дерева решений

Что же на самом деле происходит при обучении дерева решений? Хороший способ понять это — визуализация модели при помощи соответствующей функции Scikit-Learn (подробнее функция рассматривается в данной статье).

что плохого в случайных лесах random forest. Смотреть фото что плохого в случайных лесах random forest. Смотреть картинку что плохого в случайных лесах random forest. Картинка про что плохого в случайных лесах random forest. Фото что плохого в случайных лесах random forest

Во всех узлах, кроме листьев (цветные узлы без исходящих связей), содержится 5 частей:

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

Чтобы взглянуть на дерево решений под другим углом, мы спроецируем разделения модели на исходные данные.

что плохого в случайных лесах random forest. Смотреть фото что плохого в случайных лесах random forest. Смотреть картинку что плохого в случайных лесах random forest. Картинка про что плохого в случайных лесах random forest. Фото что плохого в случайных лесах random forest

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

Загрязнение Джини

Теперь самое время рассмотреть концепцию загрязнения Джини (математика не так уж страшна, как кажется). Загрязнение Джини — вероятность неверной маркировки в узле случайно выбранного образца. К примеру, в верхнем (корневом) узле вероятность неверной классификации образца равна 44.4 %. Это можно вычислить с помощью уравнения:

что плохого в случайных лесах random forest. Смотреть фото что плохого в случайных лесах random forest. Смотреть картинку что плохого в случайных лесах random forest. Картинка про что плохого в случайных лесах random forest. Фото что плохого в случайных лесах random forest

Загрязнение Джини узла n равно 1 минус сумма отношений класса к общему количеству образцов pi, возведённых в квадрат, для каждого из множества классов J (в нашем случае это всего 2 класса). Звучит сложно, поэтому покажем, как вычисляется загрязнение Джини для корневого узла:

что плохого в случайных лесах random forest. Смотреть фото что плохого в случайных лесах random forest. Смотреть картинку что плохого в случайных лесах random forest. Картинка про что плохого в случайных лесах random forest. Фото что плохого в случайных лесах random forest

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

Затем процесс разделения повторяется с использованием «жадной», рекурсивной процедуры, пока дерево не достигнет максимальной глубины или в каждом узле не останутся только образцы одного класса. Общевзвешенное загрязнение Джини должно уменьшаться с каждым уровнем. В нашем случае на втором уровне оно составит 0.333:

что плохого в случайных лесах random forest. Смотреть фото что плохого в случайных лесах random forest. Смотреть картинку что плохого в случайных лесах random forest. Картинка про что плохого в случайных лесах random forest. Фото что плохого в случайных лесах random forest

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

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

Переобучение, или почему лес лучше одного дерева

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

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

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

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

Поиск баланса между излишней и недостаточной гибкостью модели является ключевой концепцией машинного обучения и называется компромиссом между вариативностью и погрешностью (bias-variance tradeoff).

Алгоритм дерева решений переобучается, если не ограничить его максимальную глубину. Он обладает неограниченной гибкостью и может разрастаться, пока не достигнет состояния идеальной классификации, в которой каждому образцу из набора данных будет соответствовать один лист. Если вернуться назад к созданию дерева и ограничить его глубину двумя слоями (сделав только одно разделение), классификация больше не будет на 100 % верной. Мы уменьшаем вариативность за счёт увеличения погрешности.

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

Случайный лес

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

Случайная выборка тренировочных образцов

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

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

Случайные наборы параметров для разделения узлов

Вторая базовая концепция случайного леса заключается в использовании определённой выборки параметров образца для разделения каждого узла в каждом отдельном дереве. Обычно размер выборки равен квадратному корню из общего числа параметров. То есть, если каждый образец набора данных содержит 16 параметров, то в каждом отдельном узле будет использовано 4. Хотя обучение случайного леса можно провести и с полным набором параметров, как это обычно делается при регрессии. Этот параметр можно настроить в реализации случайного леса в Scikit-Learn.

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

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

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

Поэтому нужно не опираться на решение какого-то одного аналитика, а собрать вместе их прогнозы. Более того, как и при использовании случайного леса, нужно разрешить каждому аналитику доступ только к определённым новостным источникам, в надежде на то, что эффекты шумов будут нейтрализованы выборкой. В реальной жизни мы полагаемся на множество источников (никогда не доверяйте единственному обзору на Amazon). Интуитивно нам близка не только идея дерева решений, но и комбинирование их в случайный лес.

Алгоритм Random Forest на практике

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

Набор данных

Мы попробуем рассчитать состояние здоровья пациентов в бинарной системе координат. В качестве параметров мы используем социально-экономические и персональные характеристики субъектов. В качестве меток мы используем 0 для плохого здоровья и 1 для хорошего. Этот набор данных был собран Центром по Контролю и Предотвращению Заболеваний и размещён в свободном доступе.

что плохого в случайных лесах random forest. Смотреть фото что плохого в случайных лесах random forest. Смотреть картинку что плохого в случайных лесах random forest. Картинка про что плохого в случайных лесах random forest. Фото что плохого в случайных лесах random forest

Как правило 80 % работы над научным проектом заключается в изучении, очистке и синтезировании параметров из сырых данных (подробнее узнать можно здесь). Однако в этой статье мы сосредоточимся на построении модели.

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

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

После нескольких минут обучения модель будет готова выдавать прогнозы для тестовых данных:

Мы рассчитаем прогнозы классификации ( predict ) наряду с прогностической вероятностью ( predict_proba ), чтобы вычислить ROC AUC.

Результаты

Итоговое тестирование ROC AUC для случайного леса составило 0.87, в то время как для единичного дерева с неограниченной глубиной — 0.67. Если вернуться к результатам обработки тренировочных данных, обе модели покажут эффективность, равную 1.00 на ROC AUC. Этого и следовало ожидать, ведь мы предоставили готовые ответы и не ограничивали максимальную глубину каждого дерева.

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

Мы можем визуализовать кривую ROC для одиночного дерева (верхняя диаграмма) и для случайного леса в целом (нижняя диаграмма). Кривая лучшей модели стремится вверх и влево:

что плохого в случайных лесах random forest. Смотреть фото что плохого в случайных лесах random forest. Смотреть картинку что плохого в случайных лесах random forest. Картинка про что плохого в случайных лесах random forest. Фото что плохого в случайных лесах random forest

что плохого в случайных лесах random forest. Смотреть фото что плохого в случайных лесах random forest. Смотреть картинку что плохого в случайных лесах random forest. Картинка про что плохого в случайных лесах random forest. Фото что плохого в случайных лесах random forest

Случайный лес значительно превосходит по точности одиночное дерево.

Ещё один способ оценить эффективность построенной модели — матрица погрешностей для тестовых прогнозов.

что плохого в случайных лесах random forest. Смотреть фото что плохого в случайных лесах random forest. Смотреть картинку что плохого в случайных лесах random forest. Картинка про что плохого в случайных лесах random forest. Фото что плохого в случайных лесах random forest

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

Значимость параметра

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

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

Визуализация единичного дерева леса

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

что плохого в случайных лесах random forest. Смотреть фото что плохого в случайных лесах random forest. Смотреть картинку что плохого в случайных лесах random forest. Картинка про что плохого в случайных лесах random forest. Фото что плохого в случайных лесах random forest

Следующие шаги

Следующим шагом будет оптимизация случайного леса, которую можно выполнить через случайный поиск, используя RandomizedSearchCV в Scikit-Learn. Оптимизация подразумевает поиск лучших гиперпараметров для модели на текущем наборе данных. Лучшие гиперпараметры будут зависеть от набора данных, поэтому нам придётся проделывать оптимизацию (настройку модели) отдельно для каждого набора.

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

Реализацию случайного поиска для оптимизации модели можно изучить в Jupyter Notebook.

Полностью рабочий образец кода

Приведённый ниже код создан с помощью repl.it и представляет полностью рабочий пример создания алгоритма случайного леса на Python. Можете самостоятельно его запустить и попробовать поэкспериментировать, изменяя код (загрузка пакетов может занять некоторое время).

Заключение и выводы

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

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

В этой статье мы разобрали следующие ключевые концепции:

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *