只能用于文本与图像数据?No!看TabTransformer对结构化业务数据精准建模 ⛵

政安晨:【Keras机器学习示例演绎】(五十五)—— 使用 TabTransformer 学习结构化数据 本文目标:利用上下文嵌入进行结构化数据分类。 本示例演示了如何使用 TabTransformer 进行结构化数据分类,TabTransformer 是一种用于监督和半监督学习的深度表格数据建模架构。 TabTransformer 建立在基于自我注意的变换器基础之上。 转换器层将分类特征嵌入转换为稳健的上下文嵌入,以实现更高的预测准确性。 阅读详情

💡 作者:韩信子@ShowMeAI
📘 深度学习实战系列:https://www.showmeai.tech/tutorials/42
📘 TensorFlow 实战系列:https://www.showmeai.tech/tutorials/43
📘 本文地址:https://www.showmeai.tech/article-detail/315
📢 声明:版权所有,转载请联系平台与作者并注明出处
📢 收藏ShowMeAI查看更多精彩内容

自 Transformers 出现以来,基于它的结构已经颠覆了自然语言处理和计算机视觉,带来各种非结构化数据业务场景和任务的巨大效果突破,接着大家把目光转向了结构化业务数据,它是否能在结构化表格数据上同样有惊人的效果表现呢?

答案是YES!亚马逊在论文中提出的 📘TabTransformer,是一种把结构调整后适应于结构化表格数据的网络结构,它更擅长于捕捉传统结构化表格数据中不同类型的数据信息,并将其结合以完成预估任务。下面ShowMeAI给大家讲解构建 TabTransformer 并将其应用于结构化数据上的过程。

💡 环境设置

本篇使用到的深度学习框架为TensorFlow,大家需要安装2.7或更高版本, 我们还需要安装一下 📘TensorFlow插件addons,安装的过程大家可以通过下述命令完成:

pip install -U tensorflow tensorflow-addons

关于本篇代码实现中使用到的TensorFlow工具库,大家可以查看ShowMeAI制作的TensorFlow速查手册快学快用:

接下来我们导入工具库

import math
import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
import tensorflow_addons as tfa
import matplotlib.pyplot as plt

💡 数据说明

ShowMeAI在本例中使用到的是 🏆美国人口普查收入数据集,任务是根据人口基本信息预测其年收入是否可能超过 50,000 美元,是一个二分类问题。

数据集可以在以下地址下载:

📘 https://archive.ics.uci.edu/ml/datasets/Adult

📘 https://archive.ics.uci.edu/ml/machine-learning-databases/adult/

数据从美国1994年人口普查数据库抽取而来,可以用来预测居民收入是否超过50K/year。该数据集类变量为年收入是否超过50k,属性变量包含年龄、工种、学历、职业、人种等重要信息,值得一提的是,14个属性变量中有7个类别型变量。数据集各属性是:其中序号0~13是属性,14是类别。

字段序号字段名含义类型
0age年龄Double
1workclass工作类型*string
2fnlwgt序号string
3education教育程度*string
4education_num受教育时间double
5maritial_status婚姻状况*string
6occupation职业*string
7relationship关系*string
8race种族*string
9sex性别*string
10capital_gain资本收益string
11capital_loss资本损失string
12hours_per_week每周工作小时数double
13native_country原籍*string
14(label)income收入标签string

我们先用pandas读取数据到dataframe中:

CSV_HEADER = [
    "age",
    "workclass",
    "fnlwgt",
    "education",
    "education_num",
    "marital_status",
    "occupation",
    "relationship",
    "race",
    "gender",
    "capital_gain",
    "capital_loss",
    "hours_per_week",
    "native_country",
    "income_bracket",
]

train_data_url = (
    "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data"
)
train_data = pd.read_csv(train_data_url, header=None, names=CSV_HEADER)

test_data_url = (
    "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.test"
)
test_data = pd.read_csv(test_data_url, header=None, names=CSV_HEADER)

print(f"Train dataset shape: {train_data.shape}")
print(f"Test dataset shape: {test_data.shape}")
Train dataset shape: (32561, 15)
Test dataset shape: (16282, 15)

我们做点数据清洗,把测试集第一条记录剔除(它不是有效的数据示例),把类标签中的尾随的“点”去掉。

test_data = test_data[1:]
test_data.income_bracket = test_data.income_bracket.apply(
    lambda value: value.replace(".", "")
)

再把训练集和测试集存回单独的 CSV 文件中。

train_data_file = "train_data.csv"
test_data_file = "test_data.csv"

train_data.to_csv(train_data_file, index=False, header=False)
test_data.to_csv(test_data_file, index=False, header=False)

💡 模型原理

TabTransformer的模型架构如下所示:

我们可以看到,类别型的特征,很适合在 embedding 后,送入 transformer 模块进行深度交叉组合与信息挖掘,得到的信息与右侧的连续值特征进行拼接,再送入全连接的 MLP 模块进行组合和完成最后的任务(分类或者回归)。

💡 模型实现

📌 定义数据集元数据

要实现模型,我们先对输入数据字段,区分不同的类型(数值型特征与类别型特征)。我们会对不同类型的特征,使用不同的方式进行处理和完成特征工程(例如数值型的特征进行幅度缩放,类别型的特征进行编码处理)。

## 数值特征字段
NUMERIC_FEATURE_NAMES = [
    "age",
    "education_num",
    "capital_gain",
    "capital_loss",
    "hours_per_week",
]
## 类别型特征字段及其取值列表
CATEGORICAL_FEATURES_WITH_VOCABULARY = {
    "workclass": sorted(list(train_data["workclass"].unique())),
    "education": sorted(list(train_data["education"].unique())),
    "marital_status": sorted(list(train_data["marital_status"].unique())),
    "occupation": sorted(list(train_data["occupation"].unique())),
    "relationship": sorted(list(train_data["relationship"].unique())),
    "race": sorted(list(train_data["race"].unique())),
    "gender": sorted(list(train_data["gender"].unique())),
    "native_country": sorted(list(train_data["native_country"].unique())),
}
## 权重字段
WEIGHT_COLUMN_NAME = "fnlwgt"
## 类别型字段名称
CATEGORICAL_FEATURE_NAMES = list(CATEGORICAL_FEATURES_WITH_VOCABULARY.keys())
## 所有的输入特征
FEATURE_NAMES = NUMERIC_FEATURE_NAMES + CATEGORICAL_FEATURE_NAMES
## 默认填充的取值
COLUMN_DEFAULTS = [
    [0.0] if feature_name in NUMERIC_FEATURE_NAMES + [WEIGHT_COLUMN_NAME] else ["NA"]
    for feature_name in CSV_HEADER
]
## 目标字段
TARGET_FEATURE_NAME = "income_bracket"
## 目标字段取值
TARGET_LABELS = [" <=50K", " >50K"]

📌 配置超参数

我们为神经网络的结构和训练过程的超参数进行设置,如下。

# 学习率
LEARNING_RATE = 0.001
# 学习率衰减
WEIGHT_DECAY = 0.0001
# 随机失活 概率参数
DROPOUT_RATE = 0.2
# 批数据大小
BATCH_SIZE = 265
# 总训练轮次数
NUM_EPOCHS = 15

# transformer块的数量
NUM_TRANSFORMER_BLOCKS = 3
# 注意力头的数量
NUM_HEADS = 4
# 类别型embedding嵌入的维度
EMBEDDING_DIMS = 16
# MLP隐层单元数量
MLP_HIDDEN_UNITS_FACTORS = [
    2,
    1,
]
# MLP块的数量
NUM_MLP_BLOCKS = 2

📌 实现数据读取管道

下面我们定义一个输入函数,它负责读取和解析文件,并对特征和标签处理,放入 tf.data.Dataset,以便后续训练和评估。

target_label_lookup = layers.StringLookup(
    vocabulary=TARGET_LABELS, mask_token=None, num_oov_indices=0
)


def prepare_example(features, target):
    target_index = target_label_lookup(target)
    weights = features.pop(WEIGHT_COLUMN_NAME)
    return features, target_index, weights

# 从csv中读取数据
def get_dataset_from_csv(csv_file_path, batch_size=128, shuffle=False):
    dataset = tf.data.experimental.make_csv_dataset(
        csv_file_path,
        batch_size=batch_size,
        column_names=CSV_HEADER,
        column_defaults=COLUMN_DEFAULTS,
        label_name=TARGET_FEATURE_NAME,
        num_epochs=1,
        header=False,
        na_value="?",
        shuffle=shuffle,
    ).map(prepare_example, num_parallel_calls=tf.data.AUTOTUNE, deterministic=False)
    return dataset.cache()

📌 模型构建与评估

def run_experiment(
    model,
    train_data_file,
    test_data_file,
    num_epochs,
    learning_rate,
    weight_decay,
    batch_size,
):
    # 优化器
    optimizer = tfa.optimizers.AdamW(
        learning_rate=learning_rate, weight_decay=weight_decay
    )
    # 模型编译
    model.compile(
        optimizer=optimizer,
        loss=keras.losses.BinaryCrossentropy(),
        metrics=[keras.metrics.BinaryAccuracy(name="accuracy")],
    )
    # 训练集与验证集
    train_dataset = get_dataset_from_csv(train_data_file, batch_size, shuffle=True)
    validation_dataset = get_dataset_from_csv(test_data_file, batch_size)
    
    # 模型训练
    print("Start training the model...")
    history = model.fit(
        train_dataset, epochs=num_epochs, validation_data=validation_dataset
    )
    print("Model training finished")
    
    # 模型评估
    _, accuracy = model.evaluate(validation_dataset, verbose=0)

    print(f"Validation accuracy: {round(accuracy * 100, 2)}%")

    return history

① 创建模型输入

基于 TensorFlow 的输入要求,我们将模型的输入定义为字典,其中『key/键』是特征名称,『value/值』为 keras.layers.Input具有相应特征形状的张量和数据类型。

def create_model_inputs():
    inputs = {}
    for feature_name in FEATURE_NAMES:
        if feature_name in NUMERIC_FEATURE_NAMES:
            inputs[feature_name] = layers.Input(
                name=feature_name, shape=(), dtype=tf.float32
            )
        else:
            inputs[feature_name] = layers.Input(
                name=feature_name, shape=(), dtype=tf.string
            )
    return inputs

② 编码特征

我们定义一个encode_inputs函数,返回encoded_categorical_feature_list和 numerical_feature_list。我们将分类特征编码为嵌入,使用固定的embedding_dims对于所有功能, 无论他们的词汇量大小。 这是 Transformer 模型所必需的。

def encode_inputs(inputs, embedding_dims):

    encoded_categorical_feature_list = []
    numerical_feature_list = []

    for feature_name in inputs:
        if feature_name in CATEGORICAL_FEATURE_NAMES:

            # 获取类别型特征的不同取值(vocabulary)
            vocabulary = CATEGORICAL_FEATURES_WITH_VOCABULARY[feature_name]

            # 构建lookup table去构建 类别型取值 和 索引 的相互映射
            lookup = layers.StringLookup(
                vocabulary=vocabulary,
                mask_token=None,
                num_oov_indices=0,
                output_mode="int",
            )

            # 类别型字符串取值 转为 整型索引
            encoded_feature = lookup(inputs[feature_name])

            # 构建embedding层
            embedding = layers.Embedding(
                input_dim=len(vocabulary), output_dim=embedding_dims
            )

            # 为索引构建embedding嵌入
            encoded_categorical_feature = embedding(encoded_feature)
            encoded_categorical_feature_list.append(encoded_categorical_feature)

        else:

            # 数值型特征
            numerical_feature = tf.expand_dims(inputs[feature_name], -1)
            numerical_feature_list.append(numerical_feature)

    return encoded_categorical_feature_list, numerical_feature_list

③ MLP模块实现

网络中不可或缺的部分是 MLP 全连接板块,下面是它的简单实现:

def create_mlp(hidden_units, dropout_rate, activation, normalization_layer, name=None):

    mlp_layers = []
    for units in hidden_units:
        mlp_layers.append(normalization_layer),
        mlp_layers.append(layers.Dense(units, activation=activation))
        mlp_layers.append(layers.Dropout(dropout_rate))

    return keras.Sequential(mlp_layers, name=name)

④ 模型实现1:基线模型

为了对比效果,我们先简单使用MLP(多层前馈网络)进行建模,代码和注释如下。

def create_baseline_model(
    embedding_dims, num_mlp_blocks, mlp_hidden_units_factors, dropout_rate
):

    # 创建输入.
    inputs = create_model_inputs()
    # 特征编码
    encoded_categorical_feature_list, numerical_feature_list = encode_inputs(
        inputs, embedding_dims
    )
    # 拼接所有特征
    features = layers.concatenate(
        encoded_categorical_feature_list + numerical_feature_list
    )
    # 前向计算
    feedforward_units = [features.shape[-1]]

    # 构建全连接,并且添加跳跃连接(skip-connection)
    for layer_idx in range(num_mlp_blocks):
        features = create_mlp(
            hidden_units=feedforward_units,
            dropout_rate=dropout_rate,
            activation=keras.activations.gelu,
            normalization_layer=layers.LayerNormalization(epsilon=1e-6),
            name=f"feedforward_{layer_idx}",
        )(features)

    # MLP全连接的隐层结果
    mlp_hidden_units = [
        factor * features.shape[-1] for factor in mlp_hidden_units_factors
    ]
    # 最终的MLP网络
    features = create_mlp(
        hidden_units=mlp_hidden_units,
        dropout_rate=dropout_rate,
        activation=keras.activations.selu,
        normalization_layer=layers.BatchNormalization(),
        name="MLP",
    )(features)

    # 添加sigmoid构建二分类器
    outputs = layers.Dense(units=1, activation="sigmoid", name="sigmoid")(features)
    model = keras.Model(inputs=inputs, outputs=outputs)
    return model

# 完整的模型
baseline_model = create_baseline_model(
    embedding_dims=EMBEDDING_DIMS,
    num_mlp_blocks=NUM_MLP_BLOCKS,
    mlp_hidden_units_factors=MLP_HIDDEN_UNITS_FACTORS,
    dropout_rate=DROPOUT_RATE,
)

print("Total model weights:", baseline_model.count_params())
keras.utils.plot_model(baseline_model, show_shapes=True, rankdir="LR")
# Total model weights: 109629

上述模型构建完成之后,我们通过plot_model操作,绘制出模型结构如下:

接下来我们训练和评估一下基线模型:

history = run_experiment(
    model=baseline_model,
    train_data_file=train_data_file,
    test_data_file=test_data_file,
    num_epochs=NUM_EPOCHS,
    learning_rate=LEARNING_RATE,
    weight_decay=WEIGHT_DECAY,
    batch_size=BATCH_SIZE,
)

输出的训练过程日志如下:

Start training the model...
Epoch 1/15
123/123 [==============================] - 6s 25ms/step - loss: 110178.8203 - accuracy: 0.7478 - val_loss: 92703.0859 - val_accuracy: 0.7825
Epoch 2/15
123/123 [==============================] - 2s 14ms/step - loss: 90979.8125 - accuracy: 0.7675 - val_loss: 71798.9219 - val_accuracy: 0.8001
Epoch 3/15
123/123 [==============================] - 2s 14ms/step - loss: 77226.5547 - accuracy: 0.7902 - val_loss: 68581.0312 - val_accuracy: 0.8168
Epoch 4/15
123/123 [==============================] - 2s 14ms/step - loss: 72652.2422 - accuracy: 0.8004 - val_loss: 70084.0469 - val_accuracy: 0.7974
Epoch 5/15
123/123 [==============================] - 2s 14ms/step - loss: 71207.9375 - accuracy: 0.8033 - val_loss: 66552.1719 - val_accuracy: 0.8130
Epoch 6/15
123/123 [==============================] - 2s 14ms/step - loss: 69321.4375 - accuracy: 0.8091 - val_loss: 65837.0469 - val_accuracy: 0.8149
Epoch 7/15
123/123 [==============================] - 2s 14ms/step - loss: 68839.3359 - accuracy: 0.8099 - val_loss: 65613.0156 - val_accuracy: 0.8187
Epoch 8/15
123/123 [==============================] - 2s 14ms/step - loss: 68126.7344 - accuracy: 0.8124 - val_loss: 66155.8594 - val_accuracy: 0.8108
Epoch 9/15
123/123 [==============================] - 2s 14ms/step - loss: 67768.9844 - accuracy: 0.8147 - val_loss: 66705.8047 - val_accuracy: 0.8230
Epoch 10/15
123/123 [==============================] - 2s 14ms/step - loss: 67482.5859 - accuracy: 0.8151 - val_loss: 65668.3672 - val_accuracy: 0.8143
Epoch 11/15
123/123 [==============================] - 2s 14ms/step - loss: 66792.6875 - accuracy: 0.8181 - val_loss: 66536.3828 - val_accuracy: 0.8233
Epoch 12/15
123/123 [==============================] - 2s 14ms/step - loss: 65610.4531 - accuracy: 0.8229 - val_loss: 70377.7266 - val_accuracy: 0.8256
Epoch 13/15
123/123 [==============================] - 2s 14ms/step - loss: 63930.2500 - accuracy: 0.8282 - val_loss: 68294.8516 - val_accuracy: 0.8289
Epoch 14/15
123/123 [==============================] - 2s 14ms/step - loss: 63420.1562 - accuracy: 0.8323 - val_loss: 63050.5859 - val_accuracy: 0.8204
Epoch 15/15
123/123 [==============================] - 2s 14ms/step - loss: 62619.4531 - accuracy: 0.8345 - val_loss: 66933.7500 - val_accuracy: 0.8177
Model training finished
Validation accuracy: 81.77%

我们可以看到基线模型(全连接MLP网络)实现了约 82% 的验证准确度。

⑤ 模型实现2:TabTransformer

TabTransformer 架构的工作原理如下:

  • 所有类别型特征都被编码为嵌入,使用相同的 embedding_dims。
  • 将列嵌入(每个类别型特征的一个嵌入向量)添加类别型特征嵌入中。
  • 嵌入的类别型特征被输入到一系列的 Transformer 块中。 每个 Transformer 块由一个多头自注意力层和一个前馈层组成。
  • 最终 Transformer 层的输出, 与输入的数值型特征连接,并输入到最终的 MLP 块中。
  • 尾部由一个 softmax结构完成分类。
def create_tabtransformer_classifier(
    num_transformer_blocks,
    num_heads,
    embedding_dims,
    mlp_hidden_units_factors,
    dropout_rate,
    use_column_embedding=False,
):

    # 构建输入
    inputs = create_model_inputs()
    # 编码特征
    encoded_categorical_feature_list, numerical_feature_list = encode_inputs(
        inputs, embedding_dims
    )
    # 堆叠类别型特征的embeddings,为输入Tansformer做准备
    encoded_categorical_features = tf.stack(encoded_categorical_feature_list, axis=1)
    # 拼接数值型特征
    numerical_features = layers.concatenate(numerical_feature_list)

    # embedding
    if use_column_embedding:
        num_columns = encoded_categorical_features.shape[1]
        column_embedding = layers.Embedding(
            input_dim=num_columns, output_dim=embedding_dims
        )
        column_indices = tf.range(start=0, limit=num_columns, delta=1)
        encoded_categorical_features = encoded_categorical_features + column_embedding(
            column_indices
        )

    # 构建Transformer块
    for block_idx in range(num_transformer_blocks):
        # 多头自注意力
        attention_output = layers.MultiHeadAttention(
            num_heads=num_heads,
            key_dim=embedding_dims,
            dropout=dropout_rate,
            name=f"multihead_attention_{block_idx}",
        )(encoded_categorical_features, encoded_categorical_features)
        # 第1个跳接/Skip connection
        x = layers.Add(name=f"skip_connection1_{block_idx}")(
            [attention_output, encoded_categorical_features]
        )
        # 第1个层归一化/Layer normalization
        x = layers.LayerNormalization(name=f"layer_norm1_{block_idx}", epsilon=1e-6)(x)
        # 全连接层
        feedforward_output = create_mlp(
            hidden_units=[embedding_dims],
            dropout_rate=dropout_rate,
            activation=keras.activations.gelu,
            normalization_layer=layers.LayerNormalization(epsilon=1e-6),
            name=f"feedforward_{block_idx}",
        )(x)
        # 第2个跳接/Skip connection
        x = layers.Add(name=f"skip_connection2_{block_idx}")([feedforward_output, x])
        # 第2个层归一化/Layer normalization
        encoded_categorical_features = layers.LayerNormalization(
            name=f"layer_norm2_{block_idx}", epsilon=1e-6
        )(x)

    # 展平embeddings
    categorical_features = layers.Flatten()(encoded_categorical_features)
    # 对数值型特征做层归一化
    numerical_features = layers.LayerNormalization(epsilon=1e-6)(numerical_features)
    # 拼接作为最终MLP的输入
    features = layers.concatenate([categorical_features, numerical_features])

    # 计算MLP隐层单元
    mlp_hidden_units = [
        factor * features.shape[-1] for factor in mlp_hidden_units_factors
    ]
    # 构建最终的MLP.
    features = create_mlp(
        hidden_units=mlp_hidden_units,
        dropout_rate=dropout_rate,
        activation=keras.activations.selu,
        normalization_layer=layers.BatchNormalization(),
        name="MLP",
    )(features)

    # 添加sigmoid构建二分类
    outputs = layers.Dense(units=1, activation="sigmoid", name="sigmoid")(features)
    model = keras.Model(inputs=inputs, outputs=outputs)
    return model


tabtransformer_model = create_tabtransformer_classifier(
    num_transformer_blocks=NUM_TRANSFORMER_BLOCKS,
    num_heads=NUM_HEADS,
    embedding_dims=EMBEDDING_DIMS,
    mlp_hidden_units_factors=MLP_HIDDEN_UNITS_FACTORS,
    dropout_rate=DROPOUT_RATE,
)

print("Total model weights:", tabtransformer_model.count_params())
keras.utils.plot_model(tabtransformer_model, show_shapes=True, rankdir="LR")
#Total model weights: 87479

最终输出的模型结构示意图如下(因为模型结构较深,总体很长,点击放大)

下面我们训练和评估一下TabTransformer 模型的效果:

history = run_experiment(
    model=tabtransformer_model,
    train_data_file=train_data_file,
    test_data_file=test_data_file,
    num_epochs=NUM_EPOCHS,
    learning_rate=LEARNING_RATE,
    weight_decay=WEIGHT_DECAY,
    batch_size=BATCH_SIZE,
)
Start training the model...
Epoch 1/15
123/123 [==============================] - 13s 61ms/step - loss: 82503.1641 - accuracy: 0.7944 - val_loss: 64260.2305 - val_accuracy: 0.8421
Epoch 2/15
123/123 [==============================] - 6s 51ms/step - loss: 68677.9375 - accuracy: 0.8251 - val_loss: 63819.8633 - val_accuracy: 0.8389
Epoch 3/15
123/123 [==============================] - 6s 51ms/step - loss: 66703.8984 - accuracy: 0.8301 - val_loss: 63052.8789 - val_accuracy: 0.8428
Epoch 4/15
123/123 [==============================] - 6s 51ms/step - loss: 65287.8672 - accuracy: 0.8342 - val_loss: 61593.1484 - val_accuracy: 0.8451
Epoch 5/15
123/123 [==============================] - 6s 52ms/step - loss: 63968.8594 - accuracy: 0.8379 - val_loss: 61385.4531 - val_accuracy: 0.8442
Epoch 6/15
123/123 [==============================] - 6s 51ms/step - loss: 63645.7812 - accuracy: 0.8394 - val_loss: 61332.3281 - val_accuracy: 0.8447
Epoch 7/15
123/123 [==============================] - 6s 51ms/step - loss: 62778.6055 - accuracy: 0.8412 - val_loss: 61342.5352 - val_accuracy: 0.8461
Epoch 8/15
123/123 [==============================] - 6s 51ms/step - loss: 62815.6992 - accuracy: 0.8398 - val_loss: 61220.8242 - val_accuracy: 0.8460
Epoch 9/15
123/123 [==============================] - 6s 52ms/step - loss: 62191.1016 - accuracy: 0.8416 - val_loss: 61055.9102 - val_accuracy: 0.8452
Epoch 10/15
123/123 [==============================] - 6s 51ms/step - loss: 61992.1602 - accuracy: 0.8439 - val_loss: 61251.8047 - val_accuracy: 0.8441
Epoch 11/15
123/123 [==============================] - 6s 50ms/step - loss: 61745.1289 - accuracy: 0.8429 - val_loss: 61364.7695 - val_accuracy: 0.8445
Epoch 12/15
123/123 [==============================] - 6s 51ms/step - loss: 61696.3477 - accuracy: 0.8445 - val_loss: 61074.3594 - val_accuracy: 0.8450
Epoch 13/15
123/123 [==============================] - 6s 51ms/step - loss: 61569.1719 - accuracy: 0.8436 - val_loss: 61844.9688 - val_accuracy: 0.8456
Epoch 14/15
123/123 [==============================] - 6s 51ms/step - loss: 61343.0898 - accuracy: 0.8445 - val_loss: 61702.8828 - val_accuracy: 0.8455
Epoch 15/15
123/123 [==============================] - 6s 51ms/step - loss: 61355.0547 - accuracy: 0.8504 - val_loss: 61272.2852 - val_accuracy: 0.8495
Model training finished
Validation accuracy: 84.55%

TabTransformer 模型实现了约 85% 的验证准确度,相比于直接使用全连接网络效果有一定的提升。

参考资料

39、表格数据的深度学习模型:TabTransformer、TabNet与SAINT 本文深入探讨了三种处理表格数据的深度学习模型:TabTransformer、TabNet和SAINT。TabTransformer通过Transformer块联合处理分类与连续特征,具有高通用性和可优化性;TabNet采用顺序决策步骤和注意力式特征掩码,具备良好可解释性;SAINT引入样本间注意力机制,并结合对比学习预训练,在复杂场景下表现鲁棒且性能优越。文章详细解析了各模型的架构原理、数学形式化、关键组件及使用方法,并提供了代码示例与可视化方案,最后总结了三者的优劣与适用场景,为表格数据建模提供了全面的技 阅读详情

相关推荐

案例系列:美国人口普查_预测收入超过50K_TabTransformer二分类

本示例演示了如何使用进行结构化数据分类,TabTransformer是一种用于监督和半监督学习的深度表格数据建模架构。TabTransformer基于自注意力的Transformer构建而成。Transformer层将分类特征的嵌入转换为强大的上下文嵌入,以实现更高的预测准确性。在这里,我们定义数据集的元数据,这些元数据对于读取和解析数据为输入特征以及根据其类型对输入特征进行编码非常有用。# 数值特征的名称列表"age", # 年龄"education_num", # 受教育年限。

数智笔记 1883

TabTransformer:用于表格数据的Transformer

在Transformers颠覆了自然语言处理和计算机视觉之后,他们现在把目光投向了最大的数据类型:表格数据。 在这篇文章中,我们将介绍亚马逊的最新论文TabTransformer。 首先,我们将回答为什么可以将transformer应用于表格数据。然后,我们将看到他们如何处理表格数据。 那么下面就开始吧:汽车人,变形出发! 为什么我们可以将Transformers应用于表格数据? transformer最初是作为一种建模语言的方法被提出的。那么,表格数据是一种语言吗?把普通的表格和人类的语言进行比较感觉很奇

deephub 1万+

美国人口普查年收入比赛程序

kaggle-美国人口普查年收入比赛,随机森林Python版本有很可以调用的库,使用随机森林非常方便,主要用到以下的库: sklearn pandas numpy

TabTransformer:借助Transformer的预训练机制处理表格数据

表格数据是推荐系统,线上广告,画像优化等领域中最为常见的数据形式。此前对表格数据的建模主要集中于基于梯度提升的树模型,比如GBDT,这与图像和文本数据依赖深度学习差异明显。

唐犁的博客 4009

快速上手springboot+vue的前后端分离项目

使用webStorm新建项目后,把 .lock文件删除后项目运行才不报错,配置文件 vue.config.js 中加入 lintOnSave: false 关闭eslint语法检测。在多层嵌套的父子组件之间传递状态已经十分麻烦,而Vue更是没有为兄弟组件提供直接共享数据的办法。基于这个问题,许多框架提供了解决方案——使用全局的状态管理器,将所有分散的共享数据交由状态管理器保管,Vue也不例外。其中一种解决CORS 的方法, 在springboot项目中跨域的方法或类加上@CrossOrigin注解。

m0_61950264的博客 1906

在AutoDL的A100云服务器上,用Docker搞定Sapien+RobotWin环境(附完整conda list)

本文详细介绍了在AutoDL的A100云服务器上使用Docker构建Sapien+RobotWin环境的完整指南。通过配置Vulkan渲染管线、精确复现Conda环境以及解决常见问题,帮助研究人员高效搭建稳定的机器人仿真开发环境,特别适合需要高性能GPU加速的复杂仿真任务。

weixin_30689307的博客 431

TabTransformer 模型示例

SimpleDataset 类继承自 Dataset,用于封装数据和标签,支持索引访问。

分享python,大模型,人工智能,机器学习相关的内容 1722

传输线的特征阻抗

信号源内阻与所接传输线的特性阻抗大小相等且相位相同,或传输线的特性阻抗与所接负载阻抗的大小相等且相位相同,分别称为传输线的输入端或输出端处于阻抗匹配状态,简称为阻抗匹配。否则,便称为阻抗失配。有时也直接叫做匹配或失配。指一个电路输入端的等效阻抗。在输入端上加上一个电压源U,测量输入端的电流I,则输入阻抗Rin就是U/I。可以把输入端想象成一个电阻的两端,这个电阻的阻值,就是输入阻抗。- 对于电压驱动的电路,输入阻抗越大,则对电压源的负载就越轻,因而就越容易驱动,也不会对信号源有影响;

学海无涯的专栏 4464

【亲测免费】 探索TabTransformer-PyTorch:表格数据处理的新维度

在数据分析和机器学习领域,处理结构化的表格数据是常见的任务。对于这类任务,是一个值得推荐的PyTorch库,它引入了Transformer架构以高效地处理表格中的信息。本文将详细介绍这个项目,其技术实现,应用潜力及特性,帮助你更好地理解和利用这个工具。 ## 项目简介 TabTransformer是由LucidRains开发的一个轻量级库,其核心目标是将Transformer模型应用于表格数据...

gitblog_00097的博客 2211

深入解析AndroidManifest.xml与device_admin.xml:打造完美DeviceOwner应用配置

本文深入解析了Android企业级开发中DeviceOwner应用的核心配置文件AndroidManifest.xml与device_admin.xml。详细阐述了如何精准声明DeviceAdminReceiver、定义管理策略,并提供了通过ADB命令进行设置与验证的实战指南,帮助开发者构建权限完整、配置正确的设备所有者应用。

ice55的博客 680

糖尿病预测(深度学习pytorch实现-最新)

本次做的项目是糖尿病的预测,也是来自kaggle上面的一个小项目。根据一个人的怀孕次数、血糖、血压、皮肤厚度、胰岛素指标、身体质量指数、糖尿病谱系指数、年龄等身体参数来预测一个人是否患有糖尿病。

NangoGreen的博客 5358

2020_TabTransformer

我们提出了TabTransformer,这是一种用于监督和半监督学习的新型深度表格数据建模架构。TabTransformer是建立在基于自我注意力的Transformers之上的。Transformer层将分类特征的嵌入转换为强大的上下文嵌入,以实现更高的预测准确性。通过对15个公开数据集的广泛实验,我们表明TabTransformer在平均AUC上比最先进的表格数据深度学习方法至少高出1.0%,并且与基于树的集成模型的性能相匹配。此外,我们证明了从。

qq_45972323的博客 1426

[TI板]MSPM0G3507——keil环境配置+烧录配置+vscode配置+空工程迁移+点灯+芯片解锁教程

本文介绍了MSPM0G3507开发环境的配置与烧录方法。主要内容包括:1)下载安装芯片支持包和SDK开发工具;2)通过串口或DAPLink两种方式实现程序烧录,详细说明了UniFlash软件的使用步骤和常见问题解决方法;3)简要提及工程迁移和LED点灯等基础操作。文章提供了完整的开发环境搭建指南,涵盖从软件安装到实际烧录的全过程,并附有相关工具下载链接和操作截图,帮助开发者快速上手MSPM0G3507开发。

qq_23220445的博客 1万+

结构化数据模型之GBDT vs NN(下)

导语 不同于深度学习在CV\NLP领域(处理非结构化数据的问题)上的绝对统治力,在结构化数据建模问题中,基于Boosting思想的GBDT树模型仿佛依然是最简单有效的模型。本文将从解决结构化数据问题出发,介绍GBDT树模型以及近年出现的深度模型,探寻是否深度学习已经可以替代GBDT? 本文分为上下两篇,上篇主要介绍一些基本概念和GBDT树模型,下篇则介绍针对结构化数据的深度模型。 随着深度学习...

不可能打工的博客 1357

YOLOv11+BiFPN双向特征金字塔:全方位解析多尺度检测性能优化指南

飞书链接:https://ecn6838atsup.feishu.cn/wiki/EhRtwBe1CiqlSEkHGUwc5AP9nQe?购买即可解锁800+YOLO优化文章,并且还有海量深度学习复现项目,价格仅需两杯奶茶的钱,每日更新。函数中添加BiFPN的解析逻辑(找到。链接可用,不要多复制空格了。密码:946m22&8。

FJN110的博客 306

【人工智能】Claude Code 安装、配置及问题排查完整指南

建议使用IDE来启动 Claude,执行后,内容如下。(确保环境可正常运行 npm 命令)。

奶爸的编程之路,也就一周冷个三天 1207

【亲测免费】 TabTransformer:表格数据的注意力网络革命

TabTransformer:表格数据的注意力网络革命 【下载地址】TabTransformerPyTorch实现表格数据的注意力网络 本仓库提供了一个在 PyTorch 中实现的 TabTransformer 模型,专门用于处理表格数据。TabTransformer 是一种基于注意力机制的神经网络架构,能够在处理结构化...

gitblog_09783的博客 1209

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【TabularData】DNN和表格数据分析建模综述

论文年份:2021,论文被引:8(2022/04/30)

全性保真,不以物累形。 6258

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

深度解析TabTransformer:PyTorch实现的表格数据注意力网络架构

TabTransformer-PyTorch是一个基于注意力机制的表格数据处理框架,通过在多个基准测试中达到GBDT级别的性能表现,为传统表格数据分析任务带来了革命性的Transformer架构解决方案。 ## 核心架构设计原理 TabTransformer采用了创新的混合嵌入策略来处理表格数据中的分类特征和连续特征。其核心架构包含三个主要组件: **分类特征嵌入层**:通过共享嵌入机制优化

gitblog_00614的博客 1057

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

利用tansformer进行时序数列的预测

防止学习率过大导致loss为nan,将lr设置为0: 但仍然,out出现nan,导致loss出现nan

weixin_39731450的博客 425

【亲测免费】 TabTransformer PyTorch:基于Transformer的表格数据建模

TabTransformer PyTorch 是一个开源项目,它实现了基于 Transformer 架构的表格数据建模方法。该项目主要使用 Python 编程语言,依托 PyTorch 深度学习框架进行构建和开发。 ## 2. 项目核心功能 TabTransformer 的核心功能是利用 Transformer 的注意力机制来处理表格数据。具体功能包括: - **多类别嵌入处理**:能够处理...

gitblog_00995的博客 618

【免费下载】 TabTransformer-PyTorch 使用教程

`TabTransformer-PyTorch` 是一个基于PyTorch实现的用于处理表格数据的注意力网络模型。这个开源项目由 Lucidrains 创建,它提供了一个简单架构来利用Transformer的注意力机制进行特征学习,几乎可以达到梯度提升决策树(GBDT)在表结构数据预测任务上的性能。根据作者更新的信息,亚马逊AI已经在实际场景中用注意力机制在表格数据上超越了GBDT。 ## 2....

gitblog_00065的博客 2076

从安装到预测:TabTransformer-PyTorch的5分钟快速入门教程

TabTransformer-PyTorch是一个基于PyTorch实现的注意力网络,专为表格数据设计。本教程将帮助你快速掌握这个强大工具的安装与基础使用,即使是深度学习新手也能轻松上手! ## 📦 快速安装指南 安装TabTransformer-PyTorch只需一行命令: ```bash pip install tab-transformer-pytorch ``` 如果你需要从源码

gitblog_00758的博客 443

如何用TabTransformer-PyTorch轻松实现表格数据的深度学习?完整指南

在数据科学领域,表格数据(如CSV、Excel)的处理一直是传统机器学习模型的天下。但随着深度学习的发展,**TabTransformer-PyTorch**作为一款基于PyTorch实现的表格数据注意力网络,正在改变这一格局。它能让你像处理图像或文本一样,用深度学习模型高效处理结构化表格数据,甚至在部分场景下超越GBDT等经典算法。本文将带你从零开始掌握这款强大工具的使用方法。 ## ???? 什...

gitblog_00599的博客 497

最近几篇较好论文实现代码(附源代码下载)

【代码】最近几篇较好论文实现代码(附源代码下载)

AbnerAI的博客 3637
上一篇: Kaggle官方·数据科学比赛经验集;百度开源·飞桨图像数据标注高效工具;C++并发编程实践第2版·笔记;前沿论文 | ShowMeAI资讯日报
下一篇: 实际应用效果不佳?来看看提升深度神经网络泛化能力的核心技术(附代码) ⛵
ShowMeAI
博客等级 码龄5年 6514粉丝 672原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShowMeAI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值