我构建了一个神经网络来预测某种类型的数据(生物序列)。它有32个特征,其中12个具有特定单位,20个只是整数(但为正数)。我的正样本有648个,负样本有9000多个样本。
为了训练我的网络,我选取了500个正样本和500个负样本,其余用于测试。当我用3折交叉验证训练和测试我的网络时,只要我在将数据划分为训练和测试集之前对输入数据进行归一化处理,所有的情况都能达到100%的准确率。精确度和召回率都是100%。
当我不进行归一化处理时,同样的实验准确率下降到65-70%。精确度和召回率分别为5%和80%。
情况变得更加奇怪。当我使用第一个(归一化处理的)模型在几个随机数据集上进行测试,这些数据集存在于训练集中,但没有进行归一化处理(因为外部世界的数据无法归一化,因为我们处理的是单个实例),它预测所有样本为1或正样本,完全偏向于正样本。
当我使用第二个模型(未归一化的)时,它预测了更多的假阴性。
如果’outp’是训练集正样本的输出预测,’outn’是训练集负样本的输出预测,我计算了网络的阈值如下:
[ mean(outp) - std_dev(outp) + mean( outn) + std_dev(outn)] / 2
我得到了第一个模型的阈值为0.5,第二个模型的阈值为0.489
1) 问题出在哪里?能有人解释一下吗?
2) 在训练时,建议对数据进行归一化处理,但这是否意味着如果用户提供输入值,分类器会误解这些输入值,因为单个样本无法进行归一化处理?
3) 在这种问题或一般分类问题中,找到阈值的最佳方法是什么?
4) 我不知道还应该提供什么其他信息。请告诉我这些信息。
我提供了纪元到错误的图表链接。
https://www.dropbox.com/s/1gideuvbeje2lip/model2_unnormalised.jpghttps://www.dropbox.com/s/nb4zyt3h370pk8m/model1_normalised.jpg
还有一件事我想提一下,为了归一化,我使用了MATLAB的内置函数
我的正矩阵是32个特征乘以648个样本(即32 x 648)
负矩阵是32个特征乘以9014个样本(即32 x 9014)
在任何划分为训练、测试或验证集之前,两者都使用MATLAB的normr
函数进行了归一化处理。
回答:
你可以对数据进行归一化处理,但当你从用户那里接收到新的输入时,你必须使用你在训练网络时使用的相同的最小值和最大值来归一化他们的数据。因为内置函数不提供这些值,你可能需要手动归一化矩阵,然后存储最小值和最大值,以便稍后归一化用户输入。
我使用了这个公式,但还有其他公式存在:
MatNorm = (Mat - min(Mat)) / (max(Mat) - min(Mat))
另外,你在训练时使用了多少个正测试数据?