一. 前言
sklearn里的封装好的各种算法使用前都要fit,fit相对于整个代码而言,为后续API服务。fit之后,然后调用各种API方法,transform只是其中一个API方法,所以当你调用transform之外的方法,也必须要先fit。fit_transform与transform运行结果一致,但是fit与transform无关,只是数据处理的两个环节,fit是为了程序的后续函数transform的调用而服务的,是个前提条件
二. 区别
1.有监督学习的算法fit(x,y)
传两个参数。无监督学习的算法是fit(x)
,即传一个参数,比如降维、特征提取、标准化。
2.fit_transform
是fit
和transform
的组合。是将fit
和transform
合并,一步到位的结果。
3.fit_transform()
的作用就是先拟合数据,然后转化它将其转化为标准形式。
4.tranform()
的作用是通过找中心和缩放等实现标准化。
5.注意这是数据预处理中的方法:
Fit()
: Method calculates the parameters μ and σ and saves them as internal objects.
解释:简单来说,就是求得训练集X的均值啊,方差啊,最大值啊,最小值,这些训练集X固有的属性。可以理解为一个训练过程
Transform()
: Method using these calculated parameters apply the transformation to a particular dataset.
解释:在Fit的基础上,进行标准化,降维,归一化等操作(看具体用的是哪个工具,如PCA,StandardScaler等)。
Fit_transform()
: joins the fit() and transform() method for transformation of dataset.
解释:fit_transform是fit和transform的组合,既包括了训练又包含了转换
三. 相同点
1.transform()
和fit_transform()
二者的功能都是对数据进行某种统一处理(比如标准化~N(0,1),
将数据缩放(映射)到某个固定区间,归一化,正则化等)
2.fit_transform(trainData)
对部分数据先拟合fit,找到部分数据的整体指标,如均值、方差、最大值最小值等等(根据具体转换的目的),然后对trainData进行转换transform
,从而实现数据的标准化、归一化等等。根据对之前部分trainData进行fit的整体指标,对剩余的数据(testData)使用同样的均值、方差、最大最小值等指标进行转换transform(testData)
,从而保证train、test处理方式相同。
示例:
#标准化数据,保证每个维度的特征数据方差为1,均值为0。使得预测结果不会被某些维度过大的特征值而主导
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
sc.fit_tranform(X_train)
sc.tranform(X_test)
四. 注意点
必须先用fit_transform(trainData)
,之后再transform(testData)
。如果直接transform(testData)
,程序会报错。如果fit_transfrom(trainData)
后,使用fit_transform(testData)
而不使用transform(testData)
,虽然也能归一化,但是两个结果不是在同一个“标准”下的,具有明显差异。(一定要避免这种情况)
五. 为何训练集使用fit_transform(),而测试集使用tranform(),不再使用fit_transform();
因为在trainData的时候,已经使用fit()或者fit_transform得到了整体的指标(均值,方差等),所以在测试集上直接transform(),使用之前的指标,如果在测试集上再进行fit(),由于两次的数据不一样,导致得到不同的指标,会使预测发生偏差,因为模型是针对之前的数据fit()出来的标准来训练的,而现在的数据是新的标准,会导致预测的不准确。
fit_transform()
干了两件事:fit找到数据转换规则,并将数据标准化。transform
:是将数据进行转换,比如数据的归一化和标准化,将测试数据按照训练数据同样的模型进行转换,得到特征向量。
可以直接把转换规则拿来用,所以并不需要fit_transform()
,否则,两次标准化后的数据格式(或者说数据参数)就不一样了