1

我正在构建一个人工神经网络来预测总医疗保健成本(因此是一个连续变量),它使用一系列输入变量,例如年龄、性别、保险范围和慢性病的数量。我使用 R 的神经网络包采取了以下步骤:

  1. 我首先将值标准化,因此所有自变量和因变量的值都介于 0 - 1 之间(使用 min-max 规则)

  2. 我创建了一个包含自变量和因变量的模型矩阵,还为神经网络创建了一个公式

    df_matrix <- model.matrix(~ total_cost_stand + sex + agestand + race + inscoverage + edu_year_stand + num_cc_stand,data = df)[,-1]
    
    f <- as.formula(paste(c(colnames(df_matrix))[1], 
             paste(c(colnames(df1_matrix[,c(2:ncol(df_matrix))])), collapse = "+"), 
             sep=" ~ "))
    
  3. 我创建了训练和测试数据框

    smp_siz <- floor(0.75*nrow(df_matrix))
    
    set.seed(465) 
    
    train_ind <- sample(seq_len(nrow(df_matrix)),size = smp_siz)
    
    train_df <- as.data.frame(df_matrix[train_ind, ])
    
    test_df <- as.data.frame(df_matrix[-train_ind, ])
    
  4. 鉴于我想使用 ReLU 作为激活函数,我创建了以下函数以放入神经网络

    relu_copy <- function(x) ifelse(x>=0, x, 0)
    
  5. 现在我运行神经网络

    nn <- neuralnet::neuralnet(f ,
                        data = train_df ,
                        hidden = c(2,2) ,
                        act.fct = relu_copy,
                        threshold = 0.01 ,
                        err.fct = "sse",
                        algorithm = "rprop+" ,
                        linear.output = TRUE)
    

然而,我的一些预测输出是负的,这不应该是不可能的,因为 a)我的所有数据都在 0 和 1 之间标准化,b)我使用了 ReLU 激活函数,它应该将所有负值转换为 0。

  output <- neuralnet::compute(nn, test_df[,-1]) 

  predict <- output$net.result * (max(df$total_cost) - min(df$total_cost)) + min(df$total_cost) 
  
  min(predict)
  [1] -1447.274

对于我为什么得到负面预测结果的任何提示/解释,我将非常感激。

谢谢!

4

0 回答 0