Я объясню мою проблему на примере. Предположим, вы хотите предсказать доход человека с учетом некоторых атрибутов: {Возраст, Пол, Страна, Регион, Город}. У вас есть тренировочный набор данных, как так
train <- data.frame(CountryID=c(1,1,1,1, 2,2,2,2, 3,3,3,3),
RegionID=c(1,1,1,2, 3,3,4,4, 5,5,5,5),
CityID=c(1,1,2,3, 4,5,6,6, 7,7,7,8),
Age=c(23,48,62,63, 25,41,45,19, 37,41,31,50),
Gender=factor(c("M","F","M","F", "M","F","M","F", "F","F","F","M")),
Income=c(31,42,71,65, 50,51,101,38, 47,50,55,23))
train
CountryID RegionID CityID Age Gender Income
1 1 1 1 23 M 31
2 1 1 1 48 F 42
3 1 1 2 62 M 71
4 1 2 3 63 F 65
5 2 3 4 25 M 50
6 2 3 5 41 F 51
7 2 4 6 45 M 101
8 2 4 6 19 F 38
9 3 5 7 37 F 47
10 3 5 7 41 F 50
11 3 5 7 31 F 55
12 3 5 8 50 M 23
Теперь предположим, что я хочу предсказать доход нового человека, который живет в Городе 7. В моем тренировочном наборе есть колоссальные 3 выборки с людьми в Городе 7 (предположим, что это много), поэтому я, вероятно, могу использовать средний доход в Городе 7 для предсказать доход этого нового человека.
Теперь предположим, что я хочу предсказать доход нового человека, который живет в Городе 2. В моем тренировочном наборе есть только 1 выборка с Городом 2, поэтому средний доход в Городе 2, вероятно, не является надежным предиктором. Но я, вероятно, могу использовать средний доход в Районе 1.
Немного экстраполируя эту идею, я могу преобразовать свой тренировочный набор данных в
Age Gender CountrySamples CountryIncome RegionSamples RegionIncome CitySamples CityIncome
1: 23 M 4 52.25 3 48.00 2 36.5000
2: 48 F 4 52.25 3 48.00 2 36.5000
3: 62 M 4 52.25 3 48.00 1 71.0000
4: 63 F 4 52.25 1 65.00 1 65.0000
5: 25 M 4 60.00 2 50.50 1 50.0000
6: 41 F 4 60.00 2 50.50 1 51.0000
7: 45 M 4 60.00 2 69.50 2 69.5000
8: 19 F 4 60.00 2 69.50 2 69.5000
9: 37 F 4 43.75 4 43.75 3 50.6667
10: 41 F 4 43.75 4 43.75 3 50.6667
11: 31 F 4 43.75 4 43.75 3 50.6667
12: 50 M 4 43.75 4 43.75 1 23.0000
Таким образом, цель состоит в том, чтобы как-то объединить средние значения CityIncome, RegionIncome и CountryIncome, используя количество обучающих выборок для каждой, чтобы придать вес / достоверность каждому значению. (В идеале, включая информацию о возрасте и поле.)
Какие советы по решению этого типа проблемы? Я предпочитаю использовать древовидные модели, такие как случайный лес или усиление градиента, но у меня возникают проблемы с их работой.
ОБНОВИТЬ
Для тех, кто хочет попробовать эту проблему, я сгенерировал примеры данных, чтобы протестировать предлагаемое вами решение здесь .
источник
Ответы:
Я размышлял над этой проблемой некоторое время, вдохновляясь следующими вопросами на этом сайте.
Как я могу включить случайные эффекты в randomForest?
Случайный лес на сгруппированных данных
Случайные леса / adaboost в настройках панели регрессии
Случайный лес для двоичных данных панели
Моделирование кластеризованных данных с использованием ускоренных деревьев регрессии
Позвольте мне сначала представить модели смешанных эффектов для иерархических / вложенных данных и начать с простой двухуровневой модели (выборки, вложенные в города). Для выборки в i-м городе мы записываем результат y i j как функцию от ковариат (список переменных, включая пол и возраст), где - случайный перехват для каждого города, . Если предположить, что и следуют нормальным распределениям со средним 0 и дисперсиями иJ я Yя ж у я J = F ( х я J ) + U я + ε я J , U я J = 1 , ... , п я у я ε я J σ 2 U σ 2 U я U я = σ 2 UИксяж
Для метода на основе случайного леса, вы можете попробовать
MixRF()
в нашем пакете RMixRF
на CRAN.источник
Учитывая, что у вас есть только две переменные и прямое вложение, я бы повторил комментарии других, в которых упоминается иерархическая байесовская модель. Вы упоминаете предпочтение древовидных методов, но есть ли для этого особая причина? Имея минимальное количество предикторов, я считаю, что линейность часто является допустимым предположением, которое хорошо работает, и любую неправильную спецификацию модели можно легко проверить с помощью остаточных графиков.
Если бы у вас было большое количество предикторов, пример RF, основанный на подходе EM, упомянутом @Randel, наверняка был бы вариантом. Еще один вариант, который я еще не видел, - это использование бустинга на основе моделей (доступно через пакет mboost в R ). По сути, этот подход позволяет вам оценить функциональную форму ваших фиксированных эффектов с использованием различных базовых обучающихся (линейных и нелинейных), а оценки случайных эффектов аппроксимируются с использованием штрафа на основе гребня для всех уровней в этом конкретном факторе. Этот документ является довольно хорошим учебником (ученики по случайным эффектам обсуждаются на странице 11).
Я посмотрел на ваши выборочные данные, но похоже, что в них есть только переменные случайных эффектов города, региона и страны. В этом случае было бы полезно рассчитать эмпирические байесовские оценки для этих факторов, независимо от каких-либо предикторов. На самом деле это может быть хорошим началом для начала, так как, возможно, более высокие уровни (например, Страна) имеют минимальное отклонение, объясненное в результате, и поэтому, вероятно, не стоит добавлять их в вашу модель.
источник
mboost
пакета.mboost
Звучит интересно - я посмотрю. СпасибоЭто скорее комментарий или предложение, а не ответ, но я думаю, что вы задаете здесь важный вопрос. Как человек, который работает исключительно с многоуровневыми данными, я могу сказать, что очень мало нашел в машинном обучении многоуровневых данных. Тем не менее, Дэн Мартин, недавний аспирант в области количественной психологии в Университете Вирджинии, защитил диссертацию об использовании деревьев регрессии с многоуровневыми данными. Ниже приведена ссылка на пакет R, который он написал для некоторых из этих целей:
https://github.com/dpmartin42/mleda/blob/master/README.md
Также вы можете найти его диссертацию здесь:
http://dpmartin42.github.io/about.html
источник
Функция
RFcluster()
из пакета gamclass для R «адаптирует случайные леса для работы (хотя и неуклюже и неэффективно) с кластеризованными категориальными данными о результатах». Следующий пример со страницы справки дляRFcluster
:Это возвращает точность OOB (где «сумки» - это сумки динамиков, а не сумки отдельных образцов динамиков), которые моя машина дает как 0,57.
источник
Возможно, вы захотите взглянуть на metboost : Miller PJ et al. metboost: исследовательский регрессионный анализ с иерархически кластеризованными данными.arXiv: 1702.03994
Цитата из аннотации: Мы предлагаем расширение для деревьев решений с расширенными решениями, называемое metboost для иерархически кластеризованных данных. Он работает, ограничивая структуру каждого дерева одинаково для разных групп, но позволяя терминальному узлу различаться. Это позволяет предикторам и точкам разделения приводить к разным предсказаниям в каждой группе и аппроксимирует специфические эффекты нелинейных групп. Важно отметить, что metboost остается вычислительно выполнимым для тысяч наблюдений и сотен предикторов, которые могут содержать пропущенные значения.
Это реализовано в пакете R mvtboost
источник