【问题标题】:PyTorch - How should you normalize individual instancesPyTorch - 你应该如何规范化单个实例
【发布时间】:2020-08-27 08:49:41
【问题描述】:

我正在使用 PyTorch 训练线性回归模型。我使用包含 200 张图纸的数据集训练了这个模型,这些图纸由几个有趣的特征表示。因为所有功能都在不同的范围内工作,所以我决定标准化我的训练数据以获得更好的结果。与这些图纸相关的标签表明公众对它们的看法。这一切都很顺利,我已经得到了一个相当一致的模型,因为我知道我只有一个包含 200 张图纸的训练集。下面是我的代码以获取更多详细信息:

# Reading the data
data = pd.read_csv('dataset.csv')
drawings = paintings_frame.iloc[:n, 1:]
labels = paintings_frame.iloc[:n, 0]

# Making sure it's in the right format
drawings_numpy = drawings.values.astype(np.float32)
labels_numpy = labels.values.astype(np.float32)
labels_numpy = labels_numpy.reshape(-1,1)

# Normalizing
scaler = MinMaxScaler()
drawings_numpy = scaler.fit_transform(drawings_numpy)

# Converting to Tensor datasets
inputs = torch.tensor(drawings_numpy)
targets = torch.tensor(drawingss_numpy)

# Loading it into the model
input_size = inputs.shape[1]
output_size = 1
model = nn.Linear(input_size, output_size)

然后我的代码继续定义损失和优化器并定义训练循环。但我想这是与这个问题最相关的部分。因此,在训练并保存了我的模型之后,我现在显然想使用这个模型来预测新给定图纸的标签。但是,如果我错了,请纠正我,在我看来,我必须标准化我现在提供给我的模型的任何绘图,以便像我对原始训练集所做的那样进行预测,对吗?如果是这样,我不是这种归一化究竟如何工作的专家,但我认为数据归一化的方式取决于数据的行为方式(例如,单个特征在数据集中可以具有的最小值和最大值)。如果是这种情况,我觉得我不能通过简单地调用与我用于训练集的相同函数来简单地标准化我现在想要预测的单个实例。是否有人能够阐明这究竟是如何工作的,或者我的推理是否有误?

【问题讨论】:

    标签: python scikit-learn linear-regression normalization


    【解决方案1】:

    你是对的。缩放将取决于数据在给定特征中的行为方式,即它的分布或在这种情况下只是最小值/最大值。
    由于测试实例不能很好地表示底层分布,但训练数据是(假设并且应该是),因此您保存缩放器的参数以供将来使用。
    我建议阅读 MinMaxScaler 和其他缩放器的文档 here

    get_params 方法返回您保存的参数,然后在推理过程中使用set_params 获得相同的缩放器,而不是在测试数据上拟合新的缩放器。

    【讨论】:

    • 我会查看文档。我说这仍然可能导致错误对我来说是正确的吗?例如,如果我的新绘图为某个特征引入了一个高于初始训练集中该特征的最大值的值。
    • 是的。这正是我称之为假设的原因。您也可以尝试 StandardScaler,因为它使用正态分布进行缩放,我认为它不太容易受到异常值的影响。您始终可以在 z=3 处剪裁异常值,然后使用 z=max(3,abs(z))*(z/abs(z))
    猜你喜欢
    • 2020-02-10
    • 2017-12-28
    • 2020-01-16
    • 2018-01-09
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多