博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为什么训练集用fit_transform()而测试集用transform()及sklearn.feature_extraction.text.CountVectorizer API详解
阅读量:4145 次
发布时间:2019-05-25

本文共 2223 字,大约阅读时间需要 7 分钟。

真正讲明白的

 

API

 

真正讲明白的博客内容

Sklearn 里面的fit transform fit_transform的区别(为什么训练集用fit_transform()而测试集用transform()?)

 yyhhlancelot 最后发布于2018-12-19 15:34:40 阅读数 1820  收藏 12
展开
在国内网上找了很多资料,感觉都说的不明不白不清不楚,很多博客都是根据原始document来进行阐述,使用的时候也是按照格式使用,最后去外网感觉终于有点搞明白了来头。

参考:

https://stackoverflow.com/questions/23838056/what-is-the-difference-between-transform-and-fit-transform-in-sklearn

https://stackoverflow.com/questions/38692520/what-is-the-difference-between-fit-transform-and-transform-in-sklearn-countvecto
https://stackoverflow.com/questions/43675665/when-scale-the-data-why-the-train-dataset-use-fit-and-transform-but-the-te
https://sebastianraschka.com/faq/docs/scale-training-test.html
推荐大家一定点进第四个去阅读一下,如果觉得英文阅读不方便,也可以看一下我接下来的解释。

首先要提及的一点,这些方法都是用来对数据进行尺度化(标准化)。

我们使用Z-score方法将数据进行正态分布化:

对训练集使用这些方法:

fit():计算数据的参数,(均值),(标准差),并存储在对象中(例如实例化的CountVectorizer()等)。

transform():将这些参数应用到数据集,进行标准化(尺度化)。
fit_transform():将前两种方法合并,fit + transform,然后对数据集使用。
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
sc.fit_tranform(X_train)
sc.tranform(X_test)
不管是StandardScaler或是其他类,道理都是相通的,所以不用纠结类的问题。

这里就要提出来一个问题,为什么test数据集只使用transfrom()?

按照通俗的解释是 对测试集使用通过计算训练集相同的参数来进行尺度化,那到底是为什么呢?

下面我们用一个例子进行说明:

假设我的训练集有三个棒子的样本,它们分别是:

样本1:10cm  ---> class 2

样本2:20cm  ---> class 2
样本3:30cm  ---> class 1
通过给出的数据,我们可以算出以下参数:

mean : 20

std : 8.2
我们对数据进行标准化,得到以下:

样本1:-1.21  ---> class 2

样本2:0  ---> class 2
样本3:1.21  ---> class 1
现在我们对数据做一个假设结论,当小于0.6的就归到class 2,反之就归类到 class 1。这个假设看起来比较有意义,符合数据分布。

接下来,我们看看测试集的样本:

样本4:5cm  ---> class ?

样本5:6cm  ---> class ?
样本6:7cm  ---> class ?
这是“未标准化的”数据,如果我们不对它们进行标准化,那按我们刚刚的假设,那它们都属于class 1了?肯定不可能是吧,好的,那现在假如我们“重新”对它们计算参数,注意了,这里我们是针对测试集计算参数!

我们将测试集标准化后,得到了一下:

样本4:-1.21 

样本5:0 
样本6:1.21 
巧了,和刚刚训练集得到的一模一样。然后我们用我们刚刚训练集训练得到的结论,对它们分类:

样本4:-1.21  ---> class 2

样本5:0  ---> class 2
样本6:1.21  ---> class 1
奇怪的事情发生了,感觉不太对是吧?

那我们用训练集得到的参数对它们进行标准化呢:

样本4:-1.837

样本5:-1.715
样本6:-1.592
按我们开始的假设结论进行分类:

样本4:-1.837 ---> class 2

样本5:-1.715 ---> class 2
样本6:-1.592 ---> class 2
这下似乎看起来有意义多了,我们训练集似乎训练了一个比较说的通的模型(刚刚的假设结论~)。所以,你经常看到为什么大家在说,如果对test_data进行fit_transform()就会"overfitting"就是这么来的。
————————————————
版权声明:本文为CSDN博主「yyhhlancelot」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yyhhlancelot/article/details/85097656

你可能感兴趣的文章
MySQL的GUI工具
查看>>
Python基础-项目实战-day8新增API
查看>>
Android系统proc下查看cpuinfo的参数信息
查看>>
Java基础 01 第一个程序 Hello world
查看>>
Python基础-项目实战-day10 用户注册与登陆
查看>>
Android系统的获取 CPU 核数
查看>>
Android 系统 cpu0 目录查看 CPU 频率freq和策略policy
查看>>
Android 系统查看sys-devices-system-cpu-cpu0 目录结构
查看>>
Android系统 CPU 核数、频率、策略控制
查看>>
Python基础-Day 11 - 编写日志创建页
查看>>
Git for window 提示 Your console font probably doesn't support Unicode.
查看>>
Python基础-项目实战-Day 12 - 编写日志列表页
查看>>
Java基础 02 枚举类型用法
查看>>
Android系统读取 CPU温度(MTK平台)
查看>>
Android系统 固定住CPU频率
查看>>
Android系统 proc—cpufreq 目录,查看 CPU 电压,检查省电体质
查看>>
Java基础 03 对象和类
查看>>
Python 基础-项目实战-day 13 Android客户端开发(项目完结)
查看>>
Python的博客开发项目学习-(廖雪峰的Python3)
查看>>
Android源码浏览器的性能分析工具类
查看>>