python sklearn中的'transform'和'fit_transform'有什么区别

8gsdolmq  于 2023-06-20  发布在  Python
关注(0)|答案(9)|浏览(132)

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

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

0s0u357o

0s0u357o1#

在**scikit-learn estimator api**中,
fit():用于从训练数据生成学习模型参数
transform():由fit()方法生成的参数,应用于模型以生成转换数据集。
fit_transform():同一数据集上的fit()transform() api的组合

请参阅本book中的第4章stackexchange中的答案,以了解更多信息

gt0wga4j

gt0wga4j2#

这些方法用于给定数据的中心/特征尺度。它基本上有助于在特定范围内对数据进行规范化
为此,我们使用Z分数方法。

我们在训练数据集上这样做。
1.**Fit():**方法计算参数μ和σ,并将其保存为内部对象。
2.**Transform():**使用这些计算参数的方法将变换应用到特定的数据集。
3.**Fit_transform():**连接fit()和transform()方法对数据集进行转换。
功能缩放/标准化的代码片段(train_test_split之后)。

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

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

pieyvz9o

pieyvz9o3#

.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]])

所以你想fitRandomizedPCA然后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

uinbv5nw

uinbv5nw4#

为什么和何时使用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是一个dataframe,y是一个pandas Series对象(通常)

ut6juiuv

ut6juiuv5#

通俗地说,fit_transform意味着先进行一些计算,然后进行转换(比如从一些数据中计算列的均值,然后替换缺失的值)。所以对于训练集,你需要计算和转换。
但是对于测试集,机器学习基于在训练集期间学习到的内容应用预测,因此它不需要计算,它只需执行转换。

pvcm50d1

pvcm50d16#

方法之间的一般差异:

*fit(raw_documents[,y]):学习原始文档中所有标记的词汇字典。
*fit_transform(raw_documents[,y]):学习词汇字典并返回术语-文档矩阵。这相当于先拟合后变换,但实现起来更有效。
*transform(raw_documents):将文档转换为文档-术语矩阵。使用适合fit的词汇表或提供给构造函数的词汇表从原始文本文档中提取标记计数。

fit_transform和transform返回相同的Document-term矩阵。
Source

sqxo8psd

sqxo8psd7#

以下是.fit().fit_transform()的基本区别:
.fit()用于监督学习,有两个对象/参数(x,y)来拟合模型并使模型运行,其中我们知道我们要预测什么
.fit_transform()用于无监督学习,有一个对象/参数(x),我们不知道我们要预测什么。

p1iqtdky

p1iqtdky8#

当我们有两个不同元素的数组时,我们分别使用'fit'和transform,我们根据其内部函数拟合'array 1',例如在***MinMaxScaler***中(内部函数是找到均值和标准差)。例如,如果我们根据数组1的平均值拟合数组1并变换数组2,那么数组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)

输出

检查下面的输出,观察输出的基础上previos两个输出,你会看到差异。基本上,在数组1上,它取每列的平均值,并根据其列在数组2中丢失任何丢失的值。

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

这是我们要在一个数组的基础上转换另一个数组时所做的。但是当我们有一个单一的数组,我们想根据它自己的均值来变换它。在这种情况下,我们一起使用fit_transform

见下文;

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. ]])

为什么我们分别拟合和转换同一个数组,它需要两行代码,为什么我们不使用简单的fit_transform,它可以在一行代码中拟合和转换同一个数组。这就是fit和transform以及fit_transform之间的区别。

ep6jt1vc

ep6jt1vc9#

下面的答案适用于任何类型的sklearn相关库。在了解fit_transform之前,让我们看看fit方法是什么:
fit(X)-通过提取第一个主成分来用X拟合模型。
fit_transform(X)-用X拟合模型并对X应用降维。
fit_transform ---> fit(x).transform(x)
transform(x)-对X应用降维。
你可以查看sklearn随机PCA文档here了解更多细节。

相关问题