Premiers pas avec l'algorithme intégré TabNet dans VertexAI

Aperçu

TabNet est une architecture de deep learning interprétable pour les données tabulaires (structurées). Il combine le meilleur de deux mondes : il offre l'explicabilité de modèles plus simples basés sur des arbres tout en garantissant la haute précision des modèles et des ensembles de boîte noire. TabNet est donc parfaitement adapté à un large éventail de tâches tabulaires de données telles que la prédiction du prix des actifs financiers, la détection des fraudes, des cyberattaques et de la criminalité, la prévision de la demande commerciale, le diagnostic provenant de dossiers médicaux, des recommandations de produits et d'autres applications.

TabNet utilise une couche spécialement conçue dans son architecture : une attention séquentielle, qui sélectionne les caractéristiques du modèle à comprendre à chaque étape du modèle. Ce mécanisme permet d'expliquer comment le modèle parvient à ses prédictions et lui permet d'apprendre des modèles plus précis. Grâce à cette conception, TabNet est plus performant que les autres réseaux de neurones et arbres de décision, mais fournit également des attributions de caractéristiques interprétables.

Données d'entrée

TabNet attend des entrées tabulaires dans l'un des formats suivants :

  • Données d'entraînement : données d'étiquette utilisées pour entraîner le modèle. Les formats de fichiers suivants sont acceptés :
  • Schéma d'entrée :
    • Si l'entrée est au format CSV, la première colonne est la variable cible.
    • Si l'entrée est au format BigQuery, vous spécifiez le paramètre target_column.

Préparer un fichier CSV

Vos données d'entrée peuvent être contenues dans un fichier CSV encodé en UTF-8. Si vos données d'entraînement ne contiennent que des valeurs catégorielles et numériques, vous pouvez utiliser notre module de prétraitement pour renseigner les valeurs numériques manquantes, fractionner l'ensemble de données et supprimer les lignes contenant plus de 10 % de valeurs manquantes. Vous pouvez aussi exécuter la tâche d'entraînement sans activer le prétraitement automatique. Dans le fichier CSV, la première colonne est la variable cible. Si le fichier CSV contient l'en-tête, vous devez spécifier le paramètre has_header.

Préparer l'ensemble de données BigQuery

Votre entrée peut être un ensemble de données BigQuery. Il existe plusieurs méthodes pour charger vos données d'entrée dans BigQuery.

Formation

Pour effectuer un entraînement à nœud unique avec TabNet, utilisez la commande ci-dessous. Cette commande crée une ressource CustomJob qui utilise une seule machine à processeur. Pour en savoir plus sur les options que vous pouvez utiliser pendant l'entraînement, consultez la section Options de cette page.

Entraînement avec une entrée CSV

Voici l'exemple d'utilisation du format CSV en tant qu'entrée. Une fois votre modèle entraîné, vous pouvez optimiser les hyperparamètres utilisés pendant l'entraînement pour améliorer la précision et les performances du modèle. Le notebook de tutoriel fournit des exemples de tâches d'entraînement d'hyperparamètres.

# URI of the TabNet Docker image.
LEARNER_IMAGE_URI='us-docker.pkg.dev/vertex-ai-restricted/builtin-algorithm/tab_net_v2'

# The region to run the job in.
REGION='us-central1'

# Your project.
PROJECT_ID="[your-project-id]"

# Set the training data
DATASET_NAME="petfinder"  # Change to your dataset name.
IMPORT_FILE="petfinder-tabular-classification-tabnet-with-header.csv"
MODEL_TYPE="classification"

# Give a unique name to your training job.
DATE="$(date '+%Y%m%d_%H%M%S')"

# Set a unique name for the job to run.
JOB_NAME="tab_net_cpu_${DATASET_NAME}_${DATE}"
echo $JOB_NAME

# Define your bucket.
YOUR_BUCKET_NAME="gs://[your-bucket-name]" # Replace by your bucket name

# Copy the csv to your bucket.
TRAINING_DATA_PATH="${YOUR_BUCKET_NAME}/data/${DATASET_NAME}/train.csv"
gsutil cp gs://cloud-samples-data/ai-platform-unified/datasets/tabular/${IMPORT_FILE} TRAINING_DATA_PATH

# Set a location for the output.
OUTPUT_DIR="${YOUR_BUCKET_NAME}/${JOB_NAME}/"

echo $OUTPUT_DIR
echo $JOB_NAME

gcloud ai custom-jobs create \
  --region=${REGION} \
  --display-name=${JOB_NAME} \
  --worker-pool-spec=machine-type=n1-standard-8,replica-count=1,container-image-uri=${LEARNER_IMAGE_URI} \
  --args=--preprocess \
  --args=--model_type=${MODEL_TYPE} \
  --args=--data_has_header \
  --args=--training_data_path=${TRAINING_DATA_PATH} \
  --args=--job-dir=${OUTPUT_DIR} \
  --args=--max_steps=2000 \
  --args=--batch_size=4096 \
  --args=--learning_rate=0.01

Entraînement avec une entrée BigQuery

Voici l'exemple d'utilisation de BigQuery en tant qu'entrée.

# URI of the TabNet Docker image.
LEARNER_IMAGE_URI='us-docker.pkg.dev/vertex-ai-restricted/builtin-algorithm/tab_net_v2'

# The region to run the job in.
REGION='us-central1'

# Your project.
PROJECT_ID="[your-project-id]"

# Set the training data
DATASET_NAME="petfinder"  # Change to your dataset name.
IMPORT_FILE="petfinder-tabular-classification-tabnet-with-header.csv"

# Give a unique name to your training job.
DATE="$(date '+%Y%m%d_%H%M%S')"

# Set a unique name for the job to run.
JOB_NAME="tab_net_cpu_${DATASET_NAME}_${DATE}"
echo $JOB_NAME

# Define your bucket.
YOUR_BUCKET_NAME="gs://[your-bucket-name]" # Replace by your bucket name

# Copy the csv to your bucket.
TRAINING_DATA_PATH="${YOUR_BUCKET_NAME}/data/${DATASET_NAME}/train.csv"
gsutil cp gs://cloud-samples-data/ai-platform-unified/datasets/tabular/${IMPORT_FILE} TRAINING_DATA_PATH

# Create BigQuery dataset.
bq --location=${REGION} mk --dataset ${PROJECT_ID}:${DATASET_NAME}

# Create BigQuery table using CSV file.
TABLE_NAME="train"
bq --location=${REGION} load --source_format=CSV --autodetect ${PROJECT_ID}:${DATASET_NAME}.${TABLE_NAME} ${YOUR_BUCKET_NAME}/data/petfinder/train.csv

# Set a location for the output.
OUTPUT_DIR="${YOUR_BUCKET_NAME}/${JOB_NAME}/"
echo $OUTPUT_DIR
echo $JOB_NAME

gcloud ai custom-jobs create \
  --region=${REGION} \
  --display-name=${JOB_NAME} \
  --worker-pool-spec=machine-type=n1-standard-8,replica-count=1,container-image-uri=${LEARNER_IMAGE_URI} \
  --args=--preprocess \
  --args=--input_type=bigquery \
  --args=--model_type=classification \
  --args=--stream_inputs \
  --args=--bq_project=${PROJECT_ID} \
  --args=--dataset_name=${DATASET_NAME} \
  --args=--table_name=${TABLE_NAME} \
  --args=--target_column=Adopted \
  --args=--num_parallel_reads=2 \
  --args=--optimizer_type=adam \
  --args=--data_cache=disk \
  --args=--deterministic_data=False \
  --args=--loss_function_type=weighted_cross_entropy \
  --args=--replace_transformed_features=True \
  --args=--apply_quantile_transform=True \
  --args=--apply_log_transform=True \
  --args=--max_steps=2000 \
  --args=--batch_size=4096 \
  --args=--learning_rate=0.01 \
  --args=--job-dir=${OUTPUT_DIR}

Comprendre votre répertoire de tâche

Après avoir terminé une tâche d'entraînement, l'entraînement TabNet crée un modèle entraîné dans votre bucket Cloud Storage, ainsi que d'autres artefacts. La structure de répertoire suivante apparaît dans votre répertoire JOB_DIR :

  • artifacts/
    • metadata.json
  • model/ (un répertoire TensorFlow SavedModel qui contient également un fichier deployment_config.yaml)
    • saved_model.pb.
    • deployment_config.yaml
  • processed_data/
    • test.csv
    • training.csv
    • validation.csv

Le répertoire de la tâche contient également divers fichiers de points de contrôle du modèle dans le répertoire "experiment". Vous pouvez utiliser TensorBoard pour visualiser les métriques. Les métriques finales sont également incluses dans deployment_config.yaml.

Vérifiez que la structure de répertoire de JOB_DIR correspond à :

gsutil ls -a $JOB_DIR/*

Notebook de tutoriel

Il existe un exemple de notebook dans Colab pour lancer TabNet. Ce notebook vous explique également comment utiliser les éléments suivants :

  • L'entraînement avec une entrée BigQuery.

  • L'entraînement distribué avec des GPU.

  • Les réglages d'hyperparamètres.

Options

Utilisez les options d'entraînement génériques et spécifiques à TabNet suivantes lors de l'entraînement d'un modèle.

Options d'entraînement générique

Les options d'entraînement personnalisé suivantes sont les plus couramment utilisées. Pour plus d'informations, consultez la section Créer des tâches d'entraînement personnalisées.

  • worker-pool-spec : configuration du pool de nœuds de calcul utilisée par la tâche personnalisée. Pour créer une tâche personnalisée avec plusieurs pools de nœuds de calcul, spécifiez plusieurs configurations worker-pool-spec.

    Un objet worker-pool-spec peut contenir les champs suivants, qui sont listés avec les champs correspondants dans le message de l'API WorkerPoolSpec.

    • machine-type : type de machine du pool. Pour obtenir la liste des machines compatibles, consultez la page Types de machines.
    • replica-count : nombre d'instances dupliquées de la machine dans le pool.
    • container-image-uri : image Docker à exécuter sur chaque nœud de calcul. Pour utiliser l'algorithme intégré TabNet, l'image Docker doit être définie sur us-docker.pkg.dev/vertex-ai-restricted/builtin-algorithm/tab_net_v2:latest.
  • display-name : nom de la tâche.

  • region : région dans laquelle vous souhaitez exécuter la tâche.

Options d'entraînement spécifiques à TabNet

Le tableau suivant montre les paramètres d'exécution que vous pouvez définir dans la tâche d'entraînement TabNet :

Paramètre Type de données Description Requis
preprocess Argument booléen Spécifiez ce paramètre pour activer le prétraitement automatique. Non
job_dir chaîne Répertoire Cloud Storage dans lequel les fichiers de sortie du modèle seront stockés. Oui
input_metadata_path chaîne Chemin d'accès Cloud Storage aux métadonnées spécifiques à TabNet pour l'ensemble de données d'entraînement. Consultez les informations ci-dessus pour savoir comment créer les métadonnées. Non
training_data_path chaîne Modèle Cloud Storage dans lequel les données d'entraînement sont stockées. Oui
validation_data_path chaîne Modèle Cloud Storage où sont stockées les données d'évaluation. Non
test_data_path chaîne Modèle Cloud Storage où sont stockées les données de test. Oui
input_type chaîne "bigquery" ou "csv" : type des données tabulaires d'entrée. Si le format CSV est mentionné, la première colonne est traitée comme la cible. Si les fichiers CSV comportent un en-tête, transmettez également l'option "data_has_header". Si "bigquery" est utilisé, il est possible de fournir des chemins d'accès aux données d'entraînement/de validation ou de fournir des noms de projets, d'ensembles de données et de tables BigQuery pour le prétraitement, afin de produire des ensembles de données d'entraînement et de validation. Non : la valeur par défaut est "csv".
model_type chaîne Tâche d'apprentissage, telle que classification ou régression. Oui
split_column chaîne Nom de colonne utilisé pour créer les divisions d'entraînement, de validation et de test. Les valeurs des colonnes (table['split_column']) doivent être "TRAIN", "VALIDATE" ou "TEST". "TEST" est facultatif. Applicable à l'entrée BigQuery seulement. Non
train_batch_size entier Taille de lot pour l'entraînement. Non : la valeur par défaut est 1024.
eval_split float Fraction de division à utiliser pour l'ensemble de données d'évaluation, si validation_data_path n'est pas fourni. Non : la valeur par défaut est 0,2.
learning_rate float Taux d'apprentissage pour l'entraînement. Non : la valeur par défaut est le taux d'apprentissage par défaut de l'optimiseur spécifié.
eval_frequency_secs entier Fréquence à laquelle l'évaluation et la création de points de contrôle seront effectuées. La valeur par défaut est 600. Non
num_parallel_reads entier Nombre de threads utilisés pour lire les fichiers d'entrée. Dans la plupart des cas, nous vous conseillons de le définir comme étant égal ou légèrement inférieur au nombre de processeurs de la machine pour une meilleure performance. Par exemple, 6 par GPU est un bon choix par défaut. Oui
data_cache chaîne Choisissez de mettre en cache les données "memory", "disk" ou "no_cache". Pour les ensembles de données volumineux, la mise en cache des données dans la mémoire générerait des erreurs de mémoire insuffisante. Par conséquent, nous vous recommandons de choisir "disk". Vous pouvez spécifier la taille du disque dans le fichier de configuration (comme illustré ci-dessous). Assurez-vous de demander un disque de taille suffisante (par exemple, en To) pour écrire les données, pour les ensembles de données volumineux (de taille B). Non : la valeur par défaut est "memory".
bq_project chaîne Nom du projet BigQuery. Si "input_type=bigquery" utilise l'option "–preprocessing", il est nécessaire. C'est une alternative à la spécification des chemins d'accès aux données d'entraînement, de validation et de test. Non
dataset_name chaîne Nom de l'ensemble de données BigQuery. Si "input_type=bigquery" utilise l'option "–preprocessing", il est nécessaire. C'est une alternative à la spécification des chemins d'accès aux données d'entraînement, de validation et de test. Non
table_name chaîne Nom de la table BigQuery. Si "input_type=bigquery" utilise l'option "–preprocessing", il est nécessaire. C'est une alternative à la spécification des chemins d'accès aux données d'entraînement, de validation et de test. Non
loss_function_type chaîne Il existe plusieurs types de fonctions de perte dans TabNet. Pour la régression : mse/mae sont inclus. Pour la classification : cross_entropy/weighted_cross_entropy/focal_loss sont inclus. Non : la valeur par défaut est "mse" pour la régression et "cross_entropy" pour la classification.
deterministic_data Argument booléen Déterminisme de la lecture de données à partir de données tabulaires. La valeur par défaut est "False". Lorsque la valeur est définie sur "True", le test est déterministe. Pour un entraînement rapide sur de grands ensembles de données, nous vous conseillons de définir la valeur "deterministic_data=False", même si les résultats peuvent être aléatoires (ce qui devient négligeable dans les grands ensembles de données). Notez que le déterminisme n'est toujours pas garanti avec l'entraînement distribué, car "map-reduce" entraîne des résultats aléatoires en raison de l'ordre des opérations algébriques avec une précision finie. Toutefois, cela est négligeable dans la pratique, en particulier sur les ensembles de données volumineux. Dans les cas où vous souhaitez obtenir un déterminisme de 100 %, en plus du paramètre "deterministic_data=True", nous vous suggérons d'entraîner avec un seul GPU (par exemple avec MACHINE_TYPE="n1-highmem-8"). Non : la valeur par défaut est "False".
stream_inputs Argument booléen Diffuse les données d'entrée à partir de Cloud Storage au lieu de les télécharger localement : cette option est recommandée pour une exécution rapide. Non
large_category_dim entier Dimensionnalité de la représentation vectorielle continue : si le nombre de catégories distinctes d'une colonne catégorielle est supérieur à la valeur de "large_category_thresh", nous utilisons une représentation vectorielle continue "large_category_dim", au lieu d'une représentation vectorielle continue 1-D. La valeur par défaut est 1. Nous vous conseillons de l'augmenter (par exemple jusqu'à ~5 dans la plupart des cas et même ~10 si le nombre de catégories est généralement très élevé dans l'ensemble de données) si vous privilégiez l'exactitude plutôt que l'efficacité et l'explicabilité des calculs. Non : la valeur par défaut est 1.
large_category_thresh entier Seuil pour la cardinalité des colonnes catégorielles : si le nombre de catégories distinctes d'une colonne catégorielle est supérieur à la valeur de "large_category_thresh", nous utilisons une représentation vectorielle continue "large_category_dim", au lieu d'une représentation vectorielle continue 1-D. La valeur par défaut est 300. Nous vous conseillons de la réduire (par exemple jusqu'à ~10) si vous privilégiez l'exactitude plutôt que l'efficacité et l'explicabilité des calculs. Non : la valeur par défaut est 300.
yeo_johnson_transform Argument booléen Active la transformation Yeo-Johnson entraînable (la valeur par défaut est désactivée). Suivez ce lien : https://www.stat.umn.edu/arc/yjpower.pdf pour en savoir plus sur la transformation Yeo-Johnson. Grâce à notre mise en œuvre, les paramètres de transformation peuvent être appris avec TabNet, entraînés de bout en bout. Non
apply_log_transform Argument booléen Si les statistiques de transformation du journal sont contenues dans les métadonnées et que cette option est définie sur "true", les caractéristiques d'entrée sont transformées par journal. Utilisez "false" pour ne pas utiliser la transformation et "true" (valeur par défaut) pour l'utiliser. Les transformations de journal peuvent être très utiles, en particulier pour les ensembles de données ayant des distributions numériques asymétriques. Non
apply_quantile_transform Argument booléen Si les statistiques de quantiles sont contenues dans les métadonnées et que cette option est définie sur "true", les caractéristiques d'entrée sont transformées par quantile. Utilisez "false" pour ne pas utiliser la transformation et "true" (valeur par défaut) pour l'utiliser. Les transformations de quantile peuvent s'avérer très utiles, en particulier pour les ensembles de données ayant des distributions numériques asymétriques. Actuellement compatible avec le paramètre "input_type" de BigQuery. Non

Étape suivante