Объяснение параметров дерева решений Sklearn

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

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

Переобучение в деревьях решений

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

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

from sklearn.tree import DecisionTreeClassifier
#defaults
class sklearn.tree.DecisionTreeClassifier
(
*, criterion=’gini’, splitter=’best’, max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, class_weight=None, ccp_alpha=0.0
)

критерий

{"джини", "энтропия"}, по умолчанию = "джини"

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

Энтропия

«Энтропия увеличивается. Все идет под откос." Джон Грин

Энтропия на самом деле является очень глубоким понятием, философским предметом, а также предметом термодинамики. Это объясняется во втором законе термодинамики в Британике следующим образом:

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

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

p — вероятность i-го класса. Разделение с меньшей энтропией обеспечивает оптимальные результаты.

В следующем случае у нас есть один корневой узел и два внутренних узла. В каждом разделе есть образец «да» (+) и образец «нет» (-).

Давайте посчитаем энтропию узла А:

Энтропия для каждого узла:

Энтропия находится в диапазоне от 0 до 1. Если энтропия равна 0, рассматривайте его как чистое поддерево, а энтропия становится равной 1, если все метки равномерно распределены в листе; в нашем случае это 50%-50%. Энтропия узла B довольно близка к 1, потому что он имеет почти 50-процентную смесь образцов.

Получение информации

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

Теперь давайте посчитаем прирост информации в вышеприведенном процессе разделения.

Коэффициент усиления (S, A) = 0,940–(7/14).0,985–(7/14).592 = 0,151

Каждый раз мы выбираем разделы с более высоким приростом информации.

Примесь Джини

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

Давайте рассчитаем примесь Джини узла C в качестве примера:

Энтропия изменяется от 0 до 1, но примесь Джини колеблется от 0 до 0,5.

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

сплиттер

{“best, “random”}, default = “best”

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

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

max_features

int, float or {“auto,”sqrt”,”log2"}, default=None

Количество признаков, которые следует учитывать при разбиении. Мы можем определить максимальное количество функций, которые будут использоваться, задав целые числа и пропорционально задав числа с плавающей запятой. Если задано число с плавающей запятой, то max_features будет равно int(max_features * n_features). sqrt – это квадратный корень из общего количества объектов, а log2 – это log2 из общего количества объектов.

Ограничивая количество признаков, мы создаем подвыборку, которая является способом декорреляции деревьев. Рекомендуемые значения по умолчанию: m = p/3 для регрессии и квадратный корень из p для задач классификации в соответствии с Элементами статистического обучения.

Максимальная глубина

int, default = None

Он определяет максимальную глубину дерева. Если указано Нет, то разделение продолжается до тех пор, пока все листья не станут чистыми (или пока не будет достигнуто ограничение, указанное в параметре min_samples_split). Гипотетическое максимальное число или глубина будет равно number_of_training_sample-1, но древовидные алгоритмы всегда имеют механизм остановки, который не допускает этого.

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

min_samples_split

int or float, default = 2

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

Этот параметр (и min_sample_leaf) является защитным правилом. Это помогает остановить рост дерева.

min_samples_leaf

int or float, default = 1

Он определяет минимальное количество выборок, которое должен иметь внешний узел (лист). Практически держите его в диапазоне от 1 до 20.

min_weight_fraction_leaf

float, default = 0

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

случайное_состояние

int, RandomState instance or None, default = None

Раздача, настройка рандома.

max_leaf_nodes

int, default = None

Ограничьте максимальное количество листьев на дереве.

min_impurity_decrease

float, default = 0.0

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

класс_вес

dict, list of dict or “balanced”, default = None

Каждому классу можно присвоить вес. Если вы выберете «сбалансированный», он автоматически назначит вес в соответствии с частотой. Веса следует использовать в несбалансированных наборах данных для маркировки балансировки. На практике начните со «сбалансированного» варианта, а затем настройте вес методом проб и ошибок.

ccp_alpha

non-negative float, default = 0.0

Снижение сложности затрат. Это еще один параметр для управления размером дерева. Большие значения увеличивают количество удаляемых узлов.

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

Атрибуты

classes_: возвращает классы цели.

print(clf.classes_)
#[0 1 2]

feature_importances_: важность каждой функции (важность Джини).

print(clf.feature_importances_)
#[0.02666667 0.         0.55072262 0.42261071]

max_features_ , n_classes_ , n_features_in_ , n_outputs_:

Они возвращают все, на что указывают в своих именах.

print(clf.max_features_)
#4
print(clf.n_classes_)
#3
print(clf.n_features_in_)
#4
print(clf.n_outputs_)
#1

tree_: возвращает объект дерева.

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

from sklearn import tree
tree.plot_tree(elf)

Заключение

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

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

Читать далее…



Это для этой темы. Спасибо за чтение.

Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter и LinkedIn. Присоединяйтесь к нашему сообществу Discord.