【问题标题】:what is the right way to scale data for tensorflow为张量流缩放数据的正确方法是什么
【发布时间】: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%,并将超过该上限的任何值饱和到该上限。但是是否有预定义的缩放函数可以做到这一点缩放前的截止值?)

【问题讨论】:

    标签: tensorflow scaletransform


    【解决方案1】:

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

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

    【讨论】:

    • 不,即使来自相同的数据源,训练阶段看到的范围也可能小于实际测试期间看到的范围。请参阅我在问题中添加的评论。
    • 我建议看看下面的link,也许看看最后一个 Normalize。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 2011-12-19
    相关资源
    最近更新 更多