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

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

Добро пожаловать в палатку.

Для вашего первого технического задания Пол и Прю хотят, чтобы вы приготовили классификатор "хлеб против торта".

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

Подумай еще раз.

Банановый хлеб. Бабка. Кукурузный хлеб Новой Англии. Маленькие булочки в обертках для кексов с легкой посыпкой сахарной пудрой и шоколадной соломкой. Еще не обескуражен? Вы должны быть. Машинное обучение было создано для широкого и разнообразного мира выпечки.

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

В лесу не получишь идеального дерева

Это цитата из вечно холодного Селаси, оправдывающая его матовый шоколадный оттенок, но она так же хорошо применима и к случайным лесам. Сила случайного леса заключается в том, что каждое дерево никогда не может быть идеальным - это происходит из-за мешков (b ootstrapping + agg regat ing), что означает, что как образцы, так и функции для каждого дерева в лесу являются лишь подмножеством полного набора образцов и функций. В случае образцов они загружены, что означает, что образцы для каждого дерева рисуются с заменой, поэтому для каждого обученного дерева можно использовать повторяющиеся образцы.

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

Готовься, готовься… ВЫПЕЧКА

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

Для нашего первого раунда упаковки мы загружаем образцы. Обратите внимание, как один из образцов хлеба, кукурузный хлеб, оказался дублированным, потому что мы случайным образом выбрали 4 образца (размер N из общего набора образцов) с заменой.

Мы также выбираем часть функций, выделенных фиолетовым цветом.

Теперь соотношение муки и глазурь должны конкурировать, чтобы быть верхним узлом в первом дереве, будучи лучшим разделителем B и C. Значения самого левого признака, отношения муки, находятся в диапазоне от 0,24 до 0,4. Мы берем его наименьшее значение и сначала пробуем разделить на FR ›0,24.

Удивительно, но мы получаем чистый сплит с первой попытки! FR ›0,24 для соотношения муки идеально отделяет хлеб от пирожных, что дает оценку Джини 0,0 для каждого разделения (см. ниже, что это такое). Посмотрим, что произойдет со следующим разделением, FR ›0,38.

Это разбиение порождает нечистые расщепления, потому что верхнее разбиение имеет 2 B и одно C, хотя нижнее разбиение имеет только один C. В конечном итоге верхнее разбиение будет иметь показатель Джини 0,444, что действительно очень нечисто.

Если мы посмотрим на единственное доступное разделение для следующей функции, F == N, вы увидите, что оно столь же нечистое.

Таким образом, мы возвращаемся к нашему первому удачному сплиту, FR ›0,24, и создаем наше первое дерево:

Поскольку он производит два чистых узла, мы достигли критерия остановки. В конце концов, если ваш узел содержит["C", "C"], как вы его разделите дальше? Отправляем дерево в лес и переходим к следующему.

Рекламная пауза: что такое оценка Джини?

def _prob(s, j):
    return len([x for x in s if x == j]) / len(s)
def gini_score(s, classes):
    return 1 - sum([_prob(s, j)**2 for j in classes])

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

classes = ["B", "C"]
gini_score(["B", "B"], classes)
> 0.0
gini_score(["C", "C", "C"], classes)
> 0.0

Однако, когда он становится нечистым:

gini_score(["B", "C", "C", "C"], classes)
> 0.375
gini_score(["B", "C", "C"], classes)
> 0.44444444
gini_score(["B", "C"], classes)
> 0.5

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

Пекари! У тебя остался один час! Вы на полпути

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

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

Как и в прошлый раз, давайте попробуем первое разделение самой левой функции, SR ›0,23.

Это нечеткое разделение с индексом Джини 0,444 и 0,0. Давайте попробуем следующий сплит, SR ›0,25.

К сожалению, это тоже нечисто, с индексом Джини 0,5 и 0,0. Вы можете увидеть, что это также верно, если вы попытаетесь расколоть глазурью.

Кажется, что, несмотря на несовершенство, SR ›0,23 выигрывает с небольшим отрывом. Однако на этом все не заканчивается. Мы можем использовать разбиения первого разбиения, чтобы сделать больше разбиений, создавая ветвящиеся древовидные структуры, обычно связанные с этим алгоритмом.

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

Пекари! Ваше время вышло. Пожалуйста, отойди от своего леса

Мудрость деревьев

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

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

Что думает классификатор, торт или хлеб?

Возьмем первое дерево. Здесь нужно посмотреть, есть ли FR ›0,24. На уровне 0,61 он немного больше, поэтому мы классифицируем его как торт, поскольку на нем дерево заканчивается.

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

Наше последнее дерево начинается с рассмотрения соотношения сахара, и мы видим, что оно попадает в левую часть раскола на дереве, поскольку 0,26 ›0,23.

Этот узел разделяется глазурью, и F == N на немаркированном образце перемещает его в левое разделение, наконец классифицируя этот образец как хлеб.

Судьи обсуждают и решают

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

Заключение

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