我正在 R 中处理成分数据(总和为 1 的比例),并且我已经尝试过狄利克雷回归作为对新数据进行建模和预测的参数方法。我想测试非参数方法,例如神经网络、随机森林或 CNN,我找到了带有函数
nnet
的包 multinom()
,手册中说“通过神经网络拟合多项式对数线性模型” 。然而,我还在另一个question中发现这个函数并没有真正调用任何neural network
,因为参数size
(隐藏层的大小)设置为0,如果我理解正确。
在同一问题中,建议仅使用
nnet()
函数,响应级别超过 2 个级别,并设置 softmax=TRUE
,但我不知道如何执行此操作,如果我尝试直接建模,则会收到错误比例(参见可重现的示例)。
给出一个像这样的可重现的示例数据集:
set.seed(123)
n <- 300 # Number of observations
# Simulate predictor variables
data <- as.data.frame(matrix(runif(n * 10), nrow = n, ncol = 10))
names(data) <- paste0("V", 1:10)
# Simulate proportions for A, B, C that sum to 1
proportions <- matrix(runif(n * 3), ncol = 3)
row_sums <- rowSums(proportions)
proportions <- sweep(proportions, 1, row_sums, "/")
data$prop_A <- proportions[,1]
data$prop_B <- proportions[,2]
data$prop_C <- proportions[,3]
# Split into train/test
train_indices <- sample(1:n, size = 0.8 * n)
train_data <- data[train_indices, ]
test_data <- data[-train_indices, ]
# Fit nnet model with softmax=TRUE
model <- nnet(prop_A + prop_B + prop_C ~., data = train_data, size = 2, softmax = T)
>
> Error in nnet.default(x, y, w, ...) :
> 'softmax = TRUE' requires at least two response categories
>
我想知道
nnet
是否是一种合理的非参数方法来建模组合数据以及有经验的人将如何解决这个问题。
我认为你可以用 cito 做类似的事情。 cito 是一个用于通过简单的用户界面(包括公式语法)拟合 DNN 的软件包,但具有使用最先进的 DL 框架(此处为 torch)的优点。
与 nnet 不同,cito 支持自定义损失函数,我认为我们可以构建您想要的东西(不幸的是,我们目前没有多项式损失,因为它尚未在 torch 中实现):
library(cito)
# Custom loss functions must be implemented in torch
custom_loss = function(pred, true) {
pred_prob = torch::nnf_softmax(pred, dim = 2)
return(torch::nnf_binary_cross_entropy(pred_prob, true))
}
# Model call, by default a DNN with two layers and each with 50 nodes
model = dnn(cbind(prop_A, prop_B, prop_C)~., data = data, loss = custom_loss, lr = 0.1)
# Predict
pred =predict(model)
# To forward them through the softmax link, we must transfer them to a torch object
pred_tensor = torch::torch_tensor(pred)
# Predictions - we must apply the link, and then transform it back to R
torch::nnf_softmax(pred_tensor, dim = 2) |> as.matrix()