一些建模函数,例如glmnet(),要求(或仅仅允许)将数据作为预测矩阵和响应矩阵(或向量)传入,以用于使用公式。在这些情况下,典型的情况是,predict()方法,例如predict.glmnet(),要求newdata参数提供一个预测矩阵,其特性与用于训练模型的特性相同。
当数据数据具有影响因素 (R的分类数据类型)时,创建预测矩阵的一种方便方法是使用model.matrix()函数,它会自动为分类变量创建虚拟特性:
# 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()中使用,因为它不具有模型所期望的相同特性:
# 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的观察结果。如果我一开始就有所有的观察结果,而且我只是训练和测试模型,这就很好了。但是,新的观测结果只能在未来(生产预测管道中)访问,我希望避免重新加载整个培训数据以进行新预测的开销。
发布于 2017-05-16 17:39:06
我在model.matrix和model.frame的文档中找到了我所需要的东西,并想要分享。model.matrix中有一个名为xlev的参数,即“如果数据被调用为model.frame,它将用作model.frame的参数”。
如果model.matrix调用model.frame,xlev要求为dataframe中的每个元素( list元素名为因子名)提供一个字符向量列表;每个字符向量包含构建具有与原始model.matrix相同的虚拟功能的新model.matrix所需的全部因素级别。
下面是一个有用的例子:
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)请注意,此解决方案仅处理作为原始因素级别的子集的因素级别。它不打算处理新的因素水平。
发布于 2021-08-10 20:44:18
model.matrix()的问题在于它没有保存任何转换参数。我编写了一个名为ModelMatrixModel的包,包中的ModelMatrixModel()函数返回一个类,该类存储转换后的矩阵和转换参数,包括因子级别信息和正交多项式系数,然后可以应用于新的数据。它还提供了许多选项,例如处理无效级别、保留第一个虚拟变量、返回稀疏矩阵和缩放输出矩阵。
#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 1https://stackoverflow.com/questions/43578799
复制相似问题