Вопрос или проблема
Я очень запутался в том, как деревья решений выбирают признаки и пороговые значения для разбиения. Я полностью понимаю различные метрики разбиения (индекс Джини и так далее), используемые и то, как они работают. Но моя проблема заключается в том, как sklearn выбирает признаки и пороги для расчета этих метрик.
Оценщик sklearn.tree.DecisionTreeClassifier
имеет параметр splitter
. Позвольте мне сказать, что все ресурсы, доступные в Интернете, не очень хорошо объясняют этот параметр, и они противоречат друг другу. Я все еще не понимаю, что произойдет, если я установлю splitter="best"
: означает ли это, что алгоритм будет рассматривать все признаки со всеми их значениями, чтобы получить лучшее значение порога? И в этом случае атрибут max_features
не будет иметь никакого эффекта? А если я установлю splitter="random"
, алгоритм случайным образом выберет определенное количество признаков = max_features
из всех признаков и будет искать для каждого из этих признаков определенные случайные значения, чтобы найти порог для разбиения?
если я установлю splitter=”best”, означает ли это, что алгоритм будет рассматривать все признаки со всеми их значениями, чтобы получить лучшее значение порога ?? и в этом случае атрибут max_features не будет иметь никакого эффекта ?
Почти: max_features
все равно имеет значение здесь. Признаки max_features
выбираются случайным образом, но для каждого из них выбирается лучший среди всех возможных порогов.
И если я установлю splitter=”random”, алгоритм случайно выберет определенное количество признаков = max_features из всех признаков и будет искать для каждого из этих признаков определенные случайные значения, чтобы найти порог для разбиения ?
Верно, max_features
имеет такой же эффект независимо от разбиения, но когда splitter="random"
, вместо того чтобы проверять каждый возможный порог для разбиения на признаке, проверяется один случайный порог, выбранный равномерно между минимальным и максимальным значением признака. Исходный код
Каковы преимущества splitter="random"
по сравнению с splitter="best"
, кроме скорости обучения? И насколько это ускорение сказывается на времени тренировки?
Позволяет ли выбор случайных разбиений в каждом признаке получить более крупный ансамбль декоррелированных слабых учеников с низким смещением? Так что, когда они объединяются, модель достигает большей точности за счет более эффективного снижения общей дисперсии? Привнесет ли эта дополнительная случайность рост среднего смещения слабых учеников и компенсирует ли выигрыш в точности со стороны дисперсии?
Помните, что для случайного леса его смещение — это среднее смещение его слабых учеников, а дисперсия
$$
Var[X] = \rho(x)\sigma^2_{\mathcal{L}}(X) + \frac{1-\rho(x)}{M}\sigma^2_{\mathcal{L}}(X).
$$
$\rho(x) \in [0,1]$ указывает на корреляцию между слабыми учениками (т.е. если они выбираются случайным образом (независимо) $\rho \rightarrow 0$), $M$ — это размер ансамбля, а $\sigma^2_{\mathcal{L}}(X)$ — это дисперсия одного слабого ученика $\mathcal{L}$.
Таким образом, для эффективного уменьшения ошибки модели Random Forest нам нужно как можно больше случайности во время обучения слабых учеников, чтобы $\rho \rightarrow 0$, и увеличение $M$ сказалось. В таком случае
$$
\mathrm{as} \quad M\rightarrow \infty, \quad Var[X] = \rho(x)\sigma^2_{\mathcal{L}}(X) \rightarrow 0.
$$
На данный момент (1.5.2 последняя стабильная версия) модели случайного леса scikit-learn используют splitter=best
для своих деревьев решений и не позволяют менять это. Должно ли это быть разрешено и просто установить текущее значение по умолчанию? @разработчики sklearn!!
Источник:
ПОНИМАНИЕ СЛУЧАЙНЫХ ЛЕСОВ от теории к практике Гийом Луппе
2015
Ответ или решение
Вопрос о том, как внедряется параметр splitter
в классификаторе sklearn.tree.DecisionTreeClassifier
, действительно может быть запутанным, особенно когда касается различий между значениями best
и random
. Давайте разберёмся подробнее.
Параметр splitter
Параметр splitter
контролирует способ, которым алгоритм принимает решение о том, как делить узлы дерева. В scikit-learn
доступны два значения для этого параметра:
splitter="best"
splitter="random"
Когда splitter="best"
При выборе splitter="best"
алгоритм будет рассматривать все доступные признаки и вычислять лучший возможный порог (threshold) для каждого из них, основываясь на указанной метрике (например, критерии Джини или энтропии). Важно отметить, что на этапе выбора признаков все возможные пороги для лучшего признака анализируются, и алгоритм выбирает тот, который приводит к максимальному уменьшению неопределённости (минимизация метрики).
Однако даже при использовании splitter="best"
параметр max_features
по-прежнему оказывает влияние. В случае, если задано число max_features
, сначала выбираются только эти признаки перед поиском лучшего порога среди них.
Таким образом, если вы укажете splitter="best"
, алгоритм всё равно будет ограничен выбором по max_features
, но для каждого признака он будет учитывать все возможные пороги.
Когда splitter="random"
Если вы выберете splitter="random"
, то подход будет несколько отличаться. Алгоритм по-прежнему опирается на max_features
, как и прежде, однако вместо определения лучшего порога по всем значениям для выбранного признака, он случайным образом выбирает один порог из диапазона значений этого признака. Это добавляет элемент случайности в общий процесс, что может привести к созданию более разнообразных деревьев в ансамбле.
Преимущества использования splitter="random"
Преимущества splitter="random"
в основном связаны со скоростью обучения и некоторым улучшением обобщающих свойств ансамбля, особенно в контексте алгоритмов, таких как случайный лес. Вот несколько ключевых моментов:
-
Улучшение разнообразия: Использование случайных разбиений способствует созданию более разнообразных слабых учеников (weak learners), что может улучшить общую работу ансамбля. Разные деревья могут учиться на разных подмножествах данных и признаков, что в свою очередь способствует уменьшению переобучения.
-
Скорость обучения: Поскольку выбирается только один случайный порог, время, необходимое для обучения модели, значительно сокращается по сравнению с поиском наилучшего порога.
-
Декорреляция: Более высокая степень случайности может снизить корреляцию между деревьями в ансамбле, что также может уменьшить общую дисперсию окончательной модели.
Влияние на бедственное и диспетчерское начало
Вы правильно заметили, что увеличение случайности может привести к повышениям среднего бедственного начала отдельных слабых учеников. Однако в случае ансамблей, таких как случайные леса, это может быть компенсировано за счет уменьшения общей дисперсии, что, в свою очередь, может привести к улучшению предсказательных возможностей модели. Согласно теории ансамблей, когда количество моделей (M) увеличивается, общая вариация модели снижается, что можно выразить как:
$$
Var[X] = \rho(x) \sigma^2{\mathcal{L}}(X) + \frac{1 – \rho(x)}{M} \sigma^2{\mathcal{L}}(X).
$$
Таким образом, если ансамбль достаточно велик, корреляция между базовыми моделями (слабые ученики) может стать незначительной, и вариация конечной модели может значительно сократиться.
Заключение
Хоть в текущей реализации Randоm Forest
в scikit-learn
используется splitter="best"
с предустановленной возможностью выбора, в будущем предоставление возможности использовать splitter="random"
может увеличить разнообразие и улучшить характеристику модели. Исследуйте возможности, которые данный параметр предоставляет, и тестируйте, как это может повлиять на ваши конкретные задачи, чтобы оптимизировать модель под ваши задачи.