You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R的neuralnet()中实现行加权替代行重复的方法问询

解决neuralnet()的加权训练问题

neuralnet包本身没有像lm()那样内置的weights参数来直接处理行加权,但可以通过以下几种方法避免重复行来实现加权训练:

1. 自定义加权损失函数

neuralnet允许自定义损失计算逻辑,我们可以直接在损失函数里加入样本权重,比如构建加权均方误差(WMSE):

# 定义加权MSE损失函数
weighted_mse <- function(y_true, y_pred) {
  # 确保权重和当前样本一一对应
  sample_weights <- df$high_jump_tests
  mean(sample_weights * (y_true - y_pred)^2)
}

# 加载neuralnet并训练模型
library(neuralnet)
weighted_nn <- neuralnet(
  formula = high_jump_average ~ max_squat + weight,
  data = df,
  loss.fct = weighted_mse,
  hidden = c(3, 2)  # 根据你的需求调整隐藏层结构
)

这种方法直接在损失计算中赋予权重高的样本更大的误差权重,不需要扩展数据集,从根源上避免了行数暴增的问题。注意要保证权重向量的顺序和输入数据的行顺序完全一致。

2. 换用支持加权的神经网络包

如果自定义损失函数的方式不够顺手,可以考虑替代包,它们大多内置了加权功能:

  • nnet包:nnet()函数直接支持weights参数:
library(nnet)
weighted_nnet <- nnet(
  formula = high_jump_average ~ max_squat + weight,
  data = df,
  weights = df$high_jump_tests,
  size = 3  # 隐藏层神经元数量
)
  • keras包:训练时可以通过sample_weight参数传入权重:
library(keras)
# 构建模型
model <- keras_model_sequential() %>%
  layer_dense(units = 3, activation = "relu", input_shape = c(2)) %>%
  layer_dense(units = 1)

# 编译模型
model %>% compile(optimizer = "adam", loss = "mse")

# 加权训练
model %>% fit(
  x = df %>% select(max_squat, weight),
  y = df$high_jump_average,
  sample_weight = df$high_jump_tests,
  epochs = 50
)

内容的提问来源于stack exchange,提问作者hotbacon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 18:16:38