from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, f1_score
import random
import numpy as np
import pandas as pd
from pytorch_tabular.utils import make_mixed_dataset, print_metrics
import os
%load_ext autoreload
%autoreload 2
导入库¶
定义配置¶
data_config = DataConfig(
target=['target'], #目标应始终为一个列表。仅在回归任务中支持多目标。多任务分类功能尚未实现
continuous_cols=num_col_names,
categorical_cols=cat_col_names,
)
trainer_config = TrainerConfig(
auto_lr_find=True, # 运行 LRFinder 以自动推导学习率
batch_size=1024,
max_epochs=100,
early_stopping="valid_loss", # 监视有效损失以进行提前停止
early_stopping_mode = "min", # 将模式设为min,因为对于val_loss,越低越好。
early_stopping_patience=5, # 降解训练终止前将等待的epoch数
checkpoints="valid_loss", # 保存最佳检查点监控验证损失
load_best=True, # 训练后,加载最佳检查点
# 加速器="cpu"
)
optimizer_config = OptimizerConfig()
head_config = LinearHeadConfig(
layers="", # 头部中没有额外的层,仅有一个映射层用于输出至output_dim维度。
dropout=0.1,
initialization="kaiming"
).__dict__ # Convert to dict to pass to the model config (OmegaConf doesn't accept objects)
model_config = CategoryEmbeddingModelConfig(
task="classification",
layers="1024-512-512", # Number of nodes in each layer
activation="LeakyReLU", # Activation between each layers
head = "LinearHead", #Linear Head
head_config = head_config, # Linear Head Config
learning_rate = 1e-3,
metrics=["f1_score","accuracy"],
metrics_params=[{"num_classes":2},{}], # f1_score needs num_classes
metrics_prob_input=[True, False] # f1_score needs probability scores, while accuracy doesn't
)
训练模型¶
自定义采样器¶
PyTorch Tabular 还允许通过自定义采样器实现自定义批处理策略,这在处理不平衡数据时非常有用。
尽管您可以使用任何采样器,Pytorch Tabular 提供了一些方便的实用函数,这些函数接收目标数组并使用反频率采样实现 WeightedRandomSampler,以应对不平衡问题。这类似于传统机器学习系统中的下采样或上采样等预处理技术。
自定义加权损失¶
如果采样器类似于过采样/欠采样,自定义加权损失则类似于 class_weights
。根据问题的不同,这两者中的一种可能帮助你解决不平衡问题。你可以轻松计算 class_weights 并通过参数 weight
提供给 CrossEntropyLoss。为了简化这个过程,PyTorch Tabular 提供了一个方便的工具方法,可以计算平滑的类别权重并初始化加权损失。有了这个损失后,只需通过 loss
参数将其传递给 1fit1 方法即可。
tabular_model = TabularModel(
data_config=data_config,
model_config=model_config,
optimizer_config=optimizer_config,
trainer_config=trainer_config,
verbose=False
)
weighted_loss = get_class_weighted_cross_entropy(train["target"].values.ravel(), mu=0.1)
tabular_model.fit(train=train, validation=val, loss=weighted_loss)