Гиперпараметры Случайного леса
Материал из Documentation.
Гиперпараметры Случайного леса — параметры Случайного леса, которые не изучаются из данных, а задаются до начала обучения модели. Они критически важны для контроля сложности модели, её склонности к переобучению или недообучению, а также для оптимизации производительности и скорости обучения.
Содержание |
[править] Гиперпараметры
[править] Параметры, контролирующие размер и количество ансамблей
n_estimators (integer, default=100):
- Назначение: Определяет количество деревьев решений в лесу.
- Детали: Чем больше деревьев, тем более стабильными и надёжными становятся предсказания, поскольку эффект усреднения/голосования сглаживает индивидуальные ошибки отдельных деревьев. Однако, после определённого порога прирост точности становится незначительным, а время обучения и предсказания, а также потребление памяти, увеличиваются линейно с n_estimators.
- Влияние:
- Увеличение: Снижает дисперсию модели (уменьшает переобучение), повышает стабильность. Увеличивает время обучения и потребление памяти.
- Уменьшение: Увеличивает дисперсию, снижает стабильность. Уменьшает время обучения и потребление памяти.
- Рекомендации по тюнингу: Начните с 100—200. Постройте график зависимости метрики качества (например, OOB-оценки) от n_estimators, чтобы найти точку, где прирост точности замедляется.
bootstrap (boolean, default=True):
- Назначение: Определяет, использовать ли бутстрэп-выборки (выборки с возвращением) при построении каждого дерева.
- Детали: Если True, каждое дерево обучается на случайной выборке данных с возвращением, что является ключевым элементом бэггинга и обеспечивает разнообразие деревьев. Если False, каждое дерево обучается на всем исходном наборе данных, что делает деревья более похожими и увеличивает корреляцию между ними, тем самым снижая преимущества ансамбля. В этом случае это будет просто «лес» из деревьев решений, а не «случайный лес» в полном смысле.
- Влияние:
- True (по умолчанию): Снижает дисперсию, улучшает обобщающую способность, позволяет использовать OOB-оценку.
- False: Увеличивает дисперсию, может привести к переобучению, OOB-оценка недоступна.
- Рекомендации по тюнингу: Почти всегда оставляйте True. Изменение на False — очень редкий случай, когда вы сознательно хотите уменьшить случайность и проверить эффект.
oob_score (boolean, default=False):
- Назначение: Определяет, использовать ли «вне-буферизованные» (Out-of-Bag, OOB) образцы для оценки обобщающей способности модели.
- Детали: При использовании бутстрэп-выборок для обучения каждого дерева, примерно 37 % исходных обучающих образцов не попадают в выборку для данного дерева. Эти «вне-буферизованные» образцы можно использовать для оценки производительности дерева, а затем усреднить эти оценки по всем деревьям. OOB-оценка является несмещенной оценкой ошибки обобщения и может служить заменой кросс-валидации.
- Влияние:
- True: Позволяет получить внутреннюю оценку качества модели без необходимости выделения отдельного валидационного набора или выполнения кросс-валидации. Увеличивает время обучения незначительно.
- False: Не рассчитывает OOB-оценку.
- Рекомендации по тюнингу: Установите True во время тюнинга гиперпараметров, чтобы быстро оценить изменения производительности.
[править] Параметры, контролирующие структуру отдельных деревьев
Эти параметры во многом совпадают с параметрами обычного DecisionTreeClassifier или DecisionTreeRegressor. Они контролируют, насколько «глубоким» или «сложным» может быть каждое отдельное дерево.
max_features (string, int or float, default="sqrt" для классификации, «1.0» для регрессии):
- Назначение: Определяет количество признаков, которые случайным образом выбираются для рассмотрения при поиске лучшего разбиения на каждом узле дерева. Это ключевой параметр, обеспечивающий случайность и разнообразие деревьев в лесу.
- Детали:
- int: Использует max_features признаков.
- float: Использует max_features * n_features признаков (процент от общего числа признаков).
- «auto» / «sqrt»: sqrt(n_features) признаков. Это значение по умолчанию для классификации.
- «log2»: log2(n_features) признаков.
- «1.0»: Использует все n_features признаков. Это значение по умолчанию для регрессии в некоторых версиях, но чаще рекомендуется P/3 или max_features=1.0 (что эквивалентно бэггингу деревьев без случайности признаков).
- Влияние:
- Меньшее значение (sqrt, log2): Увеличивает разнообразие деревьев, снижает корреляцию между ними, что обычно снижает дисперсию ансамбля. Может увеличить смещение, если оптимальный признак для разбиения часто исключается. Ускоряет обучение.
- Большее значение (1.0, auto в старых версиях): Деревья становятся более похожими (коррелированными), что может увеличить дисперсию ансамбля. Может снизить смещение, если позволяет деревьям использовать наиболее информативные признаки. Замедляет обучение.
- Рекомендации по тюнингу:
- Для классификации: sqrt (или auto) обычно является хорошим стартом.
- Для регрессии: 1.0 (все признаки) или P/3 (где P — общее количество признаков) часто используются как отправные точки.
- Экспериментируйте с разными значениями, чтобы найти оптимальный баланс.
max_depth (integer or None, default=None):
- Назначение: Определяет максимальную глубину каждого дерева в лесу.
- Детали: Если None, узлы расширяются до тех пор, пока все листья не станут чистыми (для классификации) или пока не достигнут минимального количества выборок для разбиения (min_samples_split). Глубокие деревья склонны к переобучению на обучающих данных.
- Влияние:
- None (глубокие деревья): Каждое отдельное дерево будет сильно переобучено, но ансамбль Random Forest обычно хорошо справляется с этим благодаря усреднению. Может привести к очень сложным моделям и долгому обучению.
- Ограниченная глубина (например, 5-10): Уменьшает сложность отдельных деревьев, что может увеличить смещение, но снизить дисперсию. Ускоряет обучение и уменьшает потребление памяти.
- Рекомендации по тюнингу: Для Random Forest часто оставляют None, полагаясь на другие параметры для контроля переобучения. Если модель всё ещё переобучается или обучение слишком медленное/требует много памяти, попробуйте ограничить max_depth.
min_samples_split (integer or float, default=2):
- Назначение: Минимальное количество выборок, необходимых для разбиения внутреннего узла.
- Детали: Если количество выборок в узле меньше этого значения, узел не будет разбит, и станет листом.
- Влияние:
- Большее значение: Предотвращает создание слишком специфичных (переобученных) узлов и ветвей, увеличивает смещение, уменьшает дисперсию.
- Меньшее значение (например, 2): Позволяет деревьям быть более гибкими и потенциально переобучаться.
- Рекомендации по тюнингу: Увеличивайте, чтобы уменьшить переобучение, но не слишком сильно, чтобы не вызвать недообучение.
min_samples_leaf (integer or float, default=1):
- Назначение: Минимальное количество выборок, которые должны находиться в конечном узле (листе).
- Детали: Разбиение будет разрешено только в том случае, если оно не приведёт к созданию листа, содержащего меньше выборок, чем min_samples_leaf.
- Влияние:
- Большее значение: Гарантирует, что каждый лист представляет достаточное количество данных, что уменьшает переобучение и увеличивает смещение.
- Меньшее значение (например, 1): Позволяет создавать листы, представляющие всего один образец, что может привести к сильному переобучению.
- Рекомендации по тюнингу: Увеличивайте, чтобы уменьшить переобучение. Часто min_samples_leaf более эффективен для контроля переобучения, чем min_samples_split.
min_weight_fraction_leaf (float, default=0.0):
- Назначение: Минимальная взвешенная доля от общего числа выборок (или их весов), которая должна быть в конечном узле (листе).
- Детали: Похож на min_samples_leaf, но учитывает веса выборок (sample_weight). Если веса выборок не используются, он эквивалентен min_samples_leaf (с учётом общего количества выборок).
- Влияние: Аналогично min_samples_leaf, но с учетом весов.
- Рекомендации по тюнингу: Редко используется, если только вы не работаете с взвешенными выборками.
max_leaf_nodes (integer or None, default=None):
- Назначение: Определяет максимальное количество листовых узлов в дереве.
- Детали: Ограничивает количество конечных узлов. Если None, количество листовых узлов не ограничено.
- Влияние: Альтернативный способ контроля сложности дерева, похожий на max_depth. Меньшее количество листовых узлов означает более простое дерево, что увеличивает смещение и уменьшает дисперсию.
- Рекомендации по тюнингу: Обычно используется либо max_depth, либо max_leaf_nodes, но не оба одновременно.
min_impurity_decrease (float, default=0.0):
- Назначение: Узел будет разбит, если это разбиение приводит к уменьшению неопределённости (impurity) большему или равному этому значению.
- Детали: Пороговое значение для «качества» разбиения. Если разбиение не улучшает качество достаточно сильно, оно не будет выполнено.
- Влияние: Большее значение приводит к более агрессивной обрезке дерева (pruning), увеличивает смещение, уменьшает дисперсию.
- Рекомендации по тюнингу: Может быть полезен для тонкой настройки сложности дерева.
[править] Параметры, определяющие критерий разбиения
criterion (string, default="gini" для классификации, «squared_error» для регрессии)
- Назначение: Функция, используемая для измерения качества разбиения.
- Детали:
- Для классификации:
- «gini» (Gini impurity): Мера вероятности неправильного классифицирования случайно выбранного элемента, если он помечен случайным образом в соответствии с распределением меток в узле. Обычно немного быстрее, чем энтропия.
- «entropy» (Information Gain): Мера уменьшения неопределённости после разбиения.
- Для регрессии:
- «squared_error» (Mean Squared Error, MSE): Среднеквадратичная ошибка, уменьшение которой является целью при разбиении. Это эквивалент `mse` из старых версий.
- «absolute_error» (Mean Absolute Error, MAE.): Средняя абсолютная ошибка. Менее чувствительна к выбросам, чем MSE.
- «poisson»: Используется для задач, где целевая переменная представляет собой счёт (count data), предполагая распределение Пуассона.
- Для классификации:
- Влияние: Выбор критерия может слегка влиять на структуру дерева и, следовательно, на производительность. На практике разница между `gini` и `entropy` для классификации часто минимальна.
- Рекомендации по тюнингу: Обычно оставляют значения по умолчанию (`gini` для классификации, `squared_error` для регрессии), так как они хорошо работают в большинстве случаев. Можете попробовать `entropy` или `absolute_error`, если дефолтные варианты не дают желаемых результатов.
[править] Другие параметры
random_state (integer or RandomState instance, default=None):
- Назначение: Контролирует генератор случайных чисел, используемый для бутстрэп-выборок при построении каждого дерева, а также для выбора признаков на каждом узле.
- Детали: Если вы зададите фиксированное целое число, то каждый раз при запуске кода с теми же данными и гиперпараметрами вы будете получать абсолютно одинаковые результаты. Это критически важно для воспроизводимости экспериментов.
- Влияние: Обеспечивает воспроизводимость.
- Рекомендации по тюнингу: Всегда устанавливайте фиксированное целое число (например, 42) для отладки и сравнения моделей.
n_jobs (integer, default=None):
- Назначение: Количество ядер CPU, которые будут использоваться для параллельного выполнения задач (обучение и предсказание).
- Детали:
- None: Используется 1 ядро.
- 1: Используется 1 ядро.
- −1: Используются все доступные ядра CPU.
- int > 1: Используется указанное количество ядер.
- Влияние: Значительно ускоряет обучение и предсказание, особенно для больших n_estimators и/или больших наборов данных.
- Рекомендации по тюнингу: Устанавливайте «-1» для максимального использования ресурсов, если это не мешает другим процессам на вашей машине.
verbose (integer, default=0):
- Назначение: Управляет уровнем детализации вывода во время обучения и предсказания.
- Детали:
- 0: Без вывода.
- 1: Выводит сообщения о ходе обучения.
- 2: Выводит более подробные сообщения.
- Влияние: Полезно для отслеживания прогресса на длительных тренировках.
- Рекомендации по тюнингу: Установите 1 или 2 для мониторинга.
warm_start (boolean, default=False):
- Назначение: Если `True`, позволяет повторно использовать решение предыдущего вызова `fit` и добавлять больше деревьев к ансамблю.
- Детали: Полезно, если вы хотите постепенно увеличивать n_estimators без необходимости переобучать весь лес с нуля.
- Влияние: Может сэкономить время при итеративном увеличении n_estimators.
- Рекомендации по тюнингу: Используйте, если вы планируете постепенно добавлять деревья к уже обученной модели.
class_weight (dict, list of dicts, «balanced», «balanced_subsample» or None, default=None):
- Только для классификации.
- Назначение: Веса, связанные с классами. Используется для работы с несбалансированными наборами данных, где некоторые классы представлены гораздо реже, чем другие.
- Детали:
- None: Все классы имеют вес 1.
- «balanced»: Автоматически регулирует веса классов обратно пропорционально частоте их появления в данных.
- «balanced_subsample»: То же, что и «balanced», но веса вычисляются на основе бутстрэп-выборки для каждого дерева, а не всего набора данных.
- dict: Пользовательский словарь весов {class_label: weight}.
- Влияние: Увеличивает важность миноритарных классов, помогая модели лучше их распознавать, что может увеличить Recall для этих классов, но потенциально снизить общую точность.
- Рекомендации по тюнингу: Используйте «balanced» или «balanced_subsample» при работе с несбалансированными данными.
ccp_alpha (non-negative float, default=0.0):
- Назначение: Параметр сложности, используемый для минимально-стоимостной обрезки (Minimal Cost-Complexity Pruning).
- Детали: Любая ветвь, которая приводит к уменьшению нечистоты (impurity) меньше, чем ccp_alpha, будет обрезана. Чем больше ccp_alpha, тем сильнее обрезаются деревья.
- Влияние: Более высокие значения ccp_alpha приводят к меньшим деревьям, что увеличивает смещение и уменьшает дисперсию. Это форма пост-обрезки.
- Рекомендации по тюнингу: Обычно не является основным параметром для тюнинга Random Forest, так как ансамбль сам по себе хорошо справляется с переобучением отдельных деревьев. Однако, может быть полезен в некоторых случаях для дальнейшего упрощения деревьев.