Я работаю над трехточечной идентификацией, используя метод 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) в документации, но я не могу найти никого, кто ее использует. В теории он делает то, что мне нужно, но я не вижу, как я могу поместить массив весов обратно в мой случайный лес.
Я не понимаю: «Это не устраняет проблему, потому что наименьшие общие классы примерно так же редки во всех образцах, которые у меня есть. Это просто характер этого конкретного класса». Если вы поместили образцы весом в 'sample_weight = (1/n_samples_in_same_class)', который даст вам разумные значения для весов классов. – ogrisel
sample_weight в соответствии с документацией, похоже, относится к образцам, а не к весу класса. – Nahkki
Да, но вы можете назначить одинаковый вес образца всем образцам одного и того же класса, и вы эффективно взвешиваете, как если бы вы предоставили вес класса. Можно моделировать вес класса, предоставляя вес образца, но не наоборот. – ogrisel