【问题标题】:Should I normalize training and test test separately after shuffling and splitting?我应该在洗牌和拆分后分别对训练和测试测试进行标准化吗?
【发布时间】:2019-04-07 05:05:26
【问题描述】:

我想在 [0,1] 范围内标准化我的数据。我应该在洗牌和拆分后对数据进行归一化吗?我应该重复相同的程序进行测试测试吗?我遇到了一个使用这种规范化的python代码。这是用目标范围 [0,1] 规范化数据的正确方法吗

`X_train = np.array([[ 1., -1.,  2.], [ 2.,  0.,  0.],[ 0.,  1., -1.]])
a= X_train
for i in range(3):
    old_range = np.amax(a[:,i]) - np.amin(a[:,i])
    new_range = 1 - 0
    f = ((a[:,i] - np.amin(a[:,i])) / old_range)*new_range + 0
    lis.append(f)
b = np.transpose(np.array(lis))
print(b)`

这是我标准化后的结果。

`[[0.5, 0., 1.]
[1., 0.5, 0.33333333]
[0., 1., 0.]]`

【问题讨论】:

  • 是的,您必须对测试集执行相同的操作。从上面的结果来看,该算法运行良好。但是,您可以使用 scikit-learn 包进行数据处理 s.t.你不会从头开始编写代码。
  • 那么现在我将从测试集的每一列中选择最小值和最大值吗?还是应该使用我在训练集中使用的相同的最小值和最大值(每列)?
  • 我还想确定是否应该在对数据进行洗牌后执行此规范化?还是在分别为每个班级改组之前?

标签: python machine-learning


【解决方案1】:

我应该在洗牌和拆分后对数据进行归一化吗?

是的。否则,您将泄露未来的信息(即在此处进行测试)。更多信息here;它用于标准化,而不是规范化(和 R,而不是 Python),但参数同样适用。

我应该重复相同的程序进行测试吗?

是的。使用适合训练数据集的缩放器。在这种情况下,这意味着使用训练数据集中的最大值和最小值来缩放测试数据集。这样可以确保与对训练数据执行的转换保持一致,并且可以评估模型是否可以很好地泛化。

您不必从头开始编写代码。使用sklearn

import numpy as np
from sklearn import preprocessing

X_train = np.array([[ 1., -1.,  2.], [ 2.,  0.,  0.],[ 0.,  1., -1.]])
X_test = np.array([[ 0, -1.,  1.5], [ 2.5,  0.,  1]])

scaler = preprocessing.MinMaxScaler()
scaler = scaler.fit(X_train)

X_train_minmax = scaler.transform(X_train)
X_test_minmax = scaler.transform(X_test)

注意:对于大多数应用程序,标准化是推荐的扩展方法preprocessing.StandardScaler()

【讨论】:

  • 你能解释一下这句话是什么意思吗? “使用适合训练数据集的缩放器。”
  • 已添加。回答了你的问题?
猜你喜欢
  • 2018-10-10
  • 1970-01-01
  • 1970-01-01
  • 2020-07-08
  • 2018-05-28
  • 2017-11-01
  • 1970-01-01
  • 2016-02-27
  • 2021-08-11
相关资源
最近更新 更多