【问题标题】:Should the same imputer co-efficients be used for training and test datasets?是否应该将相同的 imputer 系数用于训练和测试数据集?
【发布时间】:2019-08-22 22:29:14
【问题描述】:

我正在学习如何准备数据、构建估算器并使用训练/测试数据拆分进行检查。

我的问题是如何正确准备测试数据集。

我将数据分成测试集和训练集。正如"Hands on with machine learning with Scikit-Learn" 教我的那样,我为我的数据准备建立了一个管道:

num_pipeline = Pipeline([
        ('imputer', SimpleImputer(strategy="median")),
        ('std_scaler', StandardScaler()),
    ])

在训练我的估计器后,我想在测试数据上使用训练有素的估计器来验证我的准确性。但是,如果我通过我定义的管道传递我的测试特征数据,它不是仅从测试数据集和基于测试数据集的 std_scalar 计算新的中值,这将与训练数据集中的值不同?

为了保持一致性,我想重复使用在训练期间获得的变量。这就是估计器已安装的内容。例如,如果测试集只是单行(或者在生产中我有一个我想从中推导出预测的输入),那么如果单个输入有一个 NaN,那么中值甚至都无法实现!

我错过了什么步骤?

【问题讨论】:

  • 上面的管道将在训练集上拟合缩放参数,并使用这些参数来转换训练集和测试集,这是正确的做法。

标签: scikit-learn imputation train-test-split


【解决方案1】:

你必须记住,发生了什么:

Imagen 你有以下数据集(输入特征):

data = [[0, 1], [1, 0], [1, 0], [1, 1]]
scaler = StandardScaler()
scaler.fit(data)
print(scaler.mean_)
[0.75 0.55]
print(scaler.transform(data))
[[-1.73205081  1.        ]
 [ 0.57735027 -1.        ]
 [ 0.57735027 -1.        ]
 [ 0.57735027  1.        ]]

但现在如果你只使用(你在你的方法中所做的):

data = [[0, 1], [1, 0]]
data2 = [[1,0], [1,1]]
scaler = StandardScaler()
scaler.fit(data)
print(scaler.mean_)
[0.5 0.5]
print(scaler.transform(data2))
[[ 1. -1.]
 [ 1.  1.]]

但正如测试数据所命名的那样:在运行算法之前保持数据完全不变。

https://stats.stackexchange.com/questions/267012/difference-between-preprocessing-train-and-test-set-before-and-after-splitting

【讨论】:

  • 您绝对不应该对您的测试数据使用任何预处理,因为这会破坏单独测试集的意义。您在上面强调的问题既是数据拆分方式的问题,也是可用数据量的问题。
猜你喜欢
  • 2019-12-09
  • 2019-08-21
  • 2020-05-13
  • 2021-10-03
  • 2018-02-25
  • 2020-02-18
  • 2021-01-16
  • 1970-01-01
  • 2020-06-01
相关资源
最近更新 更多