Un gradient boosting développé par Yandex, qui accepte les variables catégorielles telles quelles : zone, enseigne, code postal, canal. Il les convertit lui-même en chiffres sans laisser fuiter la cible. Ses réglages par défaut sont réputés solides, ce qui en fait le boosting le plus simple à mettre en route.
Pour noter une zone sans tricher, on ne regarde que les magasins déjà passés en revue avant celui-ci. Chaque magasin reçoit ainsi une valeur de zone calculée sans lui-même.
CatBoost tire une permutation aléatoire des données d'apprentissage. Elle définit un ordre fictif, comme si les lignes arrivaient l'une après l'autre.
Pour chaque ligne, la modalité (ici la zone) est remplacée par une statistique de la cible, en pratique une moyenne lissée, calculée seulement sur les lignes précédentes de même modalité. La ligne ne voit jamais sa propre cible : pas de fuite.
Les arbres posent la même question à tous les nœuds d'un même étage. Ils sont moins souples mais plus stables, et très rapides en prédiction. Comme tout boosting, chacun corrige l'erreur restante.
Surface, budget publicitaire local, nombre de concurrents, zone d'implantation (centre-ville, périphérie, rural) laissée en texte. La cible : le chiffre d'affaires annuel en k€.
Le modèle chiffre un projet décrit par les mêmes variables. L'équipe développement compare plusieurs sites candidats avant d'engager un bail.
La MAE (erreur absolue moyenne) se lit directement : « on se trompe en moyenne de tant de k€ par magasin ». Comparez-la toujours à une régression linéaire : sur ce jeu, les relations sont presque linéaires et le boosting n'a pas d'avantage net.
Noms identiques en R (catboost.train) et en Python (CatBoostRegressor). Le paquet R s'installe depuis les versions publiées par CatBoost, pas depuis le CRAN.
La liste des colonnes catégorielles. En Python, on les nomme ; en R, les colonnes de type facteur sont prises comme catégorielles. Oublier ce réglage revient à perdre l'intérêt de CatBoost.
Nombre d'arbres (1 000 par défaut) et pas d'apprentissage. Par défaut, le pas est choisi automatiquement selon la taille des données. Avec un jeu de validation, use_best_model garde le meilleur nombre d'arbres.
La profondeur des arbres symétriques, 6 par défaut. Entre 4 et 8 en général. Un arbre de profondeur 6 a toujours 64 feuilles, d'où l'intérêt de rester modéré sur les petits jeux.
En dessous de ce nombre de modalités, la variable est encodée en indicatrices 0 / 1 plutôt qu'en statistiques ordonnées. Utile à ajuster pour des variables à quelques modalités, comme la zone ici.
# CA des magasins : CatBoost en R
library(catboost)
# stringsAsFactors : la zone devient un facteur, que CatBoost traite comme catégorielle
magasins <- read.csv("magasins.csv", stringsAsFactors = TRUE)
variables <- c("surface_m2", "budget_pub_k", "nb_concurrents", "zone")
set.seed(42)
idx <- sample(nrow(magasins), round(0.75 * nrow(magasins)))
pool_train <- catboost.load_pool(magasins[idx, variables], label = magasins$ca_k[idx])
pool_test <- catboost.load_pool(magasins[-idx, variables], label = magasins$ca_k[-idx])
modele <- catboost.train(pool_train, params = list(loss_function = "RMSE", iterations = 800,
learning_rate = 0.05, depth = 4, random_seed = 42, logging_level = "Silent"))
# Erreur moyenne en k€ sur les magasins jamais vus
pred <- catboost.predict(modele, pool_test)
cat("Erreur moyenne (MAE) :", round(mean(abs(pred - magasins$ca_k[-idx])), 1), "k€\n")
print(catboost.get_feature_importance(modele, pool_train))
# Prévision pour un projet d'ouverture
projet <- data.frame(surface_m2 = 1500, budget_pub_k = 15, nb_concurrents = 3,
zone = factor("peripherie", levels = levels(magasins$zone)))
cat("CA prévu du projet :", round(catboost.predict(modele, catboost.load_pool(projet))), "k€\n")
# CA des magasins : CatBoost en Python
import pandas as pd
from catboost import CatBoostRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error
magasins = pd.read_csv("magasins.csv")
X = magasins[["surface_m2", "budget_pub_k", "nb_concurrents", "zone"]].copy()
X["zone"] = X["zone"].astype("category") # type catégoriel pandas : aucun encodage à faire
y = magasins["ca_k"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)
# cat_features : CatBoost encode lui-même la zone par statistiques ordonnées
modele = CatBoostRegressor(iterations=800, learning_rate=0.05, depth=4, loss_function="RMSE",
random_seed=42, verbose=0)
modele.fit(X_train, y_train, cat_features=["zone"])
# Erreur moyenne en k€ sur les magasins jamais vus
print("Erreur moyenne (MAE) :", round(mean_absolute_error(y_test, modele.predict(X_test)), 1), "k€")
print(modele.get_feature_importance(prettified=True))
# Prévision pour un projet d'ouverture
projet = pd.DataFrame({"surface_m2": [1500], "budget_pub_k": [15.0], "nb_concurrents": [3], "zone": ["peripherie"]})
projet["zone"] = pd.Categorical(projet["zone"], categories=X["zone"].cat.categories)
print("CA prévu du projet :", round(modele.predict(projet)[0]), "k€")
Non. On déclare les colonnes catégorielles et CatBoost les convertit lui-même, par statistiques ordonnées sur la cible ou par one-hot si la variable a très peu de modalités. C'est son principal avantage sur les autres boostings.
Les trois donnent des performances proches une fois réglés. CatBoost se distingue avec des variables catégorielles nombreuses et des réglages par défaut solides. LightGBM est le plus rapide sur de très gros volumes ; XGBoost est le plus répandu dans les outils.
Le target encoding remplace une catégorie par la moyenne de la cible dans cette catégorie. Calculé naïvement, il utilise la cible de la ligne elle-même et le modèle surapprend. CatBoost ne calcule cette moyenne que sur les lignes précédentes d'une permutation aléatoire, ce qui supprime cette fuite.
Le boosting des gros volumes. Gère aussi les catégorielles, avec plus de risque de surapprentissage quand les modalités sont nombreuses.
Voir la fiche → le plus répanduLe boosting le plus présent dans les outils. Les catégorielles y demandent en général un encodage préalable.
Voir la fiche → la référence à battreSur des relations presque linéaires comme ce CA de magasins, elle fait jeu égal et chaque coefficient se lit en k€.
Voir la fiche →Dataistudio forme les équipes au machine learning et à l'IA, sur des cas concrets.
Nous utilisons des cookies de mesure d'audience et de suivi publicitaire pour comprendre la fréquentation du site et l'efficacité de nos annonces. Rien n'est déposé sans votre accord. En savoir plus