为TensorFlow扩展数据的正确方法是什么?



对于神经网络的输入,数据必须缩放到[0,1]范围。为此,我经常在博客中看到以下类型的代码:

x_train, x_test, y_train, y_test = train_test_split(x, y)
scaler = MinMaxScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)

这里的问题是测试集的最小值/最大值可能超出了训练集的最小值/最大值的范围。如果发生这种情况,则 X_test 中的规范化值将大于 1.0 或负数。例如:

train_data = [[0,3],[0,7],[0,9],[0,16],[0,10]]
test_data = [[1,1],[1,25],[1,6]]
scaler = MinMaxScaler()
train_scaled = scaler.fit_transform(train_data)
test_scaled = scaler.transform(test_data)
print(test_scaled)
[[ 1.         -0.15384615]
[ 1.          1.69230769]
[ 1.          0.23076923]]

一个简单的解决方案是在分裂之前缩放,但这并不能解决问题,除非在玩具样品中。 作为实际示例,请考虑异常检测,其中训练集通常由相当正常的数据组成。在这种情况下,异常情况可能包含超出网络在训练阶段看到的范围的数据。

在这种情况下,是否可以将>1.0 或 <0.0 的数字馈送到神经网络?如果不是,建议的规范化数据方法是什么?

(一种可能的解决方案是定义值的上限,例如训练期间看到的最大值的 120%,并将超过该值的任何值饱和到此上限。但是有没有预定义的缩放函数可以在缩放之前执行这种截止?

我明白你在说什么,但我认为这是因为您的训练集和测试集不是来自同一个数据集,因此是相同的范围。X_test集和X_train集应相互代表。如果您创建一个大型随机数据集,然后将其拆分,您会发现 MinMaxScaler(( 在指定的范围内执行所需的操作。

旁注:我个人不同意在拆分之前缩放,从而造成泄漏。

相关内容

  • 没有找到相关文章

最新更新