L1 惩罚回归无法根据模型进行预测
L1 penalized regression fails to predict from model
这个问题可能过于特定于包,但我会重视在我的数据集上使用 predict
函数时可能出现的错误。
我使用的程序如下:
require(penalized)
# neg contains negative data
# pos contains positive data
现在,下面的过程旨在构建可比较的(在 os pos 主动和消极案例方面平衡)训练和验证数据集。
# 50% negative training set
negSamp <- neg %>% sample_frac(0.5) %>% as.data.frame()
# Negative validation set
negCompl <- neg[setdiff(row.names(neg),row.names(negSamp)),]
# 50% positive training set
posSamp <- pos %>% sample_frac(0.5) %>% as.data.frame()
# Positive validation set
posCompl <- pos[setdiff(row.names(pos),row.names(posSamp)),]
# Combine sets
validat <- rbind(negSamp,posSamp)
training <- rbind(negCompl,posCompl)
好的,现在我们有两个可比较的集合。
[1] FALSE TRUE
> dim(training)
[1] 1061 381
> dim(validat)
[1] 1060 381
> identical(names(training),names(validat))
[1] TRUE
我可以毫无问题地将模型拟合到训练集(并且我已尝试在此处使用一系列 Lambda1 值)。但是,将模型拟合到验证数据集失败,并出现奇怪的错误描述。
> fit <- penalized(VoiceTremor,training[-1],data=training,lambda1=40,standardize=TRUE)
# nonzero coefficients: 13
> fit2 <- predict(fit, penalized=validat[-1], data=validat)
Error in .local(object, ...) :
row counts of "penalized", "unpenalized" and/or "data" do not match
只是为了确保这不是由于数据集中的某些 NA:
> identical(validat,na.omit(validat))
[1] TRUE
奇怪的是,我可能会生成一些与正确数据集相当的新数据:
data.frame(VoiceTremor="NVT",matrix(rnorm(380000),nrow=1000,ncol=380) ) -> neg
data.frame(VoiceTremor="VT",matrix(rnorm(380000),nrow=1000,ncol=380) ) -> pos
> dim(pos)
[1] 1000 381
> dim(neg)
[1] 1000 381
和 运行 上面的过程,然后第二个适合!
怎么会?我的第二个(非训练)数据集有什么问题?
好的,
我找到了解决这个问题的方法。问题在于我发现了互补数据集。
neg[setdiff(row.names(neg),row.names(negSamp)),]
没有做正确的事,但是
neg %>%
rownames_to_column() %>%
filter(! rowname %in% row.names(negSamp)) %>%
column_to_rownames() %>% data.frame()
确实如此。有了这个改变,连同使用 data.frame
而不是 as.data.frame
就可以了。
这个问题可能过于特定于包,但我会重视在我的数据集上使用 predict
函数时可能出现的错误。
我使用的程序如下:
require(penalized)
# neg contains negative data
# pos contains positive data
现在,下面的过程旨在构建可比较的(在 os pos 主动和消极案例方面平衡)训练和验证数据集。
# 50% negative training set
negSamp <- neg %>% sample_frac(0.5) %>% as.data.frame()
# Negative validation set
negCompl <- neg[setdiff(row.names(neg),row.names(negSamp)),]
# 50% positive training set
posSamp <- pos %>% sample_frac(0.5) %>% as.data.frame()
# Positive validation set
posCompl <- pos[setdiff(row.names(pos),row.names(posSamp)),]
# Combine sets
validat <- rbind(negSamp,posSamp)
training <- rbind(negCompl,posCompl)
好的,现在我们有两个可比较的集合。
[1] FALSE TRUE
> dim(training)
[1] 1061 381
> dim(validat)
[1] 1060 381
> identical(names(training),names(validat))
[1] TRUE
我可以毫无问题地将模型拟合到训练集(并且我已尝试在此处使用一系列 Lambda1 值)。但是,将模型拟合到验证数据集失败,并出现奇怪的错误描述。
> fit <- penalized(VoiceTremor,training[-1],data=training,lambda1=40,standardize=TRUE)
# nonzero coefficients: 13
> fit2 <- predict(fit, penalized=validat[-1], data=validat)
Error in .local(object, ...) :
row counts of "penalized", "unpenalized" and/or "data" do not match
只是为了确保这不是由于数据集中的某些 NA:
> identical(validat,na.omit(validat))
[1] TRUE
奇怪的是,我可能会生成一些与正确数据集相当的新数据:
data.frame(VoiceTremor="NVT",matrix(rnorm(380000),nrow=1000,ncol=380) ) -> neg
data.frame(VoiceTremor="VT",matrix(rnorm(380000),nrow=1000,ncol=380) ) -> pos
> dim(pos)
[1] 1000 381
> dim(neg)
[1] 1000 381
和 运行 上面的过程,然后第二个适合! 怎么会?我的第二个(非训练)数据集有什么问题?
好的,
我找到了解决这个问题的方法。问题在于我发现了互补数据集。
neg[setdiff(row.names(neg),row.names(negSamp)),]
没有做正确的事,但是
neg %>%
rownames_to_column() %>%
filter(! rowname %in% row.names(negSamp)) %>%
column_to_rownames() %>% data.frame()
确实如此。有了这个改变,连同使用 data.frame
而不是 as.data.frame
就可以了。