Взвешивание более свежих данных в модели Random Forest

14

Я обучаю классификационную модель случайному лесу, чтобы различать 6 категорий. Мои транзакционные данные имеют около 60 тыс. Наблюдений и 35 переменных. Вот пример того, как это выглядит примерно.

 _________________________________________________
|user_id|acquisition_date|x_var_1|x_var_2| y_vay  |
|-------|----------------|-------|-------|--------|
|111    | 2013-04-01     | 12    | US    | group1 |
|222    | 2013-04-12     | 6     | PNG   | group1 |
|333    | 2013-05-05     | 30    | DE    | group2 |
|444    | 2013-05-10     | 78    | US    | group3 |
|555    | 2013-06-15     | 15    | BR    | group1 |
|666    | 2013-06-15     | 237   | FR    | group6 |

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

Кто-нибудь знает, способен ли пакет randomForest в R обрабатывать веса для одного наблюдения?

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

Спасибо заранее!

Николай Ненов
источник
Вы можете рассмотреть вопрос о переполнении стека. Они помогут вам больше с вопросами реализации. В центре внимания этого сайта больше теоретических.
Алекс Уильямс
Я, вероятно, не достаточно ясно в моем письме, но мои вопросы не касаются вопроса реализации. Например, в части, где я спрашиваю о создании переменной веса, я не хочу спрашивать, какая команда в R может помочь мне сделать это. Мне просто было интересно, не нарушу ли я при этом какие-либо предположения о случайном лесе.
Николай Ненов
1
Ответ - нет, я верю. Вы можете назначить веса для разных групп, как я объяснил в моем ответе ниже. Я понимаю, что это не то, что вас интересует, но это похожая идея. Вы можете попробовать использовать повторяющиеся наблюдения, как я предлагаю.
Алекс Уильямс

Ответы:

5

rangerПакет в R ( в формате PDF ), который является относительно новым, будет делать это. Реализация случайных лесов в рейнджере имеет case.weightsаргумент, который принимает вектор с индивидуальными весами наблюдений / наблюдений.

GrantRWHumphries
источник
Ухоженная! Швы, как решение, которое я искал. У вас есть ссылка на детали того, как рассчитывается вероятность case.weights?
Николай Ненов
1
Я не уверен на 100%, как они рассчитывают вероятности - но я думаю, если вы хотите начать, взгляните на этот документ: Malley, JD, Kruppa, J., Dasgupta, A., Malley, KG, & Ziegler А. (2012). Машины вероятности: последовательная оценка вероятности с использованием непараметрических машин обучения. Методы Inf Med 51: 74-81. dx.doi.org/10.3414/ME00-01-0052
GrantRWHumphries
7

Вы можете пересчитать данные, чтобы представить более свежие точки данных. В любом случае Rf включает в себя этап сампеля с заменой, а «грубо сбалансированный пакет» для несбалансированных классов использует выборку для перепредставления класса меньшинства и дает результаты, которые являются хорошими или лучше, чем случайный лес, взвешенный по классу в моем опыте.

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

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

Райан Бресслер
источник
4

Вы должны посмотреть на параметр "classwt". Кажется, это не то, что вас непосредственно интересует, но это может дать вам представление о том, что вы хотите сделать.

Смотрите здесь: Stack Exchange вопрос № 1

А здесь: Stack Exchange, вопрос № 2

Статья о взвешенных случайных лесах: PDF

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

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

Вы можете попробовать поискать альтернативные реализации, например, в C - в худшем случае, их можно настроить с помощью небольшого количества кода.

Алекс Уильямс
источник
1
Большое спасибо за ссылки, Алекс. В статье приводятся хорошие примеры случаев, когда вы хотите взвесить свои классификаторы. Я боюсь, что это не работает для меня, так как нельзя использовать параметр "classwt" для чего-либо кроме взвешивания классификаторов - т.е. вам нужен один вес на класс, иначе randomForest выдаст ошибку.
Николай Ненов
1
Да, я не думаю, что вы можете использовать "classwt" напрямую. Вам нужен какой-то параметр, такой как "вес наблюдения", но я не думаю, что он существует.
Алекс Уильямс