机器学习中的TabNet


在本教程中,我们将学习机器学习中的TabNet。据我们所知,深度学习模型越来越受欢迎,被用于解决表格数据问题。由于其选择的特征的相关性和有效性,XGBoost、RFE和LightGBM一直主导着这一领域。然而,TabNet改变了这一动态。

谷歌云的研究人员在2019年提出了TabNet。TabNet背后的理念是成功地将深度神经网络应用于表格数据,而表格数据仍然包含大量用户和处理后的数据。

TabNet结合了两个世界的优点:它具有可解释性(类似于更简单的基于树的模型),同时又很快(类似于深度神经网络)。这使得它成为零售、金融和保险等行业的理想选择,包括预测、欺诈检测和信用评分预测。

TabNet使用一种称为顺序注意力的机器学习方法,在模型的每个阶段选择要从中得出结论的模型特征。通过这种方法,模型可以学习更精确的模型,并且可以解释它是如何生成预测的。除了优于其他神经网络和决策树之外,TabNet的架构还提供了易于理解的特征归因。TabNet实现了表格数据的深度学习,提供卓越的性能和可解释性。

TabNet 架构

编码器

因此,该设计主要由几个连续的阶段组成,这些阶段将输入从一个阶段传递到另一个阶段。报告还提供了一些关于如何选择阶段数量的建议。因此,当我们采取一个单一步骤时,会发生三个过程 -

  • 四个连续的 GLU 决策块构成了特征转换器。

  • 一个注意力转换器,使用稀疏矩阵实现稀疏特征选择,增强可解释性并改进学习,因为容量保留给最重要的特征。

  • 掩码与转换器一起用于输出决策参数 n(d) 和 n(a),然后将其传递到最终阶段。

因此,对包含所有特征的基本数据集没有进行任何特征工程。在进行批标准化 (BN) 后,数据被发送到特征转换器,在那里它经过四个 GLU 决策过程以生成两个参数。

  • 在回归或分类的情况下,提供输出决策 n(d),它表示连续数字或类别的预测。

  • 下一个注意力转换器将接收 n(a) 作为输入,在那里启动下一个循环。

Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career.

解码器

在决策阶段,TabNet 解码器架构包括一个特征转换器,后面跟着全连接层。

特征转换器

全连接层、批标准化层和 GLU 是特征转换器中前四个连续的块。GLU 代表门控线性单元,它基本上是 x 的 sigmoid 乘以 x。(GLU = σ(x) . x)。因此,它们由两个共享选择过程组成,后面跟着两个独立的决策阶段。由于每个阶段使用相同的输入特征,因此层在两个决策阶段之间共享以实现稳健学习。通过确保整个网络中的变化不会波动太大,值为 √0.5 的归一化有助于稳定学习。它产生前面解释过的两个输出 n(d) 和 n(a)。

注意力转换器

如您所见,注意力转换器由四个层组成:FC、BN、先验尺度和 Sparsemax。在批标准化之后,n(a) 输入被发送到一个全连接层。之后,它乘以先验尺度,这是一个函数,指示您从先前阶段对特征的了解程度以及在这些阶段中使用了多少特征。如果将其设置为 1,则每个特征都同等重要。但是,Tabnet 的主要优势在于它在端到端学习中使用具有受控稀疏性的软特征选择,其中一个模型同时处理特征选择和输出映射。

需要记住的关键点

  • 特征、注意力和特征掩码转换器构成 TabNet 编码器。一个拆分块拆分处理后的表示,以便它可以同时用于整体输出和下一阶段的注意力转换器。特征选择掩码为每个阶段提供了有关模型功能的可解释数据,并且可以组合掩码以创建全局特征重要性归因。

  • TabNet 解码器的每个阶段都包含一个特征转换器块。

  • 显示了一个具有四层网络的特征转换器块示例,其中两层由所有决策步骤共享,另外两层取决于决策步骤。每一层都由 BN、GLU 非线性函数和一个全连接 (FC) 层组成。

  • 注意力转换器块通过使用过去的尺度数据调制单层映射来说明这一点,该数据聚合了每个特征在当前决策步骤之前被使用的程度。

TabNet 的主要优势

  • 编码多种数据类型,例如图像和表格数据,然后使用非线性函数进行求解。

  • 无需进行特征工程,可以将所有列都扔给模型,它将选择最佳属性,这些属性也是可解释的。

实现 TabNet

在本教程中,我们将使用来自“房价:高级回归技术”的数据。在这个例子中,我没有进行任何特征工程或数据清理,例如异常值去除,而是使用最基本的方法来处理任何缺失值。

您可以从这里下载数据,并将其用于您的环境中。

安装和导入库

!pip install pytorch-tabnet import pandas as pd import numpy as np from pytorch_tabnet.tab_model import TabNetRegressor from sklearn.model_selection import KFold

数据集 URL

train_data_url = "https://raw.githubusercontent.com/JayS420/Tabnetdataset/main/train.csv"
test_data_url = "https://raw.githubusercontent.com/JayS420/Tabnetdataset/main/test.csv"

导入数据集

train_data = pd.read_csv(train_data_url, error_bad_lines=False)
test_data = pd.read_csv(test_data_url, error_bad_lines = False)

选择一些特征

features = ['LotArea', 'OverallQual', 'OverallCond', 'YearBuilt', 'YearRemodAdd', 'BsmtFinSF1', 'BsmtFinSF2', 'TotalBsmtSF', '1stFlrSF', 'LowQualFinSF', 'GrLivArea', 'BsmtFullBath', 'BsmtHalfBath', 'HalfBath', 'BedroomAbvGr', 'Fireplaces', 'GarageCars', 'GarageArea', 'WoodDeckSF', 'OpenPorchSF', 'EnclosedPorch', 'PoolArea', 'YrSold']

拆分数据集

X = train_data[features] y = np.log1p(train_data["SalePrice"]) X_test = test_data[features] y_test = ["SalePrice"]

填充缺失数据

任何缺失数据都将用简单的平均值填充。关于在使用交叉验证之前执行此操作的相对优势。

X = X.apply(lambda x: x.fillna(x.mean()),axis=0)
X_test = X_test.apply(lambda x: x.fillna(x.mean()),axis=0)

将数据转换为 NumPy

X = X.to_numpy() y = y.to_numpy().reshape(-1, 1) X_test = X_test.to_numpy()

应用 K 折交叉验证

kf = KFold(n_splits=5, random_state=42, shuffle=True) predictions_array =[] CV_score_array =[] for train_index, test_index in kf.split(X): X_train, X_valid = X[train_index], X[test_index] y_train, y_valid = y[train_index], y[test_index] regressor = TabNetRegressor(verbose=0,seed=42) regressor.fit(X_train=X_train, y_train=y_train, eval_set=[(X_valid, y_valid)], patience=300, max_epochs=2000, eval_metric=['rmse']) CV_score_array.append(regressor.best_cost) predictions_array.append(np.expm1(regressor.predict(X_test))) predictions = np.mean(predictions_array,axis=0)

输出

Device used : cpu
Early stopping occured at epoch 1598 with best_epoch = 1298 and best_val_0_rmse
= 0.16444
Best weights from best epoch are automatically used!
Device used : cpu
Early stopping occured at epoch 1075 with best_epoch = 775 and best_val_0_rmse
= 0.12027
Best weights from best epoch are automatically used!
Device used : cpu
Early stopping occured at epoch 691 with best_epoch = 391 and best_val_0_rmse =
0.16395
Best weights from best epoch are automatically used!
Device used : cpu
Early stopping occured at epoch 679 with best_epoch = 379 and best_val_0_rmse =
0.16833
Best weights from best epoch are automatically used!
Device used : cpu
Early stopping occured at epoch 1283 with best_epoch = 983 and best_val_0_rmse
= 0.11103
Best weights from best epoch are automatically used!

计算平均交叉验证分数

print("The CV score is %.5f" % np.mean(CV_score_array,axis=0) )

输出

The CV score is 0.15161

结论

总而言之,Tabnet 只是将深度学习应用于表格数据。由于学习能力被用于最显著的特征,因此它提高了学习效率,并通过使用顺序注意力来选择在每个决策步骤中要推理的特征,从而实现了可解释性。

更新于: 2022年10月28日

2K+ 浏览量

开启您的职业生涯

通过完成课程获得认证

开始学习
广告