Может ли классификатор случайного леса sklearn регулировать размер выборки по дереву, чтобы обрабатывать дисбаланс классов?

возможно, это слишком многословно. Простой вопрос о случайный лес sklearn это:

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

больше деталей ниже:


в реализации R случайного леса, называемого randomForest, есть опция sampsize(). Это позволяет вам сбалансировать образец, используемый для обучения каждого дерева на основе результата.

например, если вы пытаетесь предсказать, является ли результат истинным или ложным, а 90% результатов в наборе тренировок ложными, вы можете установить sampsize(500, 500). Это означает, что каждое дерево будет обучаться на случайной выборке (с заменой) из обучающего набора с 500 истинными и 500 ложными наблюдениями. В этих ситуациях я обнаружил, что модели намного лучше предсказывают истинные результаты при использовании 50% - ного отсечения, что дает много высшие каппы.

похоже, что в реализации sklearn нет опции для этого.

  • есть ли способ имитировать эту функциональность в sklearn?
  • будет ли просто оптимизация отключения на основе статистики Каппа достичь аналогичного результата или что-то потеряно в этом подходе?

4 ответов


в версии 0.16-dev теперь вы можете использовать class_weight="auto" иметь что-то близкое к тому, что вы хотите сделать. Это по-прежнему будет использовать все образцы, но он будет перевешивать их, чтобы классы стали сбалансированными.


после прочтения документации я думаю, что ответ Определенно нет. Престижность для всех, кто добавляет функциональность, хотя. Как упоминалось выше, пакет R randomForest содержит эту функциональность.


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

предполагая, что у вас есть достаточно большой набор учебных образцов, почему бы не сбалансировать это само по себе, чтобы провести 50/50 положительных/отрицательных образцов, и вы достигнете желаемого эффекта. scikit-learn предоставляет функциональные возможности для этого.


обход в R только, для классификации можно просто использовать все ядра машины с 100% CPU использования.

это соответствует времени и скорости Sklearn RandomForest классификатор.

также для регрессии есть пакет RandomforestParallel on GitHub, что намного быстрее, чем Python Sklearn Regressor.

классификация: я протестировал и хорошо работает.