首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何保存数据的映射。框架到模型。矩阵和应用于新的观测?

如何保存数据的映射。框架到模型。矩阵和应用于新的观测?
EN

Stack Overflow用户
提问于 2017-04-24 02:18:29
回答 2查看 2.5K关注 0票数 4

一些建模函数,例如glmnet(),要求(或仅仅允许)将数据作为预测矩阵和响应矩阵(或向量)传入,以用于使用公式。在这些情况下,典型的情况是,predict()方法,例如predict.glmnet(),要求newdata参数提供一个预测矩阵,其特性与用于训练模型的特性相同。

当数据数据具有影响因素 (R的分类数据类型)时,创建预测矩阵的一种方便方法是使用model.matrix()函数,它会自动为分类变量创建虚拟特性:

代码语言:javascript
复制
# this is the dataframe and matrix I want to use to train the model
set.seed(1)
df <- data.frame(x1 = factor(sample(LETTERS[1:5], replace = T, 20)),
                 x2 = rnorm(20, 100, 5),
                 x3 = factor(sample(c("U","L"), replace = T, 20)),
                 y = rnorm(20, 10, 2))

mm <- model.matrix(y~., data = df)

但是,当我介绍一个只包含来自原始数据from的元素级别子集的新观测数据时,model.matrix() (可预见的)返回一个具有不同虚拟特性的矩阵。这个新矩阵不能在predict.glm()中使用,因为它不具有模型所期望的相同特性:

代码语言:javascript
复制
# this is the dataframe and matrix I want to predict on
set.seed(1)
df_new <- data.frame(x1 = c("B", "C"),
                     x2 = rnorm(2, 100, 5),
                     x3 = c("L","U"))

mm_new <- model.matrix(~., data = df_new)

是否有一种方法可以将转换(创建所有必要的虚拟特性)从数据矩阵保存到模型矩阵,以便我可以将此转换重新应用于未来的观察?在我的上面的示例中,这将使mm_new具有与mm相同的功能名称,以便predict()能够接受mm_new

我想补充一点,我知道这种方法,它实质上建议在调用model.matrix()之前包括来自df中的df_new的观察结果。如果我一开始就有所有的观察结果,而且我只是训练和测试模型,这就很好了。但是,新的观测结果只能在未来(生产预测管道中)访问,我希望避免重新加载整个培训数据以进行新预测的开销。

EN

回答 2

Stack Overflow用户

发布于 2017-05-16 17:39:06

我在model.matrixmodel.frame的文档中找到了我所需要的东西,并想要分享。model.matrix中有一个名为xlev的参数,即“如果数据被调用为model.frame,它将用作model.frame的参数”。

如果model.matrix调用model.framexlev要求为dataframe中的每个元素( list元素名为因子名)提供一个字符向量列表;每个字符向量包含构建具有与原始model.matrix相同的虚拟功能的新model.matrix所需的全部因素级别。

下面是一个有用的例子:

代码语言:javascript
复制
set.seed(1)
df <- data.frame(x1 = factor(sample(LETTERS[1:5], replace = T, 20)),
                 x2 = rnorm(20, 100, 5),
                 x3 = factor(sample(c("U","L"), replace = T, 20)),
                 y = rnorm(20, 10, 2))

mm <- model.matrix(y~., data = df)

# this is a list of levels for each factor in the original df
xlevs <- lapply(df[,sapply(df, is.factor), drop = F], function(j){
  levels(j)
})

# this is a new df with only a subset of the levels of the original factors
df_new <- data.frame(x1 = c("B", "C"),
                     x2 = rnorm(2, 100, 5),
                     x3 = c("U","U"))

# calling "xlev = " builds out a model.matrix with identical levels as the original df
mm_new <- model.matrix(~., data = df_new[1,], xlev = xlevs)

请注意,此解决方案仅处理作为原始因素级别的子集的因素级别。它不打算处理新的因素水平。

票数 8
EN

Stack Overflow用户

发布于 2021-08-10 20:44:18

model.matrix()的问题在于它没有保存任何转换参数。我编写了一个名为ModelMatrixModel的包,包中的ModelMatrixModel()函数返回一个类,该类存储转换后的矩阵和转换参数,包括因子级别信息和正交多项式系数,然后可以应用于新的数据。它还提供了许多选项,例如处理无效级别、保留第一个虚拟变量、返回稀疏矩阵和缩放输出矩阵。

代码语言:javascript
复制
#devtools::install_github("xinyongtian/R_ModelMatrixModel")

library(ModelMatrixModel)
df <- data.frame(x1 = factor(sample(LETTERS[1:5], replace = T, 20)),
                 x2 = rnorm(20, 100, 5),
                 x3 = factor(sample(c("U","L"), replace = T, 20)),
                 y = rnorm(20, 10, 2))
df_new <- data.frame(x1 = c("B", "C"),
                     x2 = rnorm(2, 100, 5),
                     x3 = c("U","U"))

m <- ModelMatrixModel(y~1+x1+x2+x3, data = df,remove_1st_dummy = T,sparse=F)
head(m$x,2)
##   _Intercept_ x1B x1C x1D x1E        x2 x3U
## 1           1   0   0   0   0  93.64492   0
## 2           1   1   0   0   0 101.08855   1
m_new=predict(m,df_new)
head(m_new$x,2)
##   _Intercept_ x1B x1C x1D x1E        x2 x3U
## 1           1   1   0   0   0 106.63825   1
## 2           1   0   1   0   0  99.00571   1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43578799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档