6 tabNet: 堪比xgboost的深度学习模型

之前用过这个模型,现在也就想写一下。看过很多资料,这个文章最舒服AI研习社 - 研习AI产学研新知,助力AI学术开发者成长。大家可以参考下。

tabnet的主体思想是用nn来表示决策树,深度学习能够对多种类型数据进行编码,并将其结合起来减轻特征工程的依赖、端到端的表征学习。

1 特征掩码 

  

        输入是特征向量 [x_1,x_2],首先分别通过两个Mask层将x_1  和 x_2单独筛选(屏蔽一个,下面介绍如何筛选)出来,然后通过一个weight和bias都被专门设定过的全连接层,并将两个FC层的输出通过ReLU激活函数后相加起来,最后经过一个Softmax激活函数作为最终输出。如果与决策树的流程进行对比,我们可以发现其实这个神经网络的每一层都对应着决策树的相应步骤:Mask层对应的是决策树中的特征选择,这个很好理解;FC层+ReLU对应阈值判断,通过一个特定的FC层+ReLU之后,可以保证输出的向量里面只有一个是正值,其余全为0,而这就对应着决策树的条件判断;最后将所有条件判断的结果加起来,再通过一个Softmax得到最终的输出。

  

这是一个简单的决策树在2维特征下的决策过程,可以看到一共进行了两次分裂,分别是x1>a or not和x2>d or not,从而将原始的数据划分为了4个区域。

而tabnet是这么模拟的:

  

首先,使用mask(对,就是lstm+embedding的时候,padding填充用到的mask)分别对x1和x2处进行屏蔽,这样就实现了tree分裂的时候分别对每一个特征进行单独的分裂增益计算的过程。在每一维特征对应的分支里,都仅仅有这一维的特征参与了计算。这样就完美的模拟了tree单独对每一个特征进行分裂计算的过程,tabnet在输入端的每一个子网络结构单独对这个子网络输入的一个特征进行计算。

2 特征分割

tabnet的设计并没有模拟决策树的分裂增益过程,压根也没有分裂增益的计算公式在里面,所有的参数仍旧是通过梯度下降法来进行更新的,但是有意思的是,通过一种特殊的设计,可以实现选择哪些特征入模而不选择哪些特征入模:

        核心在这个部分,我们单单看x1这一端的输入即可,首先,这里的FC是一个设计特殊的全连接层,从上图能够看到,x2部分被mask调的地方对应的权重w固定为0,bias固定为-1(这里的设计其实主要是为了对齐,nn结构没有办法真正在物理结构上单独对特征进行分裂计算,通过这种曲线救国的方式来模拟,这里设计了0,0和-1,-1的原因主要在于方便特征进行拼接。

        C1x1-C1a和-C1x1+C1一个正一个负,则经过激活函数relu之后的结果必定为[a,0,0,0]或[0,a,0,0],a为正数,则表示对这个特征进行了选择,并且这个特征的权重为a;

3 实战

直接按转调用即可;

最难的部分是类别变量的使用:

categorical_columns = []
categorical_dims =  {}
for col in train.columns[train.dtypes == object]:
    print(col, train[col].nunique())
    l_enc = LabelEncoder()
    train[col] = train[col].fillna("VV_likely")
    train[col] = l_enc.fit_transform(train[col].values)
    categorical_columns.append(col)
    categorical_dims[col] = len(l_enc.classes_)

# 类别特征的位置

cat_idxs = [ i for i, f in enumerate(features) if f in categorical_columns]

# 类别特征 编码个数

cat_dims = [ categorical_dims[f] for i, f in enumerate(features) if f in categorical_columns]

其他部分参考这个代码就可以了
1 回归:锂电池温度预测top2 代码部分(一) Tabnet-CSDN博客

比肩xgboost和lightgbm表格数据的最强神器tabnet,而2020年退出的tabnet神经网络专门针对表格数据而诞生的神器。实战,单任务和多任务回归!!!_tabnet和xgboost差别-CSDN博客

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值