如何处理神经网络中二进制和连续输入的混合?

机器算法验证 r 机器学习 数据转换 神经网络 网络
2022-02-08 14:36:56

我正在使用 R 中的 nnet 包尝试构建一个人工神经网络来预测公寓(个人项目)的房地产价格。我是新手,没有数学背景,所以请和我一起裸露。

我有二进制和连续的输入变量。例如,一些原本是/否的二进制变量被转换为神经网络的 1/0。其他变量是连续的,如Sqft

输入数据样本

我已将所有值标准化为 0-1。也许Bedrooms并且Bathrooms不应该标准化,因为它们的范围只有 0-4?

这些混合输入会给 ANN 带来问题吗?我得到了不错的结果,但经过仔细检查,ANN 为某些变量选择的权重似乎没有意义。我的代码在下面,有什么建议吗?

ANN <- nnet(Price ~ Sqft + Bedrooms + Bathrooms + Parking2 + Elevator + 
            Central.AC + Terrace + Washer.Dryer + Doorman + Exercise.Room + 
            New.York.View,data[1:700,], size=3, maxit=5000, linout=TRUE, decay=.0001)

更新: 根据下面关于将二进制输入分解为每个值类的单独字段的评论,我的代码现在看起来像:

ANN <- nnet(Price ~ Sqft + Studio + X1BR + X2BR + X3BR + X4BR + X1Bath
        + X2Bath + X3Bath + X4bath + Parking.Yes + Parking.No + Elevator.Yes + Elevator.No 
        + Central.AC.Yes + Central.AC.No + Terrace.Yes + Terrace.No + Washer.Dryer.Yes 
        + Washer.Dryer.No + Doorman.Yes + Doorman.No + Exercise.Room.Yes + Exercise.Room.No 
        + New.York.View.Yes + New.York.View.No + Healtch.Club.Yes + Health.Club.No,
    data[1:700,], size=12, maxit=50000, decay=.0001)

上面代码中的隐藏节点是 12,但我尝试了从 3 到 25 的一系列隐藏节点,结果都比我在上面发布的原始代码中的原始参数更差。我也试过线性输出=真/假。

我的猜测是我需要以不同的方式将数据提供给 nnet,因为它没有正确解释二进制输入。要么,要么我需要给它不同的参数。

有任何想法吗?

1个回答

处理这种情况的一种方法是重新调整输入,使它们的方差大致相同。该建议通常用于回归建模,但它确实适用于涉及在不同尺度上测量的变量的所有建模情况。这是因为二元变量的方差通常与连续变量的方差有很大不同。Gelman 和 Hill (2006) 建议将连续输入重新缩放两个标准差,以获得与(未缩放的)二进制输入的奇偶性。这一建议也反映在一篇论文博客文章中。

对神经网络更具体的建议是对二进制输入(即 -1 和 1)使用“效果编码”而不是“虚拟编码”(0 和 1),并采取额外的步骤将连续变量居中。这些建议来自Warren Sarle的广泛常见问题解答,特别是“为什么不将二进制输入编码为 0 和 1?”部分。和“我应该标准化输入变量吗?” 不过,要点是一样的:

输入的贡献将在很大程度上取决于其相对于其他输入的可变性。

至于无序的分类变量——您必须将它们分解为二元指标。否则它们根本没有意义。