我建立了一个神经网络来预测某种数据(生物序列)。它有32个功能,其中12个具有某些单位,20个只是整数(但是正数)。我的阳性组有648个样本,9000多个样本为阴性。
为了训练我的网络,我拿了500个样本,其余用于测试。当我通过3次交叉验证对我的网络进行训练和测试时,它为所有情况提供了100%的准确性,前提是我在将输入数据划分为训练和测试集之前对输入数据进行了规范化。 Precision和Recall是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.jpg https://www.dropbox.com/s/nb4zyt3h370pk8m/model1_normalised.jpg
我还想提一下,为了规范化,我使用了MATLAB的内置函数
我的正矩阵是64个样本(即32 x 648)的32个特征
和负矩阵是90个样本(即32 x 9014)的32个特征
在使用MATLAB的normr
函数进行任何分区作为训练或测试或验证集之前,最初使用它们进行归一化。
答案 0 :(得分:3)
您可以规范化您的数据,但是当您收到用户的新输入时,您必须使用训练网络时使用的相同“min”和“max”来规范化数据。 由于内置函数没有为您提供这些值,您可能需要手动标准化矩阵,然后存储'min'和max'以便以后标准化用户输入。
我使用这个公式,但其他公式存在:
MatNorm = (Mat - min(Mat)) / (max(Mat) - min(Mat))
另外,您使用了多少次阳性测试数据?
答案 1 :(得分:1)
如果您使用standard scaling策略,请将从培训中获得的mean
和std
值应用于验证/测试数据以进行规范化。还建议进行10倍交叉验证。