【发布时间】:2020-05-10 15:05:55
【问题描述】:
对于神经网络的输入,数据必须缩放到 [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 或
(一种可能的解决方案是为这些值定义一个上限,例如,训练期间看到的最大值的 120%,并将超过该上限的任何值饱和到该上限。但是是否有预定义的缩放函数可以做到这一点缩放前的截止值?)
【问题讨论】: