Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python ';转换';和';fit#u变换';在sklearn_Python_Scikit Learn - Fatal编程技术网

Python ';转换';和';fit#u变换';在sklearn

Python ';转换';和';fit#u变换';在sklearn,python,scikit-learn,Python,Scikit Learn,在sklearn python工具箱中,有两个函数transform和fit_transform关于sklearn.decomposition.RandomizedPCA。两个功能的描述如下所示 但是它们之间有什么区别呢 当您已经计算了PCA时,即如果您已经调用了它的.fit方法,则使用.transform方法 In [12]: pc2 = RandomizedPCA(n_components=3) In [13]: pc2.transform(X) # can't transform b

在sklearn python工具箱中,有两个函数
transform
fit_transform
关于
sklearn.decomposition.RandomizedPCA
。两个功能的描述如下所示


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

当您已经计算了
PCA
时,即如果您已经调用了它的
.fit
方法,则使用
.transform
方法

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

尤其是PCA
.transform
将通过矩阵
X
的PCA分解获得的基的变化应用于scikit学习估计器api中的矩阵
Z

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

transform()
: 从
fit()
方法生成的参数,应用于模型以生成转换后的数据集

fit\u transform()
: 同一数据集上的
fit()
transform()
api的组合


查看第4章,并回答,以获得更清晰的信息。这些方法用于确定给定数据的中心/特征比例。 它基本上有助于规范化特定范围内的数据

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

我们在训练数据集上这样做

1.Fit():方法计算参数μ和σ,并将其保存为内部对象

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

3.Fit\u transform():连接Fit()和transform()方法以转换数据集

用于功能缩放/标准化的代码片段(在列车测试分割后)


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

方法之间的一般差异:

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


这里是
.fit()
.fit\u transform()
之间的基本区别:

.fit()
用于具有两个对象/参数(x,y)的监督学习 为了适应模型并使模型运行,我们知道 我们将预测

.fit_transform()
用于具有一个对象/参数(x)的无监督学习,
在我们不知道的地方,我们将预测什么。

为什么以及何时使用
fit()
transform()
fit\u 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)
假设我们正在装配一个标记器,如果我们装配X,我们将测试数据包括到标记器中,但是我已经多次看到这个错误

正确的做法是仅适用于X_train,因为您不知道“您未来的数据”,因此无法使用X_测试数据来拟合任何东西

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

最后提示:
X\u train\u transformed=model.fit\u transform(X\u train)
相当于:
X\u train\u transformed=model.fit(X\u train).transform(X\u train)
,但第一个更快


请注意,我所称的“模型”通常是一个定标器、一个tfidf转换器、其他类型的向量器、一个标记器……

用外行的话说,fit_transform意味着进行一些计算,然后进行转换(比如从一些数据中计算列的平均值,然后替换缺少的值)。所以,对于训练集,您需要计算并进行转换


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

当我们有两个具有不同元素的数组时,我们分别使用“拟合”和转换,我们根据“数组1”的内部函数(如在MinMaxScaler中)对其进行拟合(内部函数是查找平均值和标准偏差)。例如,如果我们根据“数组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.]]
fit
transform
分别变换已拟合(基于平均值)数组1的数组2:

输出

array([[ 6. ,  9. , 12. ],
       [ 7. ,  8.5, 12. ],
       [ 6.5,  8. , 12. ]])
array([[ 6. ,  9. , 12. ],
       [ 7. ,  8.5, 12. ],
       [ 6.5,  8. , 12. ]])
检查下面的输出,根据previos两个输出观察输出,您将看到差异。基本上,在数组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. ]])
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. ]])
array([[ 6. ,  9. , 12. ],
       [ 7. ,  8.5, 12. ],
       [ 6.5,  8. , 12. ]])
为什么我们要分别对同一个数组进行拟合和变换,这需要两行代码,为什么我们不使用简单的拟合变换呢