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

Шаги по созданию случайного леса

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

Работа случайного леса

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

Как быть с отсутствующими данными?

Есть два типа отсутствующих данных,

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

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

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

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

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

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

Проект: Прогноз сердечного приступа

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

После того, как у нас есть набор данных, давайте откроем блокнот Jupyter и начнем писать код.

Во-первых, давайте импортируем необходимые библиотеки и читаем файл CSV,

Давайте начнем изучать фрейм данных,

Мы проверяем наличие повторяющихся значений в наборе данных.

df[df.duplicated()]

Мы получаем следующий вывод, указывающий, что есть повторяющаяся строка

Теперь нам нужно удалить эту строку,

updated_df = df.drop(164)

Теперь наш следующий шаг — разделить набор данных на наборы данных для тестирования и обучения. Мы решили использовать 30% данных в качестве данных тестирования.

Теперь мы используем модель случайного классификатора от Sklearn,

Из вывода видно, что наша модель работает с точностью 87%, давайте попробуем повысить точность, изменив количество деревьев в нашем лесу.

Из выходного графика видно, что наша точность достигает пика около 107 деревьев.

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

Создание случайного леса с нуля

Чтобы построить наше дерево, нам понадобятся математические формулы для энтропии и прироста информации,

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

Из энтропии мы вычисляем еще один важный параметр, называемый информационным приростом.

Теперь пришло время перейти к коду,

Во-первых, давайте закодируем функции для расчета энтропии и прироста информации.

Теперь наш следующий шаг — сгенерировать наш загрузочный набор данных из данного набора данных.

Мы также добавили вспомогательную функцию для вычисления оценки «из коробки» для оценки нашего дерева.

Далее нам нужна функция для разбиения дерева по определенным значениям случайных признаков.

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

  • индекс функций
  • значение для разделения на
  • Левый дочерний узел
  • Правый дочерний узел

Нам также нужна функция, чтобы решить, когда прекратить разбиение узла. Мы проверяем, есть ли у правого дочернего или левого дочернего элемента 0 наблюдений, если это так, у нас есть терминальный узел. У нас также есть терминальный узел, если мы достигли max_depth. Мы также проверяем, достиг ли правый или левый дочерний элемент min_samples_split.

Наш следующий шаг - построить наш лес.

Таким образом, мы построили случайный лес с нуля.

Надеюсь, вам понравилась статья!

Ваше здоровье!