在扩展数据时,为什么火车数据集使用“适合”数据。和'转换',但测试数据集仅使用'转换'?

时间:2017-04-28 08:33:32

标签: python scikit-learn

在扩展数据时,为什么火车数据集使用“适合”?和'转换',但测试数据集仅使用'转换'?

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只使用变换而不适合?

7 个答案:

答案 0 :(得分:16)

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

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

答案 1 :(得分:4)

我们有两个数据集:培训和测试数据集。想象一下,我们只有两个功能:

'x1'和'x2'。

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

训练数据中的样本具有值:'x1'= 100且'x2'= 200 缩放时,'x1'的值为0.1,'x2'的值也为0.1。响应变量值为100。这些只计算了w.r.t训练数据的均值和标准。

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

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

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

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

*学习参数。而这又取决于

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

*训练数据的均值和标准

如果我们现在将standardscaler()与测试数据相匹配,则测试数据的'x1'和'x2'将具有自己的均值和标准。这意味着两个特征的新值又将仅与测试数据中的数据相关,因此与训练数据无任何关联。它几乎就像它们被减去并被随机值除以并且现在有了新的值,这些值并没有表明它们与训练数据的关系。

答案 2 :(得分:1)

fit()用于计算变换所需的参数,而transform()用于缩放数据以转换为模型的标准格式。

fit_tranform()是两个的组合,它有效地完成了上述工作。

由于fit_transform()已经在计算和转换训练数据,因此仅保留用于测试数据的转换,因为已经计算了转换所需的参数并且仅存储了测试数据的transform(),因此仅使用transform() of fit_transform()。

答案 3 :(得分:1)

fit()和transform()是通常用于解决数据集中缺失值的两种方法,可以通过计算数据的均值或中位数来填充缺失值,并用该值填充空白位置均值或中位数。 fit()用于计算平均值或中位数。 transform()用于用计算出的平均值或中位数填充缺失值。 fit_tranform()一次执行上述两项任务。 fit_transform()用于训练数据以执行上述操作。当涉及验证集时,仅需要transform(),因为您不想更改验证集时处理缺失值的方式,因为这样做您可能会惊讶地采用您的模型!!因此它可能无法达到预期的效果。

答案 4 :(得分:1)

您对数据进行的任何转换都必须由训练数据生成的参数来完成。

fit()方法所做的只是创建一个模型,该模型从您的训练样本中提取各种参数,以便稍后进行必要的转换。另一方面,transform()正在对数据本身进行实际转换,以返回标准化或缩放形式。

因此,

fit_transform()只是进行fit()transform()的操作的一种更快的方法。

重要的是,当您将数据集划分为训练集和测试集时,您想要实现的目标是在某种程度上模拟真实世界的应用程序。在现实世界中,您将仅拥有训练数据,并将根据该数据开发模型并预测相似数据的未知实例。

如果您使用fit_transform()转换entrire数据,然后拆分以进行训练测试,则您违反了该模拟方法,并且还根据看不见的示例进行了转换。这也将不可避免地导致产生一个乐观的模型,因为您已经通过看不见的样本指标为模型做了一些准备。

如果您拆分数据以进行训练测试并将fit_transform()应用于两者,则您也会被误认为是,第一次训练数据的转换将仅通过训练划分指标来完成,而第二次转换将仅通过测试指标来完成

进行这些预处理的正确方法是仅使用训练数据训练任何变压器,然后对测试数据进行转换。因为只有这样,您才能确保所得到的模型代表真实的解决方案。

遵循此步骤实际上是否无关紧要

fit(train)然后transform(train)然后transform(test)或者 fit_transform(train)然后transform(test)

答案 5 :(得分:0)

我们使用fit()fit_transform()来学习(训练模型)火车数据集。 transform()可以在训练模型上用于测试数据集。

答案 6 :(得分:0)

可能有两种方法: 第一种进场比例尺,具有拟合并转换火车数据,仅转换测试数据 第二次拟合并转换整个集合:train + test

如果您考虑:模型上线时如何处理缩放?:当新数据到达时,新数据的行为就像回测中看不见的测试数据一样。

在第一种情况下,新数据将仅进行比例转换,并且模型回测的比例值保持不变。

但是在第二种情况下,当有新数据出现时,您将需要对整个数据集进行拟合转换,这意味着回测缩放后的值将不再相同,然后需要重新训练模型。任务可以很快完成,然后我想就可以了 但是第一种情况需要的工作量更少...

如果训练和测试的缩放比例之间存在较大差异,则数据可能是不稳定的,而ML可能不是一个好主意