Imputation de valeurs arbitraires pour les variables catégorielles

C’est la méthode la plus utilisée pour l’imputation des données manquantes pour les variables catégorielles. Cette méthode consiste à traiter les données manquantes comme une étiquette ou une catégorie supplémentaire de la variable. Toutes les observations manquantes sont regroupées dans la nouvelle étiquette « manquante ».

Il s’agit essentiellement de l’équivalent du remplacement par une valeur arbitraire pour les variables numériques.

La beauté de cette technique réside dans le fait qu’elle ne suppose rien sur le fait que les données sont manquantes. Elle est très bien adaptée lorsque le nombre de données manquantes est élevé.

Avantages

  • Facile à mettre en œuvre
  • Moyen rapide d’obtenir des ensembles de données complets
  • Peut être intégré dans la production (lors du déploiement du modèle)
  • Saisit l’importance du « manque » s’il y en a un
  • Aucune supposition faite sur les données

Limitations

  • Si le nombre de NA est faible, la création d’une catégorie supplémentaire peut entraîner un surdimensionnement des arbres

Pour les variables catégorielles, c’est la méthode de choix, car elle traite les valeurs manquantes comme une catégorie distincte, sans faire d’hypothèse sur la variable ou les raisons pour lesquelles les données pourraient être manquantes. Elle est largement utilisée dans les concours et les organisations de science des données.

import pandas as pd
import numpy as np

import matplotlib.pyplot as plt

# to split the datasets
from sklearn.model_selection import train_test_split

cols_to_use = ['M1', 'idHippodrome', 'place']
data = pd.read_csv('../exportfeature.csv',usecols=cols_to_use, sep=";",encoding='ANSI')

data.head()

# Imputation de valeur manquantes
# 0.03 % dans M1
data.loc[data.sample(frac=0.03).index, 'M1'] = np.nan
# 0.05 % dans Hippodrome
data.loc[data.sample(frac=0.06).index, 'idHippodrome'] = np.nan

# Vérification des valeurs manquantes

data.isnull().mean()

place           0.000000
M1              0.029994
idHippodrome    0.059988
dtype: float64

En remplaçant NA dans les variables catégorielles par une étiquette appelée « manquante », nous n’apprenons rien de l’ensemble de formation, donc en principe nous pourrions faire cela dans l’ensemble de données original et ensuite séparer en train et test. Cependant, je ne recommande pas cette pratique. Vous verrez dans les prochains cahiers que la séparation en train et test dès le début aide à construire un pipeline d’apprentissage machine. Je vais donc continuer à appliquer cette pratique ici aussi.

# Création du jeu d'entrainement et de test

X_train, X_test, y_train, y_test = train_test_split(
    data, 
    data['place'],  
    test_size=0.3,  
    random_state=0)  

X_train.shape, X_test.shape

((14352, 3), (6152, 3))

M1

# % de valeurs absentes
X_train['M1'].isnull().mean()

0.023483365949119372

# examinons le nombre d'observations par catégorie dans M1

# nous avons utilisé cette ligne de code dans la section 3 sur les caractéristiques variables

# value_counts() compte le nombre de fois ou une étiquette est présnete
# dans la variable indiquée ci-dessous

X_train['M1'].value_counts().sort_values(ascending=False).plot.bar()
plt.xlabel('M1')
plt.ylabel('Nombre de fois')
m1 remplace
# On remplace les valeurs manquantes par l'étiquette "Manquante"

X_train['M1'].fillna('Manquante', inplace=True)
X_test['M1'].fillna('Manquante', inplace=True)

# examinons le nombre d'observations par catégorie dans M1

# nous avons utilisé cette ligne de code dans la section 3 sur les caractéristiques variables

# value_counts() compte le nombre de fois ou une étiquette est présnete
# dans la variable indiquée ci-dessous

X_train['M1'].value_counts().sort_values(ascending=False).plot.bar()
plt.xlabel('M1')
plt.ylabel('Nombre de fois')
m1 remplace 2

Nous voyons notre nouvelle étiquette manquante

# traçons la distribution de la cible pour M1 qui :

# * montrent la catégorie la plus fréquente ou
# * ceux qui présentent des données manquantes

fig = plt.figure()
ax = fig.add_subplot(111)


X_train[X_train['M1']=='1a']['place'].plot(kind='kde', ax=ax)
X_train[X_train['M1']=='Da']['place'].plot(kind='kde', ax=ax)
X_train[X_train['M1']=='Manquante']['place'].plot(kind='kde', ax=ax)


lines, labels = ax.get_legend_handles_labels()
labels = ['1a', 'Da', 'Manquante']
ax.legend(lines, labels, loc='best')
m1 remplace 3

On voit que l’étiquette Manquante est globalement plus présente à l’arrivée de Da

Si vous voulez découvrir comment fonctionne la librairie pandas ou bien l’environnement Jupyter, n’hésitez pas à consulter les cours ci-dessous.

GCH anime

Je télécharge mon guide gratuit

Vous recevrez votre guide par email sans aucun engagement de votre part.

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.