R语言neuralnet函数报错:未选择定义的列(colunas indefinidas selecionadas)求助
R语言neuralnet函数报错:未选择定义的列(colunas indefinidas selecionadas)求助
嗨,我看到你在用neuralnet包搭建神经网络时碰到了这个列未定义的错误,之前跑决策树、KNN、SVM这些模型都没问题,确实挺闹心的😅。我帮你分析下可能的原因和解决办法:
核心问题:列名中的连字符被公式解析成运算符
你数据里的列名比如cap-shape、stalk-surface-above-ring都带有连字符-,在R的公式语法里,-是减号运算符。neuralnet在解析poisonous~.的时候,会把这些列名误当成“变量相减”(比如把cap-shape理解成cap - shape),但你的数据里根本没有cap或shape这类列,自然就会报“未定义的列”错误。而其他模型对~.的解析逻辑更宽松,所以没出问题。解决办法1:批量替换列名中的连字符为下划线
这是最简单的方案,一次性解决所有列名的歧义问题:# 把所有列名的连字符换成下划线 colnames(treino) <- gsub("-", "_", colnames(treino)) # 再重新运行neuralnet neuralnet(poisonous~., data = treino, hidden = 2, linear.output = FALSE, likelihood = TRUE)解决办法2:用reformulate自动构建正确的公式
如果不想修改列名,可以用reformulate函数帮你生成带正确列名引用的公式,它会自动给带特殊字符的列名加上反引号,避免解析错误:# 提取除了poisonous之外的所有特征列名 feature_cols <- setdiff(colnames(treino), "poisonous") # 构建公式 nn_formula <- reformulate(feature_cols, response = "poisonous") # 运行neuralnet neuralnet(nn_formula, data = treino, hidden = 2, linear.output = FALSE, likelihood = TRUE)额外建议:检查响应变量类型
你的poisonous是因子类型,虽然neuralnet的linear.output=FALSE支持分类任务,但把因子转成数值型(比如0/1)通常会更稳妥,避免潜在的类型问题:# 把因子转成0和1的数值型 treino$poisonous <- as.integer(treino$poisonous) - 1
备注:内容来源于stack exchange,提问作者3Gijo
相关产品推荐
相关产品推荐

