我正在用一个模型的数据训练我的 CNN 网络,而我正在用另一个模型的数据对其进行测试。我对每个样本执行最小最大标准化。每个样本的范围为 [-1,1]。我的问题是,在执行 min-max 归一化时,我们会在每个样本的特征中选择最小值和最大值。对于测试数据,我应该选择每个样本的最小值和最大值还是应该用训练数据的最小值和最大值对其进行归一化?
我们是否应该通过选择训练数据的最大值和最小值来标准化测试数据?
数据挖掘
机器学习
正常化
2022-03-13 10:08:08
2个回答
您应该使用您的训练数据拟合函数(拟合函数是指从数据中学习的缩放函数)只是因为您的测试数据集大小和特征值可能与您的训练不同,这将导致比例不同于用于您的训练数据的规模。假设您想用 1 行推断您的模型,如果您尝试在 minmaxscaler 上安装 1 行,这将是一个问题。
示例:假设您的特定功能的训练数据的最大值为100,最小值为0,您将其缩放到[0,1] => 100 将是 1,0 将保持不变。70 将是 0.7 , 60 = 0.6 等等。您继续到测试集并对其应用缩放,但碰巧测试集中相同特征的最大值为70(不幸的是,100 恰好只存在于训练集中)。如果您使用测试集进行扩展,您在测试集中的70将是1。你喂1 ( 70 ) 到您的模型,该模型受过训练以将1 视为 100因此错误。
您应该始终使用用于训练数据的参数/技术对测试数据进行标准化。
来自sklearn 链接的示例,
在这里,数据上的 scaler.fit() 学习参数并使用变换对数据进行规范化。相同的参数用于转换数据 [2, 2](测试数据)。这里的测试数据大小无关紧要,因为学习参数(来自训练数据)用于转换每个测试样本。
>>> from sklearn.preprocessing import MinMaxScaler
>>> data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
>>> scaler = MinMaxScaler()
>>> print(scaler.fit(data))
MinMaxScaler(copy=True, feature_range=(0, 1))
>>> print(scaler.data_max_)
[ 1. 18.]
>>> print(scaler.transform(data))
[[0. 0. ]
[0.25 0.25]
[0.5 0.5 ]
[1. 1. ]]
>>> print(scaler.transform([[2, 2]]))
[[1.5 0. ]]
其它你可能感兴趣的问题