Python: sklearn库中数据预处理函数fit_transform()和transform()的区别

Python: sklearn库中数据预处理函数fit_transform()和transform()的区别

最近学习Udacity的机器学习项目,在敲code的时候,发现涉及到sklearn数据预处理的两个函数:fit_transform()和transform(),这两个函数对于train data和test data是有区别的。

# 特征提取
# 将佐料转换成特征向量
vectorizer = TfidfVectorizer(stop_words='english', ngram_range=(1, 1),
                             analyzer='word', max_df=.57, binary=False,
                             token_pattern=r'\w+', sublinear_tf=False)
# 处理训练集
train_tfidf = vectorizer.fit_transform(train_ingredients).todense()
# fit_transform(),先拟合数据,再标准化数据

# 处理测试集
test_tfidf = vectorizer.transform(test_ingredients)

首先,TfidfVectorizer是一个文本特征提取的函数,这里先不介绍。详细介绍可见:TF-IDF与余弦相似性的应用(一):自动提取关键词
我们先来看一下这两个函数的API以及参数含义:

  • fit_transform()
    aLT
    即fit_transform()的作用就是先拟合数据,然后转化它将其转化为标准形式
  • transform()
    ALT
    即tranform()的作用是通过找中心和缩放等实现标准化

因此,fit_transform()和transform()的主要区别就是前者经历了一个fit过程,具体如下:
为了数据归一化(使特征数据方差为1,均值为0),我们需要计算特征数据的均值μ和方差σ^2,再使用下面的公式进行归一化:
x ′ = x − μ δ 2 x^\prime=\frac{x-\mu}{\delta^2} x=δ2xμ
我们在训练集上调用fit_transform(),其实找到了均值μ和方差σ^2,即我们已经找到了转换规则,我们把这个规则利用在训练集上,同样,我们可以直接将其运用到测试集上(甚至交叉验证集),所以在测试集上的处理,我们只需要标准化数据而不需要再次拟合数据。用一幅图展示如下:
ALT

注意:

  • 二者的功能都是对数据进行某种统一处理(比如标准化~N(0,1),将数据缩放(映射)到某个固定区间,归一化,正则化等)
  • fit_transform(traintData)对训练数据先拟合fit,找到该part的整体指标,如均值、方差、最大值最小值等等(根据具体转换的目的),然后对该trainData进行转换transform,从而实现数据的标准化、归一化等等。
  • 根据对之前部分fit的整体指标,对测试数据(testData)使用同样的均值、方差、最大最小值等指标进行转换transform(testData),从而保证part、rest处理方式相同
  • 必须先用fit_transform(trainData),之后再transform(testData)
  • 如果直接transform(trainData),程序会报错
  • 如果fit_transfrom(trainData)后,使用fit_transform(testData)而不用transform(testData),虽然也能归一化,但是两个结果不是在同一个“标准”下的,具有明显差异

原因:
sklearn里的封装好的各种算法都要fit、然后调用各种API方法,transform只是其中一个API方法,所以当你调用除transform之外的方法,必须要先fit,为了通用的写代码,还是分开写比较好。
也就是说,这个fit相对于transform而言是没有任何意义的,但是相对于整个代码而言,fit是为后续的API函数服务的,所以fit_transform不能改写为transform。

  • 6
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值