2013-07-16 2 views
7

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

Я вижу, что в документации scikit for random forests есть параметр sample_weight в методе подгонки. Из того, что я могу сказать, что просто весит определенные общие образцы (скажем, у меня есть 50 файлов, с которых я тренируюсь, он будет весить первый образец в два раза так же сильно, как и все остальное), а не классы. Это не устраняет проблему, потому что наименее распространенные классы примерно одинаковы во всех образцах, которые у меня есть. Это просто характер этого класса.

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

* EDIT прояснить мое понимание sample_weight * Sample_weight согласно документации, кажется, со ссылкой на образцы, а не класс веса. Так что, если у меня есть файлы A, B и C и классы 1, 2 и 3 И скажем:

A = [1 1 1 2] 
B = [2 2 1 1] 
C = [3 1 1 1] 

Глядя выше, мы имеем ситуацию, очень упрощенный, в котором мы имеем очень мало 3 класса по сравнению с другие классы. Моя ситуация имеет 8 классов и тренируется на миллионах очков, но соотношение все еще невероятно искажено против двух отдельных классов.

Использование sample_weight, который принимает массив размером m (m - количество выборок), я мог бы оценить, насколько сильно работает любой из этих трех файлов. Поэтому я понимаю, что могу сделать sample_weight = [1 1 2], что сделало бы образец C вдвое сильнее, чем два других образца. Но это не очень помогает, потому что моя проблема в том, что класс 3 очень редок (в реальных данных это 1k баллов из миллионов, а не 1 из 12). Увеличение веса любого данного образца не увеличит вес конкретных классов, если я не подделываю некоторые данные, в которых образец состоит почти из ничего, кроме этого конкретного класса.

Я нашел sklearn.preprocessing.balance_weights(y) в документации, но я не могу найти никого, кто ее использует. В теории он делает то, что мне нужно, но я не вижу, как я могу поместить массив весов обратно в мой случайный лес.

+4

Я не понимаю: «Это не устраняет проблему, потому что наименьшие общие классы примерно так же редки во всех образцах, которые у меня есть. Это просто характер этого конкретного класса». Если вы поместили образцы весом в 'sample_weight = (1/n_samples_in_same_class)', который даст вам разумные значения для весов классов. – ogrisel

+0

sample_weight в соответствии с документацией, похоже, относится к образцам, а не к весу класса. – Nahkki

+1

Да, но вы можете назначить одинаковый вес образца всем образцам одного и того же класса, и вы эффективно взвешиваете, как если бы вы предоставили вес класса. Можно моделировать вес класса, предоставляя вес образца, но не наоборот. – ogrisel

ответ

2

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

rf = RandomForestClassifier(class_weight="balanced") 
Смежные вопросы