缩放数据时,为什么训练数据集使用'fit'和'transform',而测试数据集只使用'transform'?

新手上路,请多包涵

缩放数据时,为什么训练数据集使用’fit’和’transform’,而测试数据集只使用’transform’?

 SAMPLE_COUNT = 5000
TEST_COUNT = 20000
seed(0)
sample = list()
test_sample = list()
for index, line in enumerate(open('covtype.data','rb')):
    if index < SAMPLE_COUNT:
        sample.append(line)
    else:
        r = randint(0,index)
        if r < SAMPLE_COUNT:
            sample[r] = line
        else:
            k = randint(0,index)
            if k < TEST_COUNT:
                if len(test_sample) < TEST_COUNT:
                    test_sample.append(line)
                else:
                    test_sample[k] = line
from sklearn.preprocessing import StandardScaler
for n, line in enumerate(sample):
sample[n] = map(float, line.strip().split(','))
y = np.array(sample)[:,-1]
scaling = StandardScaler()

X = scaling.fit_transform(np.array(sample)[:,:-1]) ##here use fit and transform

for n,line in enumerate(test_sample):
test_sample[n] = map(float,line.strip().split(','))
yt = np.array(test_sample)[:,-1]

Xt = scaling.transform(np.array(test_sample)[:,:-1])##why here only use transform

正如注释所说,为什么Xt只用transform而不用fit?

原文由 littlely 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 447
2 个回答

我们在训练数据上使用 fit_transform() 以便我们学习训练数据缩放的参数,同时我们缩放训练数据。我们只在测试数据上使用 transform() 因为我们使用在训练数据上学习的缩放参数来缩放测试数据。

这是缩放的标准程序。你总是在火车上学习你的缩放参数,然后在测试中使用它们。这是一篇很好地解释它的文章: https ://sebastianraschka.com/faq/docs/scale-training-test.html

原文由 BenDes 发布,翻译遵循 CC BY-SA 3.0 许可协议

我们有两个数据集:训练数据集和测试数据集。想象一下我们只有两个特征:

‘x1’ 和 ‘x2’。

现在考虑这个(一个非常假设的例子):

训练数据中的样本具有以下值:’x1’ = 100 和’x2’ = 200 缩放后,’x1’ 的值为 0.1,’x2’ 的值为 0.1。为此,响应变量值为 100。这些仅根据训练数据的均值和标准差计算得出。

测试数据中的样本具有以下值:’x1’ = 50 和’x2’ = 100。根据测试数据值缩放时,’x1’ = 0.1 和’x2’ = 0.1。这意味着我们的函数也将为该样本预测响应变量值 100。但这是错误的。它不应该是 100。它应该预测其他东西,因为上面提到的 2 个样本的特征的未缩放值不同,因此指向不同的响应值。只有当我们根据训练数据对其进行缩放时,我们才会知道正确的预测是什么,因为这些是我们的线性回归函数学习到的值。

我试图在下面解释这种逻辑背后的直觉:

我们决定在应用线性回归和拟合线性回归函数之前缩放训练数据集中的两个特征。当我们缩放训练数据集的特征时,所有“x1”特征都会根据不同样本的均值和标准差对其“x1”特征值进行调整。 “x2”功能也会发生同样的事情。这实质上意味着每个特征都已根据训练数据转换为新数字。就像每个特征都被赋予了相对位置。相对于训练数据的均值和标准差。因此每个样本的新“x1”和“x2”值仅取决于训练数据的均值和标准差。

现在,当我们拟合线性回归函数时会发生什么,它会根据训练数据集的缩放特征学习参数(即,学习预测响应值)。这意味着它正在学习根据训练数据集中不同样本的“x1”和“x2”的那些特定均值和标准差进行预测。所以预测值取决于:

*学习参数。这又取决于

*训练数据特征的值(已缩放)。并且由于缩放训练数据的特征取决于

*训练数据的均值和标准差。

如果我们现在将 standardscaler() 拟合到测试数据,则测试数据的“x1”和“x2”将具有自己的均值和标准差。这意味着这两个特征的新值将反过来仅与测试数据中的数据相关,因此与训练数据没有任何联系。这几乎就像它们已经被随机值减去和除以并且现在得到了新值,这些值没有传达它们与训练数据的关系。

原文由 aiish 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题