scikit-learn 模型中的 fit 和 fit_transform 有什么区别?

数据挖掘 Python scikit-学习
2021-09-27 19:17:01

我不明白scikit-learn 中的fit和方法之间的区别。fit_transform谁能简单地解释为什么我们可能需要转换数据?

在训练数据上拟合模型并转换为测试数据是什么意思?例如,这是否意味着在训练中将分类变量转换为数字并将新特征集转换为测试数据?

4个回答

要使数据居中(使其具有零均值和单位标准误差),请减去均值,然后将结果除以标准差:

x=xμσ

您在数据的训练集上执行此操作。但是随后您必须将相同的转换应用于您的测试集(例如在交叉验证中),或者在预测之前应用于新获得的示例。但是你必须使用完全相同的两个参数μσ(值)用于使训练集居中。

因此,每个 scikit-learn 的变换fit()只是计算参数(例如μσStandardScaler的情况下)并将它们保存为内部对象的状态。之后,您可以调用其transform()方法将转换应用于任何特定的示例集。

fit_transform()加入这两个步骤,用于在训练集上进行参数的初始拟合x,同时还返回转换后的x. 在内部,transformer 对象只是先调用fit(),然后再transform()调用相同的数据。

下面的解释是基于fit_transform类的,但是对于其他 scikit_learn 类Imputer的想法是一样的,比如.fit_transformMinMaxScaler


transform用数字替换缺失值。默认情况下,此数字是您选择的某些数据的列的平均值。考虑以下示例:

imp = Imputer()
# calculating the means
imp.fit([
         [1,      3], 
         [np.nan, 2], 
         [8,      5.5]
        ])

现在 imputer 已经学会了使用均值 (1+8)2=4.5 对于第一列和平均值 (2+3+5.5)3=3.5 当第二列应用于双列数据时:

X = [[np.nan, 11], 
     [4,      np.nan], 
     [8,      2],
     [np.nan, 1]]
print(imp.transform(X))

我们得到

[[4.5, 11], 
 [4, 3.5],
 [8, 2],
 [4.5, 1]]

因此,由fitimputer 从一些数据中计算列的平均值,transform并将这些平均值应用于一些数据(这只是用平均值替换缺失值)。如果这两个数据相同(即用于计算均值的数据和应用均值的数据),您可以使用fit_transform基本上是 afit后跟 a 的数据transform

现在你的问题:

为什么我们可能需要转换数据?

“由于各种原因,许多现实世界的数据集包含缺失值,通常编码为空白、NaN 或其他占位符。然而,此类数据集与假定数组中的所有值都是数字的 scikit-learn 估计器不兼容”(来源

在训练数据上拟合模型并转换为测试数据是什么意思?

imputer的与用于模型拟合fit无关。fit因此,在训练数据上使用 imputerfit只是计算每列训练数据的均值。使用transform测试数据然后用从训练数据计算的平均值替换测试数据的缺失值。

这些方法用于 scikit-learn 中的数据集转换:

让我们举个例子来缩放数据集中的值:

fit方法在应用于训练数据集时,会学习模型参数(例如,均值和标准差)。然后,我们需要transform 在训练数据集上应用该方法以获得转换(缩放)的训练数据集。fit_transform我们还可以通过在训练数据集上应用,一步完成这两个步骤。

那么为什么我们需要 2 个单独的方法 -fittransform

在实践中,我们需要有单独的训练和测试数据集,这就是有一个单独的fit方法有transform帮助的地方。我们应用于训练数据集并在训练数据集和测试数据集上fit使用该方法。因此,然后使用在将方法应用于训练数据集transform时学到的模型参数对训练以及测试数据集进行转换(缩放) 。fit

示例代码:

scaler = preprocessing.StandardScaler().fit(X_train)
scaler.transform(X_train) 
scaler.transform(X_test) 

这不是一个技术性的答案,但希望它有助于建立我们的直觉:

首先,所有估计器都在一些训练数据上进行训练(或“拟合”)。这部分相当简单。

其次,所有 scikit-learn 估计器都可以在管道中使用,管道的想法是数据流经管道一旦适合管道中的特定级别,数据就会传递到管道中的下一个阶段,但显然需要以某种方式更改(转换)数据;否则,您根本不需要管道中的那个阶段。因此,转换是一种转换数据以满足管道下一阶段需求的方式。

如果您不使用管道,我仍然认为以这种方式考虑这些机器学习工具是有帮助的,因为即使是最简单的分类器仍在执行分类功能。它将一些数据作为输入并产生输出。这也是一个管道;只是一个非常简单的。

总之,fit执行训练,transform更改管道中的数据以将其传递到管道中的下一个阶段,并fit_transform在一个可能优化的步骤中进行拟合和转换。