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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 07:14:31