文章来源:公众号至简量化
作者:复哥说
春分停步,冬至重启。
老号复更,快来围观!
文末有彩蛋~
本篇是人工智能选股系列的第13篇。
基于深度神经网络模型是机器学习最热门的分支,在《人工智能选股--卷积神经网络(CNN)篇》我们尝试用深度神经网络模型中的CNN模型进行选股,然而效果并不理想。
除了因为未对模型进行充分优化,还有一个可能的原因是这两个模型并不适合处理多因子表格数据,深度神经网络模型家族中最适合处理表格数据的是TabNet,所以我们接下来验证一下TabNet的选股效果。
TabNet简介
TabNet是Google Cloud 在2019年提出的专门针对表格型数据设计的神经网络结构。深度学习在图像、文本和语音等数据处理上有了广泛的应用,然而对于常见的表格数据,XGBoost和LightGBM这类提升树模型依然是首选。
TabNet结合了树模型和DNN的优势。它使用一种称为顺序注意机制(Sequential Attention Mechanism)的方法实现了instance-wise的特征选择,还通过encoder-decoder框架实现了自监督学习,从而实现了高性能且可解释的表格数据深度学习架构。
下面让我们通过TabNet的encoder和decoder结构看看它是怎么做到的。
TabNet原理
TabNet采用顺序多步架构,将输入从一个步骤传递到另一步骤。第i个步骤输入来自第i-1个步骤的处理信息来决定使用哪些特征,并输出处理后的特征表示以聚合到总体决策中。
1.标准化:
首先将特征输入BN(batch normalization层),而不需要对特征数据做全局标准化处理。
2.特征选择:
通过一个可学习的掩码器(Mask)来做特征选择,掩码器由attentive transformer通过前一步处理过的数据计算得出。attentive transformer模块由四部分组成,依次是FC(全连接层),BN,Prior scales和Sparsemax。
FC和BN无需介绍,Prior scales的作用是对于已经在之前的步骤中使用了多次的特征,减少它们的权重占比。Sparsemax通过将欧几里得投影映射到概率单纯形(simplex)来实现特征稀疏化。
Mask可以理解为在当前步骤对batch样本的注意力权重分配,对于不同的样本,Attentive transformer层输出的注意力权重也不同,这样的特征选择被称为instance-wise特征选择。
3.特征处理:
TabNet使用feature transformer处理筛选后的特征。Feature transformer模块由两个部分组成,前半部分的参数是所有步骤共享的,实现特征的共性处理;后半部分的参数是在每个步骤上分别训练的,实现特征的个性处理。
上图中的feature transformer前后两部分各有两个子模块,每个子模块由FC、BN和GLU(门控逻辑单元)组成,子模块之间用残差连接,乘0.5½以提高网络的稳定性。
Feature transformer模块的输出被Split分成两部分,一部分通过Relu激活函数用于计算模型的最终输出,另一部分用来计算下一步骤的Mask。
最后,采用类似决策树的聚合方法,构建整体决策嵌入。
4.自监督学习:
TabNet通过decoder来从TabNet的编码表示(representation)重建表格特征。decoder的结构比较简单,每一步由一个feature transformer 和一个FC组成,最后将每一步的输出相加以获得重构特征。
根据Google Cloud的论文,TabNet在多个表格数据集上的表现比肩甚至超越了当前广为人知的很多树模型,例如LightGBM,更重要的是它将使用者从繁琐耗时的特征工程中解脱出来。不过也有使用者表示人工做特征工程后再使用提升树模型可以达到的上限更高,这也是TabNet未能取代提升树的原因。
TabNet选股实现
与XGBoost一样,TabNet既可用于回归问题,也可用于分类问题。接下来我们采用与本系列其它篇同样的股票特征数据(详见《人工智能选股--线性回归和逻辑回归》)用TabNet进行涨跌分类预测。
TabNet有两个实现版本,分别是基于TensorFlow和Pytorch实现,前者被称为tf-TabNet,后者被称为PyTorch-TabNet,PyTorch-TabNet更受欢迎,因此本节的实现会基于PyTorch-TabNet。
具体使用的类是pytorch_tabnet.tab_model.TabNetClassifier,使用方法跟Sklearn包中的分类器差不多。需要注意的是用TabNetClassifier进行训练和预测时要把样本数据从Dataframe转成numpy。
核心代码如下:
1 alg = TabNetClassifier()
2 alg.fit(X_train.values, y_train)
3 alg.predict_proba(X_test.values)[:,1]
XGBoost预测因子分析效果如下:
分层测试走势:
实际回测效果:
实验表明TabNet在使用默认参数的情况下取得了远超CNN的预测效果,可见Google 针对表格数据做出的优化确实有效果。
在此基础上可以用前面讲过的超参数优化方法进一步调优,也可以将TabNet的预测结果与XGBoost的预测结果组合使用,因为二者的预测结果相关性很低,组合可以起到不错的效果。
参考文献:
Sercan O. Arık, Tomas Pfister ,TabNet: Attentive Interpretable Tabular Learning