重要的
查看新的表格 DL 模型:TabM
arXiv ? Python 包其他表格 DL 项目
这是论文“On Embeddings for Numerical Features in Tabular Deep Learning”的正式实现。
简而言之:将原始标量连续特征转换为向量,然后将它们混合到主干中(例如在 MLP、Transformer 等中)可以提高表格神经网络的下游性能。
左:普通 MLP,采用两个连续特征作为输入。
右图:相同的 MLP,但现在具有连续特征的嵌入。
更详细地说:
严格来说,没有单一的解释。显然,嵌入有助于应对与连续特征相关的各种挑战,并提高模型的整体优化性能。
特别是,不规则分布的连续特征(及其与标签的不规则联合分布)在现实世界的表格数据中很常见,它们对传统表格深度学习模型提出了重大的基本优化挑战。理解这一挑战的一个很好的参考(也是通过转换输入空间来解决这些挑战的一个很好的例子)是论文“傅立叶特征让网络学习低维域中的高频函数”。
然而,尚不清楚不规则分布是否是嵌入有用的唯一原因。
package/
目录中的 Python 包是在实践和未来工作中使用本文的推荐方式。
文件的其余部分:
exp/
目录包含本文中使用的各种模型和数据集的大量结果和(调整的)超参数。
例如,让我们探讨一下 MLP 模型的指标。首先,让我们加载报告( report.json
文件):
import json
from pathlib import Path
import pandas as pd
df = pd . json_normalize ([
json . loads ( x . read_text ())
for x in Path ( 'exp' ). glob ( 'mlp/*/0_evaluation/*/report.json' )
])
现在,对于每个数据集,我们计算所有随机种子的平均测试分数:
print ( df . groupby ( 'config.data.path' )[ 'metrics.test.score' ]. mean (). round ( 3 ))
输出与论文中的表 3 完全匹配:
config.data.path
data/adult 0.854
data/california -0.495
data/churn 0.856
data/covtype 0.964
data/fb-comments -5.686
data/gesture 0.632
data/higgs-small 0.720
data/house -32039.399
data/microsoft -0.747
data/otto 0.818
data/santander 0.912
Name: metrics.test.score, dtype: float64
上述方法还可用于探索超参数,以直观地了解不同算法的典型超参数值。例如,以下是计算 MLP 模型的中值调整学习率的方法:
笔记
对于某些算法(例如 MLP、MLP-LR、MLP-PLR),最近的项目提供了更多可以以类似方式探索的结果。例如,请参阅 TabR 上的这篇论文。
警告
请谨慎使用此方法。研究超参数值时:
print ( df [ df [ 'config.seed' ] == 0 ][ 'config.training.lr' ]. quantile ( 0.5 ))
# Output: 0.0002716544410603358
重要的
这一段很长。在文本编辑器中使用 GitHub 上的“大纲”功能来获取本节的概述。
预赛:
/usr/local/cuda-11.1/bin
始终位于您的PATH
环境变量中 export PROJECT_DIR= < ABSOLUTE path to the repository root >
# example: export PROJECT_DIR=/home/myusername/repositories/num-embeddings
git clone https://github.com/yandex-research/tabular-dl-num-embeddings $PROJECT_DIR
cd $PROJECT_DIR
conda create -n num-embeddings python=3.9.7
conda activate num-embeddings
pip install torch==1.10.1+cu111 -f https://download.pytorch.org/whl/torch_stable.html
pip install -r requirements.txt
# if the following commands do not succeed, update conda
conda env config vars set PYTHONPATH= ${PYTHONPATH} : ${PROJECT_DIR}
conda env config vars set PROJECT_DIR= ${PROJECT_DIR}
# the following command appends ":/usr/local/cuda-11.1/lib64" to LD_LIBRARY_PATH;
# if your LD_LIBRARY_PATH already contains a path to some other CUDA, then the content
# after "=" should be "<your LD_LIBRARY_PATH without your cuda path>:/usr/local/cuda-11.1/lib64"
conda env config vars set LD_LIBRARY_PATH= ${LD_LIBRARY_PATH} :/usr/local/cuda-11.1/lib64
conda env config vars set CUDA_HOME=/usr/local/cuda-11.1
conda env config vars set CUDA_ROOT=/usr/local/cuda-11.1
# (optional) get a shortcut for toggling the dark mode with cmd+y
conda install nodejs
jupyter labextension install jupyterlab-theme-toggle
conda deactivate
conda activate num-embeddings
许可证:下载我们的数据集即表示您接受其所有组件的许可证。除了这些许可证之外,我们不会施加任何新的限制。您可以在本文中找到来源列表。
cd $PROJECT_DIR
wget " https://www.dropbox.com/s/r0ef3ij3wl049gl/data.tar?dl=1 " -O num_embeddings_data.tar
tar -xvf num_embeddings_data.tar
下面的代码重现了加州住房数据集上 MLP 的结果。其他算法和数据集的管道完全相同。
# You must explicitly set CUDA_VISIBLE_DEVICES if you want to use GPU
export CUDA_VISIBLE_DEVICES="0"
# Create a copy of the 'official' config
cp exp/mlp/california/0_tuning.toml exp/mlp/california/1_tuning.toml
# Run tuning (on GPU, it takes ~30-60min)
python bin/tune.py exp/mlp/california/1_tuning.toml
# Evaluate single models with 15 different random seeds
python bin/evaluate.py exp/mlp/california/1_tuning 15
# Evaluate ensembles (by default, three ensembles of size five each)
python bin/ensemble.py exp/mlp/california/1_evaluation
“指标”部分展示了如何总结所获得的结果。
代码组织如下:
bin
train4.py
(它实现了论文中的所有嵌入和主干)xgboost_.py
用于 XGBoostcatboost_.py
用于 CatBoosttune.py
evaluate.py
进行评估ensemble.py
用于集成datasets.py
用于构建数据集分割synthetic.py
train1_synthetic.py
用于合成数据的实验lib
包含bin
中程序使用的常用工具exp
包含实验配置和结果(指标、调整配置等)。嵌套文件夹的名称遵循论文中的名称(例如: exp/mlp-plr
对应于论文中的 MLP-PLR 模型)。package
包含本文的Python包CUDA_VISIBLE_DEVICES
lib.dump_config
和lib.load_config
而不是裸 TOML 库运行脚本的常见模式是:
python bin/my_script.py a/b/c.toml
其中a/b/c.toml
是输入配置文件(config)。输出将位于a/b/c
。配置结构通常遵循bin/my_script.py
中的Config
类。
还有一些脚本采用命令行参数而不是配置(例如bin/{evaluate.py,ensemble.py}
)。
您需要所有这些来重现结果,但您只需要train4.py
来进行未来的工作,因为:
bin/train1.py
实现了bin/train0.py
功能的超集bin/train3.py
实现了bin/train1.py
功能的超集bin/train4.py
实现了bin/train3.py
功能的超集要查看四个脚本中的哪一个用于运行给定实验,请检查相应调整配置的“程序”字段。例如,以下是加州住房数据集上 MLP 的调整配置: exp/mlp/california/0_tuning.toml
。该配置表明使用了bin/train0.py
。这意味着exp/mlp/california/0_evaluation
中的配置与bin/train0.py
专门兼容。要验证这一点,您可以将其中之一复制到单独的位置并传递到bin/train0.py
:
mkdir exp/tmp
cp exp/mlp/california/0_evaluation/0.toml exp/tmp/0.toml
python bin/train0.py exp/tmp/0.toml
ls exp/tmp/0
@inproceedings{gorishniy2022embeddings,
title={On Embeddings for Numerical Features in Tabular Deep Learning},
author={Yury Gorishniy and Ivan Rubachev and Artem Babenko},
booktitle={{NeurIPS}},
year={2022},
}