scikit_learn模型中的fit和fit_transform之间的区别?


110

我是数据科学的新手,我不了解scikit-learn fitfit_transform方法之间的区别。谁能简单解释为什么我们可能需要转换数据?

对训练数据拟合模型并转换为测试数据意味着什么?这是否意味着例如在训练中将分类变量转换为数字并转换新功能集以测试数据?



@sds上面的答案给出了此问题的链接。
Kaushal28

我们应用fittraining dataset并使用transform上方法both-训练数据集和测试数据集
普拉卡什·库马尔

Answers:


117

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

x=xμσ

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

因此,每个sklearn的转换fit()仅计算参数(例如,在StandardScaler的情况下为和)并将其保存为内部对象状态。之后,您可以调用其方法以将转换应用于一组特定的示例。σμσtransform()

fit_transform()将这两个步骤结合在一起,并用于训练集上参数的初始拟合,但它也返回转换后的。在内部,它只是先调用然后对相同的数据进行调用。x 'xxfit()transform()


1
非常感谢您的回答。仅此而已。通过模型中的参数,它是否不意味着极高的斜率和截距是否意味着回归?当您拟合时,例如说线性回归,例如,拟合方法中拟合了哪些参数?归一化参数还是模型参数(例如斜率和截距)?
Kaggle

1
我的意思是转换内部的参数(在StandardScaler中为和)。无论转换的方法返回什么。查看归集本章,例如:scikit-learn.org/stable/modules/...σμσget_params()
K3 --- RNC

2
我以前的评论实际上是错误的。在线性回归的情况下,拟合的参数是coef_(即斜率和截距)get_params(),而不是返回的参数(而是返回的模型构造函数自变量及其相关值的集合)。
K3 --- rnc

好答案!在搜索该主题时,我碰到了您的帖子,但我需要澄清一下。这是否意味着如果假设我们要转换每个后续示例集,就永远不要调用fit_transform()它,因为它将不允许我们访问内部对象状态,以使用fit()在初始数据集上获得的相同参数转换后续示例?例如,当您拥有测试数据集并想要转换测试集以将其传递给训练有素的分类器时,就会出现这种情况。
AKKA,

致电后t.fit_transform(train_data)t 装好,因此可以放心使用t.transform(test_data)
K3 --- rnc '18

10

下面的解释是基于fit_transformImputer类,但这个想法是一样fit_transform的其他scikit_learn类一样MinMaxScaler


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

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

现在,当不当行为者应用于双列数据时,已经学会对第一列使用平均值(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]]

因此,由fit推动者根据某些数据计算列的均值,然后transform将这些均值应用于某些数据(这只是用均值替换缺失值)。如果这两个数据相同(即,用于计算均值的数据和该均值所适用的数据),则可以使用fit_transformfit其后基本上是a transform

现在您的问题:

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

“由于各种原因,许多现实世界的数据集包含缺失值,通常将其编码为空格,NaN或其他占位符。但是,这些数据集与scikit-learn估计器不兼容,后者假定数组中的所有值均为数字”(来源

对训练数据拟合模型并转换为测试数据意味着什么?

fit一个imputer有无关fit的模型中使用的配件。因此,使用imputer的fit训练数据只是计算训练数据各列的平均值。transform然后,使用测试数据将测试数据的缺失值替换为根据训练数据计算出的均值。


3

用外行的术语来说,fit_transform意味着先进行一些计算,然后再进行转换(例如,根据一些数据计算列的均值,然后替换缺失的值)。因此,对于训练集,您需要计算并进行转换。

但是对于测试集,机器学习根据训练集中学习到的内容应用预测,因此它不需要计算,只需执行转换即可。


3

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

让我们以在数据集中缩放值为例:

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

那么,为什么我们需要两种单独的方法- 拟合转换

在实践中,我们需要有一个单独的训练和测试数据集,而在这里,使用单独的拟合变换方法会有所帮助。我们将拟合应用于训练数据集,并对训练数据集和测试数据集都使用变换方法。因此,然后使用模型参数对训练以及测试数据集进行转换(缩放),该模型参数是通过将拟合方法应用于训练数据集而获得的。

示例代码:

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

2

这不是技术性的答案,但希望对我们的直觉很有帮助:

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

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

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

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


“”我们在训练数据集上应用拟合,并在训练数据集和测试数据集上都使用了变换方法“”“:尼斯
Prakash Kumar

2
我想你打算在下面发表评论。我将其转发给Prasad Nageshkar。(嗯……如果我有名望的话,我会的。)
埃里克·麦克拉克伦

1

通过应用转换,您试图使数据正常运行,例如,如果您有两个变量和都测量距离,但是的单位为厘米,而的单位为千米,那么为了比较这两个变量,必须将它们转换为相同的单位...就像“变形”正在表现出相似的行为或表现得像正态分布一样V1V2V1V2

遇到其他问题,您首先要在训练集中建立模型,即(该模型从训练集中学习数据的模式或行为),当您在测试集中运行相同的模型时,它将尝试识别相似的模式或行为。一旦确定,就得出结论并据此给出结果训练数据


0

考虑一项需要我们对数据进行规范化的任务。例如,我们可以使用最小-最大归一化或z得分归一化。模型中有一些固有参数。最小-最大归一化中的最小值和最大值以及z得分归一化中的平均值和标准偏差。fit()函数计算这些参数的值。

fit()的效果

转换函数将参数的值应用于实际数据,并给出归一化的值。

transform()的效果

fit_transform()函数在同一步骤中执行两项操作。

fit_transform()的效果

请注意,无论我们分两步执行还是一步执行,都会获得相同的值。


0

“拟合”计算均值和标准差,以用于以后的缩放。(只是计算),什么也不会给您。

“转换”使用先前计算的平均值和std自动缩放数据(从所有值中减去平均值,然后将其除以std)。

“ fit_transform”同时执行两个操作。因此,您可以用1行代码代替2行代码。

现在让我们在实践中看一下:

对于X训练集,我们执行“ fit_transform”,因为我们需要计算均值和标准差,然后使用它来自动缩放数据。对于X测试集,好了,我们已经有了mean和std,所以我们只做“转换”部分。

非常简单。你做的很棒。我的朋友,请继续努力:-)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.