策略分享

利用 gplearn 进行特征工程

由small_q创建,最终由small_q 被浏览 1006 用户

更新

本文内容对应旧版平台与旧版资源,其内容不再适合最新版平台,请查看新版平台的使用说明

新版量化开发IDE(AIStudio):

https://bigquant.com/wiki/doc/aistudio-aiide-NzAjgKapzW

新版模版策略:

https://bigquant.com/wiki/doc/demos-ecdRvuM1TU

新版数据平台:

https://bigquant.com/data/home

https://bigquant.com/wiki/doc/dai-PLSbc1SbZX

新版表达式算子:

https://bigquant.com/wiki/doc/dai-sql-Rceb2JQBdS

新版因子平台:

https://bigquant.com/wiki/doc/bigalpha-EOVmVtJMS5

\

前言

featuretools有专门的 transfrom 类的特征处理方式,但是我在实际使用中没有使用,因为featuretool的思路是凡是能够进行特征变换的特征都要应用一遍,所以应用的模式基本上是生成大量的性能不强的特征,下一步必须进行严格的。

所以今天尝试用gplearn进行一下特征工程,本人能力有限,如有错误还请指正,也欢迎交流。

gplearn

gplearn是Python内最成熟的符号回归算法实现,作为一种一种监督学习方法,符号回归(symbolic regression)试图发现某种隐藏的数学公式,以此利用特征变量预测目标变量。

符号回归的具体实现方式是遗传算法(genetic algorithm)。一开始,一群天真而未经历选择的公式会被随机生成。此后的每一代中,最「合适」的公式们将被选中。随着迭代次数的增长,它们不断繁殖、变异、进化,从而不断逼近数据分布的真相。更详细的介绍可以参考:一文读懂遗传算法(附python)

当然我这里不是想尝试符号回归的机器学习方式,而是符号回归的机器学习方式提供了另外一种生成特征的思路,在库中通过Symbolic Transformer 类进行有关特征工程相关操作。

本文还是以 Home Credit Default Risk 110这个项目进行说明。

gplearn应用

在手工特征工程中,我们会对两个或者多个特征进行一些加减乘除的操作,来生成一些特征,希望能够生成一些。例如在start-here-a-gentle-introduction 79的这篇kernel中,根据领域的先验知识,对金额特征, 日期特征进行比值操作生成一些特征,这些特征经常能够提升验证集和测试集的分数,在模型中也有很高的重要程度。

app_test_domain['DAYS_EMPLOYED_PERCENT'] = app_test_domain['DAYS_EMPLOYED'] / app_test_domain['DAYS_BIRTH']

{w:100}{w:100}{w:100}{w:100}{w:100}但毕竟领域的先验知识是有限的,我们有时候也没有足够的先验知识,同时自己进行特征组合也经常费时费力,自己生成的大量特征不是都有足够的重要性,还需要进一步筛选。

gplearn这个库提供了解决的思路: - 随机化生成大量特征组合方式,解决了没有先验知识,手工生成特征费时费力的问题 - 通过遗传算法进行特征组合的迭代,而且这种迭代是有监督的迭代,存留的特征和label相关性是也来越高的,大量低相关特征组合会在迭代中被淘汰掉,用决策树算法做个类比的话,我们自己组合特征然后筛选,好比是后剪枝过程,遗传算法进行的则是预剪枝的方式。

变异的方式有兴趣的可以看看文档 变异 57,具体遗传算法的方式我只是看看思路,并没有仔细推导。官方给出的 例子 114 是用 sklearn中自带的波士顿房价数据来进行特征组合,但是只是给出了一个新生成的特征缺失提升了测试集的效果的结论。

所以,尝试还是用官方的数据,探索一下新生成的特征到底表现如何。

从以下几个方面考察:

  • 特征和label的相关性
  • 特征之间的共线性
  • 特征在模型中的重要程度
  • 特征对模型性能的提升

策略源码

具体代码如下 ,可直接克隆,查看源码:

https://bigquant.com/experimentshare/a0f9d79cb3ff4aef9468671598e2e8bd

\

标签

gplearn特征工程
评论
  • 你好,这个notebook打不开,能把. ipynb文件分享到邮箱2329428629@qq.com 。麻烦了!
  • 我这里可以打开的,可能克隆了没有自动打开,可以在左边找一下,或者再克隆一下。 ![{w:100}](/wiki/api/attachments.redirect?id=2c8c17bc-29f0-49f5-8b1c-b5044d9a705a) \
{link}