首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

R与Python手牵手:特征工程

经常玩数据竞赛的人几乎达成了一个共识,就是建模过程大家都大同小异,但是特征工程则至关重要。数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。这里将会介绍一些最基本的特征工程方法以及代码的实现,供大家参考。这次的数据可以在下面网站找到:

https://github.com/dipanjanS/practical-machine-learning-with-python/tree/master/notebooks/Ch04_Feature_Engineering_and_Selection/datasets

Python

基本设置

原始数据特征

看到这份数据介绍的时候我也是惊呆了,这是关于“口袋妖怪”游戏的一个数据集,上面是关于一些妖怪们的攻击力、防御力、生命值、速度之类的参数,这个动画在我那个年代叫做“宠物小精灵”...Anyway,我们这个例子要看的就是数值型变量的基本特征,我们选其中三个进行观察。

(点击放大)

另外,有的原始数值型变量是通过计数来表示的,比如下面例子是用户听歌的记录,其中listen_count记录的是用户听了一首歌多少次。

二值化

关于听歌的案例,其实有一种粗略的理解,就是听过还是没听过,也就是不管听了多少次,只要不是没听过,就记录为1,其他是0.对于一些问题来说,听歌的绝对次数其实并不重要,比如一首歌的用户覆盖面,就不需要考虑哪些用户特别喜欢这首歌的问题。

Binarizer函数的阈值设定含义为,小于等于阈值的值都视为0,大于阈值的则视为1.

取整

有时候数据真的不需要太高的精度,高精度的数据会占用更多的内存,因此可以取整处理。应该说这种操作肯定是会损失信息量的,但是如果在一些情况下5.9和6.3被认为没有差别的时候,取整也许更加合适。

这个例子中,pop_percent的数据是百分比,因此我们可以用几成或百分点为单位来表示。

交互项构造

如果认为一些变量的平方项更有可能与因变量成一定关系,就应该构造二次项甚至是更高次的交互项。比如,我们如果有草地的长宽,我们要知道什么对绿化面积造成影响,就应该把长宽相乘。这只是一个比喻,很多情况下我们不知道是否需要构造交互项,但是先构造然后再进行筛选也是一个不错的选择。 在实际应用中,交互项是两个变量的乘积或自身的平方项,这样我们就知道两个变量之间是否存在相互影响。

有同学可能会问,我怎么知道列的名称呢?可以这么看:

也就是说哪个是一次项哪些是二次项哪些是交互项都可以看出来。pf自从用了fit_transform之后,就记录了这份数据构造二次项的模式,后面要从新使用就可以用transform函数了。

分箱

本质上是根据数值,把观测进行等级分类,比如60分以下判定为不及格,90分以上为优秀,就是简单的分箱。

得:

Text(0, 0.5, 'Frequency')

根据上面的分布图,进行分箱,也就是说10到20岁统一标为1。

或者我们可以自定义自己的分箱范围标准:

上面的意思是,0-15属于1级,30-45则属于3级,以此类推。

另一种分箱标准,就是采用分位数,比如四分位数。我们先看看数据,我们会对收入变量进行分箱。

得:

Text(0, 0.5, 'Frequency')

得:

Text(0, 0.5, 'Frequency')

数学变换

我们这里提到的数学变化,基本都是因为数据不服从正态性,通过变化让数据服从正态分布,这样我们才能够用一些模型进行拟合。比如线性回归就需要数据服从正态性分布,如果有偏的话结果就会不可信。这里我们介绍对数变换和Box-Cox变换。

对数变换

我们可以看到,上面一个例子中收入是不服从左右对称的正态分布的,我们用对数变换看看是否起到效果。

得:

Text(11.5, 450, '$\\mu$=10.43')

Box-Cox变换

做这个变换之前,首先要确定一个lambda值,不过建议傻瓜式复制就好,我们的任务只是要得到能够服从正态分布的一列变量而已。

得:

Optimal lambda value: 0.11799123945557663

得:

Text(24, 450, '$\\mu$=20.65')

这里计算了lambda为0,以及为最优值的Box-Cox转换值。

R

尽量简洁地解决上面提到的问题,在R中。

原始数据特征

二值化

取整

交互项构造

分箱

如果你发现跟python数据对不上,那就对了,因为python的[1071:1076]其实是1072到1076列,因为python是从0开始的,怎么样,够坑吧?

数学转换对数变换

Box-Cox变换

这里用的Box-Cox用的是forcast包,先计算最优参数,然后代入求BoxCox转化后的数值。

大家都在看

回复爬虫爬虫三大案例实战

回复Python1小时破冰入门

回复数据挖掘R语言入门及数据挖掘

回复人工智能三个月入门人工智能

回复数据分析师数据分析师成长之路

回复机器学习机器学习的商业应用

回复数据科学数据科学实战

回复常用算法常用数据挖掘算法

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181207B0KCNG00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券