0

Я хотел бы знать, почему RandomForestClassifiers, которые я создаю в Python, используя scikit-learn, дает разные результаты, когда я повторяю обучение в одном наборе данных. Может кто-нибудь объяснить это мне, пожалуйста?Почему RandomForestClassifier scikit-learn не детерминирован в явной настройке?

Соответствующая часть моего кода заключается в следующем:

from sklearn.ensemble import RandomForestClassifier as RFC 
RFC(n_estimators=100, max_features=None, criterion="entropy", bootstrap=False) 

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

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

  • Приведены особенности f1 и f2
  • Для split в узле 1 алгоритм выбирает f1, а затем f2 для рассмотрения для этого разделения
  • Обе функции могут иметь одинаковое качество разделения, а f1 выбирается первым, когда он был нарисован первым
  • Для разделения в узле 2 алгоритм может быть как сначала выберите f2 и f1 и, следовательно, созданная модель может отличаться от других моделей, созданных этим алгоритмом.

Кому дается достоверная информация?

ответ

1

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

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

import random 
random.seed(<value>) 

... где является любой hashable константы вашего выбора. Я рекомендую вам целое число или строку. Я предлагаю это, потому что я подозреваю, что ваш RF-пакет использует пакет Python random - это может помочь вам избавиться от необходимости искать документацию.

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

+0

Спасибо за ваше время и ответ, Чернослив! Да, семя, конечно, «решит» эту проблему, сделав алгоритм детерминированным. Беда в том, что у меня есть особая проблема, и я не могу позволить себе пропустить семя. Вы пытались выразить всю случайность, оставшуюся в описанной установке, как я описал в примере? – vern

+0

КПП. RF-конструктор предлагает параметр random_state для определения семени. – vern

+0

Ah; Я вижу освещение, которое вы описываете. Тем не менее, я по-прежнему считаю, что ваши маркированные шаги определяют именно тот случай, когда вы получите разные результаты из серии прогонов. Можете ли вы проверить эту гипотезу с набором функций, в которых две функции не могут иметь одинаковое качество разделения? – Prune

Смежные вопросы