Home » AI » Comment automatiser le feature engineering en Python efficacement ?

Comment automatiser le feature engineering en Python efficacement ?

Automatiser le feature engineering avec Python est possible grâce à des scripts ciblés qui créent, transforment et sélectionnent intelligemment vos variables. Découvrez comment optimiser vos modèles en gagnant du temps et en évitant les erreurs manuelles.

3 principaux points à retenir.

  • Automatisation ciblée : scripts dédiés pour chaque étape clé du feature engineering.
  • Qualité et cohérence : transformations et encodages adaptés aux données et au contexte.
  • Sélection optimisée : éliminer le bruit pour booster la performance des modèles.

Comment encoder efficacement les variables catégorielles ?

L’encodage des variables catégorielles est un élément crucial de l’ingénierie des caractéristiques en machine learning, mais c’est aussi une vraie galère. Pourquoi ? Parce que chaque technique d’encodage doit être choisie avec soin, en fonction de la cardinalité de la variable et de son lien avec la cible. Alors, vous avez plusieurs options : one-hot encoding, label encoding, target encoding et fréquence encoding. Chacune a ses avantages et inconvénients.

  • One-hot encoding : Idéal pour les variables à faible cardinalité. Cependant, il peut exploser en dimensions pour les variables à haute cardinalité, ce qui peut rendre votre modèle inefficace.
  • Label encoding : Économique en mémoire, mais il sous-entend une ordonnancement qui peut induire des biais si les catégories n’ont pas d’ordre naturel.
  • Target encoding : Très puissant car il utilise la relation avec la cible. Attention, il peut entraîner des fuites de données si ce n’est pas bien géré.
  • Fréquence encoding : Utile pour les variables à haute cardinalité, il remplace les catégories par leur fréquence d’apparition. Simple, mais cela peut perdre des informations importantes.

Un bon script d’encodage peut analyser les caractéristiques des colonnes catégorielles et appliquer l’encodage adapté. Par exemple, il peut gérer les catégories rares en les regroupant dans une catégorie « autres » et s’assurer que les catégories inconnues dans les données de test sont traitées de manière cohérente avec les données d’entraînement.

Voici un exemple de code Python simplifié qui illustre comment procéder à un encodage conditionnel basé sur la cardinalité :


import pandas as pd

def encode_categorical(df, column):
    cardinality = df[column].nunique()
    
    if cardinality < 10:
        return pd.get_dummies(df[column], prefix=column)
    elif cardinality > 50:
        freq = df[column].value_counts() / len(df)
        return df[column].map(freq).fillna(0)
    else:
        return df[column].astype('category').cat.codes

# Exemple d'utilisation
data = {'category': ['A', 'B', 'A', 'C', 'B', 'D', 'E', 'A']}
df = pd.DataFrame(data)
df['encoded'] = encode_categorical(df, 'category')
print(df)

Ce code analyse la cardinalité de la colonne et applique l’encodage approprié. Pour plus de détails sur la transformation des variables pour faciliter l’apprentissage des modèles, vous pouvez consulter cet article.

Comment transformer automatiquement les variables numériques ?

Les variables numériques brutes sont souvent mal calibrées. Vous avez déjà remarqué que certaines d’entre elles présentent une forte asymétrie (skewness), des valeurs aberrantes (outliers) ou des échelles variées ? Ces problèmes peuvent fausser vos modèles de machine learning. La solution ? Des transformations automatiques qui permettent d’optimiser ces variables pour améliorer la performance de vos modèles.

Il existe plusieurs transformations que vous pouvez appliquer :

  • Log transformation : utile pour réduire l’asymétrie des données.
  • Box-Cox transformation : idéale pour normaliser les données, mais nécessite des valeurs positives.
  • Racine carrée : souvent utilisée pour atténuer l’impact des valeurs élevées.
  • Standardisation : transforme les données pour qu’elles aient une moyenne de 0 et un écart-type de 1.
  • Robust scaling : résistant aux outliers, basé sur les quantiles.
  • Yeo-Johnson transformation : s’adapte aux valeurs négatives et est similaire à Box-Cox.

Pour choisir la meilleure transformation pour chaque variable, vous devez effectuer des tests de normalité. Les tests de Shapiro-Wilk et d’Anderson-Darling sont deux méthodes efficaces pour cela. En appliquant ces tests, vous pouvez évaluer l’impact de chaque transformation sur la distribution de vos données. Par exemple, si vous constatez une skewness supérieure à 1, privilégiez les transformations logarithmiques ou Box-Cox.

La gestion des valeurs zéro et négatives est également cruciale. Par exemple, si vous devez appliquer une transformation logarithmique, mais que vos données contiennent des zéros, vous pouvez les décaler en ajoutant une petite constante. Pour les valeurs négatives, la transformation Yeo-Johnson est souvent la meilleure option.


import pandas as pd
import numpy as np
from scipy import stats

# Exemple de transformation conditionnelle
def transform_feature(data):
    if (data <= 0).any():
        return stats.yeojohnson(data)[0]  # Transformation Yeo-Johnson
    else:
        return np.log1p(data)  # Transformation log

df = pd.DataFrame({'numeric_feature': [1, 2, 3, 0, -1]})
df['transformed_feature'] = transform_feature(df['numeric_feature'])

En appliquant ces transformations de manière systématique, vous pouvez maintenir la cohérence entre vos ensembles de données d'entraînement et de test, ce qui est essentiel pour éviter le surajustement et garantir des résultats fiables. Pour en savoir plus sur l'automatisation du feature engineering, vous pouvez consulter cet article sur Featuretools.

Pourquoi générer des interactions entre features et comment ?

Les interactions entre features, c'est un peu le Saint Graal du machine learning. Pourquoi ? Parce qu’elles capturent des signaux complexes souvent invisibles aux modèles simples. Prenez un instant pour réfléchir : un revenu peut avoir des effets différents selon les segments de clients, et le même budget publicitaire n’aura pas le même impact selon la saison. Si vous ne tenez pas compte de ces interactions, vous risquez de passer à côté d'informations cruciales.

Mais voilà, générer toutes les paires possibles d’interactions, c'est un véritable casse-tête. Imaginez le coût en termes de temps et de ressources. C'est là que l'intérêt d'un script se révèle. Ce dernier peut créer des produits, des ratios, des sommes et des différences pour les features numériques, et des combinaisons pour les catégorielles. En gros, il s'agit d'automatiser un processus qui serait autrement long et fastidieux.

Une fois ces interactions générées, l'étape suivante consiste à les évaluer. On peut utiliser des méthodes comme l’information mutuelle ou des scores d'importance issus de modèles pour ne garder que les plus pertinentes. Cela vous permet de réduire le bruit et de vous concentrer sur ce qui compte vraiment. Par exemple, si vous avez deux features qui interagissent, vous pouvez calculer l'importance de leur combinaison par rapport à leur impact individuel. Cela vous aidera à décider si vous devez les garder ou les écarter.

Et n'oublions pas les cas particuliers : le script doit gérer des situations comme la division par zéro ou des valeurs infinies. Imaginez que vous calculiez un ratio et que l'une des valeurs soit nulle. Sans une gestion adéquate, cela pourrait provoquer une erreur. Le script doit donc être robuste et capable de traiter ces scénarios sans encombres.

Pour illustrer, prenons un exemple simple. Supposons que vous ayez deux features : le prix d’un produit et le nombre d'unités vendues. Un script pourrait générer des interactions telles que le produit du prix et des ventes, ou le ratio des ventes par rapport au prix. Ensuite, en évaluant ces interactions, vous pourriez découvrir que le ratio des ventes par rapport au prix est un indicateur clé de performance. C'est exactement ce type de découverte qui peut propulser votre modèle à un niveau supérieur.

Comment extraire toutes les informations pertinentes des dates ?

Les dates sont une mine d’or souvent sous-exploitée dans l’analyse de données. Chaque timestamp peut révéler une multitude d’informations pertinentes si vous savez comment les extraire. Voici comment procéder pour extraire automatiquement des éléments cruciaux tels que l’année, le mois, le jour, l’heure, le jour de la semaine, le trimestre, un flag pour le weekend, et même les fêtes. Mais ce n'est pas tout : il est essentiel de coder les cycles temporels, comme les mois et les heures, en sinus et cosinus pour respecter la circularité de ces données.

La création de deltas temporels entre plusieurs dates est également fondamentale. Prenons un exemple concret : la différence entre la date de commande et la date d’expédition peut fournir des insights précieux sur les délais de livraison. En analysant ces informations, vous pouvez mieux comprendre les performances de votre logistique et améliorer l’expérience client.

Pour garantir que chaque feature extraite soit facilement identifiable et exploitable, il est crucial d'utiliser des noms clairs et explicites. Cela vous évitera des maux de tête lors de l’analyse des données par la suite.

Voici un exemple de code Python qui illustre comment extraire ces features et coder la cyclicité :


import pandas as pd
import numpy as np

# Exemple de DataFrame avec une colonne de dates
df = pd.DataFrame({
    'date_commande': pd.to_datetime(['2023-01-01', '2023-01-02', '2023-01-03']),
    'date_expedition': pd.to_datetime(['2023-01-05', '2023-01-06', '2023-01-07'])
})

# Extraction des informations pertinentes
df['année'] = df['date_commande'].dt.year
df['mois'] = df['date_commande'].dt.month
df['jour'] = df['date_commande'].dt.day
df['heure'] = df['date_commande'].dt.hour
df['jour_semaine'] = df['date_commande'].dt.dayofweek
df['trimestre'] = df['date_commande'].dt.quarter
df['is_weekend'] = np.where(df['jour_semaine'] >= 5, 1, 0)

# Codage des cycles
df['mois_sin'] = np.sin(2 * np.pi * df['mois'] / 12)
df['mois_cos'] = np.cos(2 * np.pi * df['mois'] / 12)

# Calcul des deltas temporels
df['delta_temps'] = (df['date_expedition'] - df['date_commande']).dt.days

print(df)

Ce code vous permet d’extraire une multitude d’informations pertinentes de vos dates tout en respectant les cycles naturels. Vous voulez en savoir plus sur comment débuter efficacement dans des projets data science ? Consultez cet article : Quels projets Data Science pour débuter efficacement ?

Comment sélectionner automatiquement les meilleures features ?

La sélection automatique des meilleures features est un passage obligé pour quiconque souhaite optimiser ses modèles de machine learning. Pourquoi ? Parce que cela évite la surcharge de données et le surapprentissage, deux fléaux qui peuvent ruiner vos résultats. À l'ère où les datasets sont de plus en plus volumineux, s’attaquer à cette problématique devient crucial.

La pipeline de sélection de features que nous allons examiner est multi-étapes et vise à maximiser la pertinence des données tout en minimisant leur redondance. Voici comment cela fonctionne :

  • Élimination des variables à faible variance : On commence par supprimer les features qui n’apportent aucune information, c’est-à-dire celles qui ont une variance proche de zéro.
  • Suppression des redondances via corrélations : Ensuite, on utilise une analyse de corrélation pour éliminer les features qui sont fortement corrélées entre elles, ne gardant que celle qui est la plus pertinente pour le modèle.
  • Évaluation via des tests statistiques : Des tests comme l’ANOVA, le chi-deux et l’information mutuelle permettent d’évaluer la pertinence des features par rapport à la variable cible.
  • Importance par arbre de décision : On peut aussi utiliser des modèles basés sur des arbres, comme les forêts aléatoires, pour obtenir des scores d’importance des features.
  • L1 régularisation : Cela permet de pénaliser les coefficients des features moins importantes, les poussant à zéro.
  • Élimination récursive : Cette méthode consiste à entraîner le modèle de manière répétée en éliminant les features les moins pertinentes à chaque itération.

Une fois que ces étapes sont complétées, il est possible de fusionner les scores obtenus afin d'obtenir un classement robuste des features. Cela permet non seulement d’identifier les features les plus utiles mais aussi de garantir une certaine diversité dans le choix final. Pour valider cette sélection, la validation par cross-validation est essentielle. Elle permet de s'assurer que les features retenues se comportent bien sur des données jamais vues auparavant.

Voici un exemple de code pour combiner plusieurs méthodes de sélection et obtenir la liste finale des features retenues :


from sklearn.feature_selection import VarianceThreshold, SelectKBest, mutual_info_regression
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split

# Séparation des données
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# Élimination de variance
selector = VarianceThreshold(threshold=0.01)
X_reduced = selector.fit_transform(X_train)

# Sélection de meilleures features
selector = SelectKBest(score_func=mutual_info_regression, k=10)
X_selected = selector.fit_transform(X_reduced, y_train)

# Importance des features par forêt aléatoire
model = RandomForestRegressor()
model.fit(X_selected, y_train)
importances = model.feature_importances_

Prêt à booster vos modèles avec ces scripts Python de feature engineering ?

Ces cinq scripts Python ciblés transforment la corvée du feature engineering en un processus fluide, précis et reproductible. Vous gagnez du temps, évitez les erreurs classiques et maximisez la puissance prédictive de vos modèles. Que ce soit pour encoder, transformer, créer des interactions, extraire du temporel ou sélectionner, ces outils sont vos alliés pour un machine learning plus efficace et moins fastidieux.

FAQ

Qu'est-ce que le feature engineering en machine learning ?

Le feature engineering consiste à créer, transformer et sélectionner les variables (features) pertinentes à partir des données brutes pour améliorer la performance des modèles de machine learning.

Pourquoi automatiser le feature engineering avec Python ?

Automatiser permet de gagner du temps, d'éviter les erreurs manuelles, de gérer efficacement de grands volumes de données et d'explorer systématiquement des combinaisons complexes de features.

Quels types d'encodage pour les variables catégorielles ?

On utilise le one-hot encoding pour peu de catégories, le label encoding pour les variables ordinales, la target encoding pour les variables corrélées à la cible, et la frequency encoding pour les catégories nombreuses.

Comment choisir la meilleure transformation pour une variable numérique ?

En testant plusieurs transformations (log, Box-Cox, racine carrée, standardisation) et en évaluant leur impact sur la distribution et la performance du modèle via des tests statistiques et métriques de normalité.

Comment éviter la surabondance de features après l'ingénierie ?

En appliquant une sélection automatique combinant filtres statistiques, importance modèle, régularisation et élimination récursive pour ne garder que les variables les plus pertinentes et éviter le surapprentissage.

 

 

A propos de l'auteur

Franck Scandolera est consultant expert en Analytics, Data et Automatisation IA, avec une solide expérience dans le développement d'applications IA intégrées aux workflows métier. Responsable de l'agence webAnalyste et formateur reconnu, il accompagne les entreprises francophones dans la maîtrise des techniques avancées de data science et feature engineering, garantissant des solutions pragmatiques et performantes.

Retour en haut
DataMarket AI