R中使用H2O深度学习模型时多分类标签基数报错的解决方法
解决H2O深度学习三分类任务报错问题
你遇到的错误是因为数据划分和函数调用存在问题,导致H2O误判任务类型。以下是具体问题和修复方案:
问题1:训练集与验证集划分错误
你的采样代码set = sample(1:150, 150 , replace = FALSE)会把所有数据纳入训练集,验证集data_val为空,这不仅失去了验证意义,还可能干扰H2O对任务类型的识别。
修复代码:
set.seed(2023) # 按7:3比例划分训练集和验证集 train_idx = sample(1:nrow(dat_h20), size = round(0.7*nrow(dat_h20)), replace = FALSE) data_train = as.h2o(dat_h20[train_idx,]) data_val = as.h2o(dat_h20[-train_idx,])
问题2:确认响应变量的分类类型
确保H2O正确识别响应变量为多分类类别,转换为H2O框架后执行以下检查:
# 查看响应变量的类别数量 h2o.levels(data_train$Event) # 查看列类型(应为enum类型) h2o.describe(data_train$Event)
如果类型不对,手动转换:
data_train$Event = h2o.asfactor(data_train$Event) data_val$Event = h2o.asfactor(data_val$Event)
问题3:h2o.logloss调用错误
h2o.logloss不能同时指定train = TRUE和valid = TRUE,需单独获取训练集或验证集的损失值。若要记录验证集误差,修改为:
validation_errors[i] = h2o.logloss(model, valid = TRUE)
修正后的完整代码
h2o.init() # 构建数据集并确保响应变量为因子 dat_h20 = data.frame( Event = as.factor(space_data$Event), TrajA = space_data$TrajA, AcousticA = space_data$AcousticA, HullScan = as.factor(space_data$HullScan), MCStatus = as.factor(space_data$MCStatus) ) set.seed(2023) # 正确划分训练集和验证集 train_idx = sample(1:nrow(dat_h20), size = round(0.7*nrow(dat_h20)), replace = FALSE) data_train = as.h2o(dat_h20[train_idx,]) data_val = as.h2o(dat_h20[-train_idx,]) # 确认响应变量的类别和类型 h2o.levels(data_train$Event) value = exp(seq(-10,-3, length = 20)) validation_errors = numeric(20) for (i in 1:length(value)) { model = h2o.deeplearning( x = 2:5, y = 1, training_frame = data_train, validation_frame = data_val, standardize = TRUE, hidden = c(5,5), activation = 'Rectifier', distribution = 'multinomial', loss = 'CrossEntropy', l2 = value[i], rate = 0.01, adaptive_rate = FALSE, epochs = 1000, reproducible = TRUE, seed = 2 ) # 记录验证集logloss validation_errors[i] = h2o.logloss(model, valid = TRUE) } plot(value, validation_errors, xlab = "L2正则化参数", ylab = "验证集Logloss", main = "正则化参数与验证误差关系")
内容的提问来源于stack exchange,提问作者statsstudent
相关产品推荐
相关产品推荐

