Sklearn 中的“转换”和“适合 _ 转换”的区别是什么

在 sklearn-python 工具箱中,有两个关于 sklearn.decomposition.RandomizedPCA的函数 transformfit_transform。这两个函数的描述如下

enter image description here enter image description here

但它们之间有什么区别呢?

131975 次浏览

.transform方法适用于已经计算了 PCA的情况,也就是说,如果已经调用了它的 .fit方法。

In [12]: pc2 = RandomizedPCA(n_components=3)


In [13]: pc2.transform(X) # can't transform because it does not know how to do it.
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-13-e3b6b8ea2aff> in <module>()
----> 1 pc2.transform(X)


/usr/local/lib/python3.4/dist-packages/sklearn/decomposition/pca.py in transform(self, X, y)
714         # XXX remove scipy.sparse support here in 0.16
715         X = atleast2d_or_csr(X)
--> 716         if self.mean_ is not None:
717             X = X - self.mean_
718


AttributeError: 'RandomizedPCA' object has no attribute 'mean_'


In [14]: pc2.ftransform(X)
pc2.fit            pc2.fit_transform


In [14]: pc2.fit_transform(X)
Out[14]:
array([[-1.38340578, -0.2935787 ],
[-2.22189802,  0.25133484],
[-3.6053038 , -0.04224385],
[ 1.38340578,  0.2935787 ],
[ 2.22189802, -0.25133484],
[ 3.6053038 ,  0.04224385]])
    

  

所以你想要 fit RandomizedPCA然后 transform作为:

In [20]: pca = RandomizedPCA(n_components=3)


In [21]: pca.fit(X)
Out[21]:
RandomizedPCA(copy=True, iterated_power=3, n_components=3, random_state=None,
whiten=False)


In [22]: pca.transform(z)
Out[22]:
array([[ 2.76681156,  0.58715739],
[ 1.92831932,  1.13207093],
[ 0.54491354,  0.83849224],
[ 5.53362311,  1.17431479],
[ 6.37211535,  0.62940125],
[ 7.75552113,  0.92297994]])


In [23]:

特别地,PCA .transform将通过对矩阵 X的 PCA 分解得到的基的变化应用于矩阵 Z

Scikit-learn 估计器 api中,

fit(): 用于从训练数据中生成学习模型参数

返回文章页面 由 fit()方法产生的参数,应用于模型生成转换后的数据集。

返回文章页面 fit()transform() api 在相同数据集上的组合

enter image description here

检查 第四章从这个 和答案从 堆栈交换为更清晰

这些方法用于给定数据的中心/特征尺度。 它基本上有助于规范化特定范围内的数据

为此,我们使用 Z-score 方法。

Z-Score

我们在训练数据集上做这个。

1. 适合() :方法计算参数 μ 和 σ,并将它们保存为内部对象。

2. 使用这些计算参数的 转换() :方法将转换应用于特定数据集。

3. Fit _ change () :联合了 fit ()和 change ()方法对数据集进行转换。

用于特性缩放/标准化的代码片段(train _ test _ split 之后)。

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
sc.fit_transform(X_train)
sc.transform(X_test)

我们在我们的测试集上应用相同的(训练集相同的两个参数 μ 和 σ (值))参数变换。

方法之间的一般差异:

  • Fit (raw _ document [ ,y ]) : 学习原始文档中所有标记的词汇表字典。
  • Fit _ change (raw _ document [ ,y ]) : 学习词汇表字典并返回术语-文档矩阵。这相当于在转换之后进行拟合,但更有效地实现了这一点。
  • 转换 (raw _ document) : 将文档转换为文档术语矩阵。使用适合的词汇表或提供给构造函数的词汇表从原始文本文档中提取令牌计数。

Fit _ change 和 change 都返回相同的 Document-term 矩阵。

来源

下面是 .fit().fit_transform()的基本区别:

.fit()用于具有两个对象/参数(x,y)的监督式学习 适合模型,使模型运行,在那里我们知道我们 将会预测

如果非监督式学习只有一个对象/参数(x) , 我们不知道我们将要预测什么。

为什么和什么时候使用的每一个 fit()transform()fit_transform()

通常我们有一个监督式学习问题(X,y)作为我们的数据集,我们把它分成训练数据和测试数据:

import numpy as np
from sklearn.model_selection import train_test_split


X_train, X_test, y_train, y_test = train_test_split(X, y)


X_train_vectorized = model.fit_transform(X_train)
X_test_vectorized = model.transform(X_test)

想象一下我们正在安装一个 tokenizer,如果我们安装 X,我们正在将测试数据包含到 tokenizer 中,但是我已经看到这个错误很多次了!

正确的做法是仅用 X _ train 来拟合,因为您不知道“您的未来数据”,所以不能使用 X _ test 数据来拟合任何东西!

然后您可以转换您的测试数据,但是要分开,这就是为什么有不同的方法的原因。

最后一点: X_train_transformed = model.fit_transform(X_train)相当于: X_train_transformed = model.fit(X_train).transform(X_train),但是第一个更快。

注意,我所说的“模型”通常是一个定标器,一个 tfidf 变换器,其他类型的矢量,一个标记..。

记住: X 代表特征,y 代表每个样本的标签。 X 是一个数据框架,y 是熊猫系列对象(通常)

通俗地说,fit _ change 意味着进行一些计算,然后进行转换(比如从一些数据中计算列的方式,然后替换缺失的值)。所以对于训练集,你需要计算和转换。

但是对于测试集,机器学习基于在训练集中学到的知识进行预测,所以它不需要计算,只需要进行转换。

当我们有两个具有不同元素的数组时,我们分别使用“拟合”和变换,我们基于数组1的内部函数来拟合它,比如在 < strong > MinMaxScaler 中(内部函数是查找平均值和标准差)。例如,如果我们根据数组1的平均值和转换数组2来拟合数组1,那么数组1的平均值将被应用到我们转换的数组2。简单地说,我们将一个数组转换为另一个数组的基本内部函数。

代码演示:

import numpy as np
from sklearn.impute import SimpleImputer
imp = SimpleImputer(missing_values=np.nan, strategy='mean')


temperature = [32., np.nan, 28., np.nan, 32., np.nan, np.nan, 34., 40.]
windspeed  = [ 6.,  9., np.nan,  7., np.nan, np.nan, np.nan,  8., 12.]
n_arr_1 = np.array(temperature).reshape(3,3)
print('temperature:\n',n_arr_1)
n_arr_2 = np.array(windspeed).reshape(3,3)
print('windspeed:\n',n_arr_2)

产出:

temperature:
[[32. nan 28.]
[nan 32. nan]
[nan 34. 40.]]
windspeed:
[[ 6.  9. nan]
[ 7. nan nan]
[nan  8. 12.]]

fittransform分别,变换阵列2的贴合(基于平均值)阵列1:

imp.fit(n_arr_1)
imp.transform(n_arr_2)

输出

检查下面的输出,观察基于前面两个输出的输出你会看到不同。基本上,在数组1上,它是取每一列的平均值,并在数组2中根据它的列,其中任何丢失的值被遗漏。

array([[ 6.,  9., 34.],
[ 7., 33., 34.],
[32.,  8., 12.]])

当我们想要基于另一个数组对一个数组进行转换时,就需要这样做。但是当我们有一个单独的数组,我们想要根据它自己的平均值来转换它。在这种情况下,我们一起使用 拟合变换

见下文;

imp.fit_transform(n_arr_2)

输出

array([[ 6. ,  9. , 12. ],
[ 7. ,  8.5, 12. ],
[ 6.5,  8. , 12. ]])

(上图)我们也可以这样做:

imp.fit(n_arr_2)
imp.transform(n_arr_2)

输出

array([[ 6. ,  9. , 12. ],
[ 7. ,  8.5, 12. ],
[ 6.5,  8. , 12. ]])

为什么要分别对同一个数组进行拟合和变换,它需要两行代码,为什么不用简单的拟合变换,在一行代码中对同一个数组进行拟合和变换。这就是拟合变换和拟合变换之间的区别。

下面的答案适用于任何类型的 sklearn 相关的库。在了解 fit_transform之前,让我们看看 fit 方法是什么:

通过提取第一个主成分,用 X 拟合模型。

fit_transform(X)-将模型与 X 配对,并在 X 上应用降维。

fit_transform-> fit(x).transform(x)

transform(x)-在 X 身上涂降维。

您可以看到 sklearn 随机 PCA 文件 给你的进一步细节。