重要的
查看新的表格 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},
}