Answers:
要使数据居中(使其具有零平均值和单位标准误差),请减去平均值,然后将结果除以标准偏差。
您可以在训练数据集上执行此操作。但是随后,您必须对测试集(例如,交叉验证)或在预测之前对新获得的示例应用相同的转换。但是,您必须使用与用于集中训练集相同的两个参数和(值)。σ
因此,每个sklearn的转换fit()
仅计算参数(例如,在StandardScaler的情况下为和)并将其保存为内部对象状态。之后,您可以调用其方法以将转换应用于一组特定的示例。σtransform()
fit_transform()
将这两个步骤结合在一起,并用于训练集上参数的初始拟合,但它也返回转换后的。在内部,它只是先调用然后对相同的数据进行调用。x 'fit()
transform()
get_params()
coef_
(即斜率和截距)get_params()
,而不是返回的参数(而是返回的模型构造函数自变量及其相关值的集合)。
fit_transform()
它,因为它将不允许我们访问内部对象状态,以使用fit()
在初始数据集上获得的相同参数转换后续示例?例如,当您拥有测试数据集并想要转换测试集以将其传递给训练有素的分类器时,就会出现这种情况。
t.fit_transform(train_data)
,t
已装好,因此可以放心使用t.transform(test_data)
。
下面的解释是基于fit_transform
的Imputer
类,但这个想法是一样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_transform
,fit
其后基本上是a transform
。
现在您的问题:
为什么我们可能需要转换数据?
“由于各种原因,许多现实世界的数据集包含缺失值,通常将其编码为空格,NaN或其他占位符。但是,这些数据集与scikit-learn估计器不兼容,后者假定数组中的所有值均为数字”(来源)
对训练数据拟合模型并转换为测试数据意味着什么?
在fit
一个imputer有无关fit
的模型中使用的配件。因此,使用imputer的fit
训练数据只是计算训练数据各列的平均值。transform
然后,使用测试数据将测试数据的缺失值替换为根据训练数据计算出的均值。
用外行的术语来说,fit_transform意味着先进行一些计算,然后再进行转换(例如,根据一些数据计算列的均值,然后替换缺失的值)。因此,对于训练集,您需要计算并进行转换。
但是对于测试集,机器学习根据训练集中学习到的内容应用预测,因此它不需要计算,只需执行转换即可。
这些方法用于scikit-learn中的数据集转换:
让我们以在数据集中缩放值为例:
在这里,拟合方法在应用于训练数据集时将学习模型参数(例如,均值和标准差)。然后,我们需要 在训练数据集上应用变换方法,以获取变换后的(缩放后的)训练数据集。通过在训练数据集上应用fit_transform,我们还可以一步完成两个步骤。
那么,为什么我们需要两种单独的方法- 拟合和转换?
在实践中,我们需要有一个单独的训练和测试数据集,而在这里,使用单独的拟合和变换方法会有所帮助。我们将拟合应用于训练数据集,并对训练数据集和测试数据集都使用变换方法。因此,然后使用模型参数对训练以及测试数据集进行转换(缩放),该模型参数是通过将拟合方法应用于训练数据集而获得的。
示例代码:
scaler = preprocessing.StandardScaler().fit(X_train)
scaler.transform(X_train)
scaler.transform(X_test)
这不是技术性的答案,但希望对我们的直觉很有帮助:
首先,对所有估计量进行一些训练数据的训练(或“拟合”)。这部分相当简单。
其次,所有scikit-learn估计器都可以在管道中使用,而管道的想法是数据流过管道。一旦适合管道中的特定级别,数据便会传递到管道中的下一个阶段,但是显然数据需要以某种方式进行更改(转换)。否则,您根本不需要管道中的该阶段。因此,转换是一种转换数据以满足流水线下一阶段需求的方法。
如果您不使用管道,我仍然认为以这种方式考虑这些机器学习工具会有所帮助,因为即使最简单的分类器也仍在执行分类功能。它以一些数据作为输入并产生输出。这也是一条管道。只是一个非常简单的。
总而言之,fit执行训练,transform更改管道中的数据,以将其传递到管道的下一个阶段,而fit_transform在一个可能的优化步骤中进行拟合和转换。