如何在机器学习中处理分层/嵌套数据


29

我将用一个例子来解释我的问题。假设您要根据以下属性预测个人的收入:{年龄,性别,国家/地区,城市}。你有一个像这样的训练数据集

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号城市的新人的收入。我的训练集与7号城市的人进行了多达3个样本的采样(假设很多),因此我可以使用7号城市的平均收入来估算预测这个新人的收入。

现在假设我要预测一个居住在City 2中的新人的收入。我的训练集只有City 2的一个样本,因此City 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,同时使用每个训练样本的数量为每个值赋予权重/可信度。(理想情况下,仍然包括“年龄和性别”信息。)

解决这类问题的技巧是什么?我更喜欢使用基于树的模型,例如随机森林或渐变增强,但是我很难使它们表现良好。

更新

对于任何人愿以刺这个问题,我已经生成的样本数据来测试您提出的解决方案在这里


7
分层贝叶斯模型很自然地利用数据中描述的结构。查看有关Radon污染建模的经典示例mc-stan.org/documentation/case-studies/radon.html
Vladislavs Dovgalecs

看看这个Kaggle入门教程挑战:kaggle.com/c/titanic。它处理类似的问题,即根据性别,票证类型等各种属性来预测某人是否幸存于泰坦尼克号灾难中。为此,最佳提交的解决方案使用高级方法(例如梯度增强和贝叶斯层次模型)等
Vihari Piratla '16

6
@VihariPiratla感谢您的输入,但是我熟悉Titanic数据集和挑战,而且我看不到它与我问过的嵌套数据问题有什么关系。
2016年

对那些模型使用L2 / L1正则化,例如执行它的逻辑回归/ SVM应该会有所帮助(穷人的分层贝叶斯)。有效地对系数进行惩罚,因此,除非系数显着(即在大量数据上)改善误差,否则它将被设置为接近零。并使用交叉验证来确定处罚水平
seanv507 '16

您还希望能够预测住在9号城市的人的收入吗?
jan-glx

Answers:


14

一段时间以来,我一直在思考这个问题,并从此站点上的以下问题中得到了启发。

让我首先介绍分层/嵌套数据的混合效果模型,并从一个简单的两级模型(嵌套在城市中的样本)开始。对于第i个城市中的第个样本,我们将结果y i j写为协变量x i j(包括性别和年龄的变量列表)的函数, y i j = f x i j+ u i + ϵ i j 其中u i是每个城市的随机截距,j = 1jiyijxij

yij=f(xij)+ui+ϵij,
ui。如果我们假设 ù ε Ĵ遵循均值为0正态分布和方差 σ 2 ù σ 2,的经验贝叶斯(EB)估计 Ü Ù = σ 2 ùj=1,,niuiϵijσu2σ2u一世其中 ˉ ÿ=1
u^i=σu2σu2+σ2/ni(y¯i.f(x¯i.)),
˚F ˉ X=1y¯i.=1niiniyij如果我们把 ˉ ý-˚F ˉ X作为OLS(普通最小二乘)的估计ü,则EB估计的0的加权和和OLS估计,并且重量是样本大小ni的增加函数。最终预测是 ˚FXĴ+ ùf(x¯i.)=1niinif(xij).(y¯i.f(x¯i.))uini其中 ˚FX Ĵ是从线性回归或机器学习方法等随机森林固定效应的估计。可以轻松地将其扩展到任何级别的数据,例如在城市,区域,国家中嵌套的样本。除了基于树的方法之外,还有一种基于SVM的方法
f^(xij)+u^i,
f^(xij)

对于基于随机森林的方法,您可以在CRAN上尝试MixRF()我们的R包MixRF


ifi

fuixijui,

6

假设您只有两个变量并且嵌套简单,那么我会回想其他人提到分层贝叶斯模型的评论。您提到了对基于树的方法的偏爱,但是是否有特定原因呢?使用最少的预测变量,我发现线性度通常是一个行之有效的有效假设,并且可以通过残差图轻松检查任何模型错误指定。

如果您确实有大量预测变量,那么@Randel提到的基于EM方法的RF示例肯定是一个选择。我还没有看到的另一种选择是使用基于模型的增强功能(可通过R中mboost包获得)。本质上,这种方法使您可以使用各种基本学习器(线性和非线性)来估计固定效果的功能形式,并使用针对特定因子中所有级别的基于岭的罚分来近似估计随机效果。纸是一种相当不错的教程(随机效应基地学习者11页的讨论)。

我查看了您的样本数据,但是看起来它只有城市,地区和国家(地区)的随机影响变量。在这种情况下,仅对那些因子进行经验贝叶斯估计,独立于任何预测因素,才有用。通常,这实际上可能是一个很好的练习,因为较高的级别(例如,国家/地区)可能在结果中说明了最小的方差,因此可能不值得在模型中添加它们。


1
+1介绍mboost软件包。
兰德尔

我正在使用的真实数据有两个以上的变量,这些变量增加了许多我的简单示例无法拾取的现实世界的混乱情况(例如,非线性,相互依赖性,缺失值,分类值等)。 。根据我的经验,基于树的学习者在处理所有现实世界中的混乱方面做得最好,这就是为什么我倾向于使用它们。(这是XGBoost赢得Kaggle上几乎所有结构化数据竞赛的一个原因。) mboost听起来很有趣-我来看一下。谢谢
2016年

1
我看到,同意在这种情况下树木肯定是有用的。在这种情况下,坚持使用@Randel的建议将是一个不错的选择。Mboost还具有树型学习器,与随机效果基础学习器结合使用可能会很有用。
dmartin '16

3

这更多是评论或建议,而不是答案,但我认为您在这里提出了一个重要问题。作为专门处理多级数据的人,我可以说我对使用多级数据的机器学习了解很少。但是,弗吉尼亚大学(University of Virginia)定量心理学专业的最新博士学位的丹·马丁(Dan Martin)致力于将回归树与多级数据结合使用。以下是他为此目的而编写的R包的链接:

https://github.com/dpmartin42/mleda/blob/master/README.md

另外,您可以在这里找到他的论文:

http://dpmartin42.github.io/about.html


2
感谢您的参考,Erik!我的论文要记住的一件事是,它只评估了暴露于多级数据结构时森林方法如何“开箱即用”地执行。@Randel提到的方法在第3章中进行了文献综述,但仿真研究主要研究了Breiman的原始算法和条件推理树/森林。
dmartin '16

1

RFcluster()来自gamclass包的R 函数“使随机森林能够(尽管笨拙且效率低下)使用聚类的分类结果数据来工作”。以下示例来自帮助页面的RFcluster

 library(randomForest)
 library(gamclass)
 data(mlbench::Vowel)
 RFcluster(formula=Class ~., id = V1, data = Vowel, nfold = 15,
           tree=500, progress=TRUE, printit = TRUE, seed = 29)

这将返回OOB精度(其中“袋”是扬声器的袋,而不是单个扬声器样本的袋),我的机器给出的精度为0.57。


0

您可能需要看一下metboost:Miller PJ等。metboost:具有分层聚类数据的探索性回归分析。arXiv:1702.03994

摘录自引文:我们提出了对增强的决策决策树(称为metboost)的扩展,用于分层集群数据。它通过将每个树的结构限制为跨组相同来工作,但允许终端节点的方法不同。这允许预测变量和分割点在每个组内导致不同的预测,并近似非线性特定组的效果。重要的是,对于数千个观测值和数百个可能包含缺失值的预测变量,metboost在计算上仍然可行。

它在R包mvtboost中实现


1
请提供引用,而不只是提供链接(尤其是您的第一个链接),因为链接可能会
Antoine
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.