fit,transform,fit_transform详解
写在前⾯
fit和transform没有任何关系,仅仅是数据处理的两个不同环节,之所以出来fit_transform这个函数名,仅仅是为了写代码⽅便,会⾼效⼀点。
sklearn⾥的封装好的各种算法使⽤前都要fit,fit相对于整个代码⽽⾔,为后续API服务。fit之后,然后调⽤各种API⽅法,transform 只是其中⼀个API⽅法,所以当你调⽤transform之外的⽅法,也必须要先fit。
fit原义指的是安装、使适合的意思,其实有点train的含义,但是和train不同的是,它并不是⼀个训练的过程,⽽是⼀个适配的过程,过程都是确定的,最后得到⼀个可⽤于转换的有价值的信息。
fit,transform,fit_transform常⽤情况分为两⼤类
1. 数据预处理中⽅法
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的组合,既包括了训练⼜包含了转换。
transform()和fit_transform()⼆者的功能都是对数据进⾏某种统⼀处理(⽐如标准化~N(0,1),将数据缩放(映射)到某个固定区间,归⼀化,正则化等)
fit_transform(trainData)对部分数据先拟合fit,到该part的整体指标,如均值、⽅差、最⼤值最⼩值等等(根据具体转换的⽬的),然后对该全部trainData进⾏转换transform(补缺失值等),从⽽实现数据的标准化、归⼀化等等。
为什么测试集上不进⾏fit(),直接进⾏transform呢?是因为在trainData的时候,已经使⽤fit()得到了整体的指标(均值,⽅差等),所以在测试集上直接transform(),使⽤之前的指标,如果在测试集上再进⾏fit(),由于两次的数据不⼀样,导致得到不同的指标,会使预测发⽣偏差,因为模型是针对之前的
数据fit()出来的标准来训练的,⽽现在的数据是新的标准,会导致预测的不准确。
根据对之前部分trainData进⾏fit的整体指标,对剩余的数据(testData)使⽤同样的均值、⽅差、最⼤最⼩值等指标进⾏转换
transform(testData),从⽽保证train、test处理⽅式相同。所以,⼀般都是这么⽤:
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
sc.fit_tranform(X_train)
2. 各种算法的fit,transform⽅法
举两个例⼦:
1. CountVectorizer举例,sklearn的CountVectorizer库是根据输⼊数据获取词频矩阵(稀疏矩阵)
fit(raw_documents) :根据CountVectorizer参数规则进⾏操作,⽐如滤除停⽤词等,拟合原始数据,⽣成⽂档中有价值的词汇表;transform(raw_documents):使⽤符合fit的词汇表或提供给构造函数的词汇表,从原始⽂本⽂档中提取词频,转换成词频矩阵。
fit_transform(raw_documents, y=None):学习词汇词典并返回术语 - ⽂档矩阵(稀疏矩阵)。transform英文
2. TfidfTransformer举例,TF-IDF(Term frequency * Inverse Doc Frequency)词权重
在较低的⽂本语料库中,⼀些词⾮常常见(例如,英⽂中的“the”,“a”,“is”),因此很少带有⽂档实际内容的有⽤信息。如果我们将单纯的计数数据直接喂给分类器,那些频繁出现的词会掩盖那些很少出现但是更有意义的词的频率。
为了重新计算特征的计数权重,以便转化为适合分类器使⽤的浮点值,通常都会进⾏tf-idf转换。词重要性度量⼀般使⽤⽂本挖掘的启发式⽅法:TF-IDF。IDF,逆向⽂件频率(inverse document frequency)是⼀个词语普遍重要性的度量(不同词重要性的度量)。
fit(raw_documents, y=None):根据训练集⽣成词典和逆⽂档词频 由fit⽅法计算的每个特征的权重存储在model的idf_属性中。
transform(raw_documents, copy=True):使⽤fit(或fit_transform)学习的词汇和⽂档频率(df),将
⽂档转换为⽂档 - 词矩阵。返回稀疏矩阵,[n_samples, n_features],即,Tf-idf加权⽂档矩阵(Tf-idf-weighted document-term matrix)。
总结:
上述第⼀类和第⼆类等价。算法中的fit⽅法的应⽤等价于第⼀类的fit,只不过产⽣的结果意义不同(不是均值等统计意义,⽽是根据算法本⾝拟合获取不同信息以备后⽤),transform根据fit的结果转换成⽬标形式,具体需深究代码实现。
Note:
必须先⽤fit_transform(trainData),之后再transform(testData)
如果直接transform(testData),程序会报错
如果fit_transfrom(trainData)后,使⽤fit_transform(testData)⽽不transform(testData),虽然也能归⼀化,但是两个结果不是在同⼀个“标准”下的,具有明显差异。(⼀定要避免这种情况)
附: 另⼀个⾓度理解fit和transform
fit_transform是fit和transform的结合,所以只需要了解fit和transform。
transform⽅法主要⽤来对特征进⾏转换。
从可利⽤信息的⾓度来说,转换分为⽆信息转换和有信息转换。
⽆信息转换是指不利⽤任何其他信息进⾏转换,⽐如指数、对数函数转换等。
有信息转换从是否利⽤⽬标值向量⼜可分为⽆监督转换和有监督转换。
⽆监督转换指只利⽤特征的统计信息的转换,统计信息包括均值、标准差、边界等等,⽐如标准化、PCA法降维等。
有监督转换指既利⽤了特征信息⼜利⽤了⽬标值信息的转换,⽐如通过模型选择特征、LDA法降维等。
通过总结常⽤的转换类,我们得到下表:
所以,只有有信息的转换类的fit⽅法才实际有⽤,显然fit⽅法的主要⼯作是获取特征和⽬标值有价值的信息,在这点上,fit⽅法和模型训练时的fit⽅法就能够联系在⼀起了:**都是通过分析特征和⽬标值,提取有价值的信息。对于转换类来说是某些统计量;对于模型来说可能是特征的权值系数等。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论