L’imputation consiste à remplacer les données manquantes par des estimations statistiques des valeurs manquantes. L’objectif de toute technique d’imputation est de produire un ensemble complet de données qui peut être utilisé pour former des modèles d’apprentissage automatique.
L’imputation de valeurs arbitraires consiste à remplacer toutes les occurrences de valeurs manquantes (NA) dans une variable par une valeur arbitraire. Les valeurs arbitraires généralement utilisées sont 0, 999, -999 (ou d’autres combinaisons de 9) ou -1 (si la distribution est positive).
Quelles variables puis-je imputer avec une valeur arbitraire ?
Les variables catégorielles et numériques peuvent être imputées par des valeurs arbitraires.
Pour les variables catégorielles, cela équivaut à remplacer toutes les instances de NA par une étiquette supplémentaire, ce qui est une pratique très courante ; je la traiterai donc séparément un peu plus tard.
Hypothèses
- Les données ne manquent pas au hasard.
Si c’est le cas, nous voulons signaler les valeurs manquantes avec une valeur différente (arbitraire), au lieu de remplacer ces occurrences par la moyenne ou la médiane, qui représentent la valeur la plus courante.
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
Limitations
- Distorsion de la distribution de la variable d’origine
- Distorsion de l’écart initial
- Distorsion de la covariance avec les autres variables de l’ensemble de données
- Si la valeur arbitraire se trouve à la fin de la distribution, elle peut masquer ou créer des valeurs aberrantes
- Il faut veiller à ne pas choisir une valeur arbitraire trop semblable à la moyenne ou à la médiane (ou à toute autre valeur commune de la distribution de la variable)
Quand utiliser l’imputation de valeur arbitraire
Le remplacement des NA par des valeurs arbitraires doit être utilisé lorsqu’il y a des raisons de croire que les NA ne manquent pas au hasard. Dans de telles situations, nous ne voudrions pas remplacer par la médiane ou la moyenne, et donc faire en sorte que les NA ressemblent à la majorité de nos observations. Nous voulons plutôt signaler le fait que l’observation est manquante.
Cette approche est largement utilisée tant dans les organisations que dans les concours Kaggle. Elle consiste à remplacer la NA par une valeur arbitraire. N’importe laquelle de votre création, mais idéalement différente de la médiane/moyenne/mode, et non pas dans les valeurs normales de la variable.
Le problème consiste à décider de la valeur arbitraire à choisir…
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# Pour séparer le dataframe
from sklearn.model_selection import train_test_split
data = pd.read_csv('../exportfeature.csv',usecols=['iCote', 'nbPartants.1', 'place'],sep=";",encoding='ANSI')
data.head()
place nbPartants.1 iCote
0 1 17 12.0
1 1 18 12.0
2 0 10 9.0
3 1 13 4.0
4 0 17 8.0
# Vérifions les valeurs manquantes
data.isnull().mean()
place 0.000000
nbPartants.1 0.000000
iCote 0.171381
dtype: float64
Imputation importante
L’imputation doit être faite sur l’ensemble de formation, puis propagée à l’ensemble de test. Pour l’imputation de valeurs arbitraires, cela n’est pas si important, car nous avons choisi la valeur arbitrairement, cependant il est bon d’adhérer à cette pratique et de sélectionner la valeur arbitraire en regardant uniquement la distribution des variables dans l’ensemble de formation.
# Création du jeu d'entrainement et de test
X_train, X_test, y_train, y_test = train_test_split(
data[['iCote', 'nbPartants.1']],
data['place'],
test_size=0.3,
random_state=0)
X_train.shape, X_test.shape
((14352, 2), (6152, 2))
# Exploitons les données manquantes dans le jeu d'entrainement
# les pourcentages doivent être assez semblables à ceux
# de l'ensemble des données
X_train.isnull().mean()
iCote 0.171474
nbPartants.1 0.000000
dtype: float64
# faisons une fonction pour remplir les valeurs manquantes par une valeur arbitraire
def impute_na(df, variable, value):
return df[variable].fillna(value)
# explorons la distribution des variables
# pour décider de la valeur arbitraire à utiliser
X_train.hist(bins=50)
plt.show()

# Pour cette démo, je vais remplacer NA par deux valeurs arbitraires différentes
# un à l'extrême droite de la distribution ==> 400
# et alternativement par -1, en profitant du fait que la cote ne prend que des valeurs positives
X_train['iCote_400'] = impute_na(X_train, 'iCote', 400)
X_train['iCote_minus1'] = impute_na(X_train, 'iCote', -1)
X_train.head(15)
iCote nbPartants.1 iCote_400 iCote_minus1
2540 3.0 16 3.0 3.0
19008 5.0 13 5.0 5.0
7624 34.0 15 34.0 34.0
2575 4.0 13 4.0 4.0
852 26.0 17 26.0 26.0
4855 3.0 13 3.0 3.0
8154 7.0 15 7.0 7.0
18928 5.0 16 5.0 5.0
18286 16.0 12 16.0 16.0
15712 11.0 16 11.0 11.0
4842 8.0 15 8.0 8.0
18034 8.0 16 8.0 8.0
1215 2.0 15 2.0 2.0
14732 7.0 12 7.0 7.0
17160 2.0 11 2.0 2.0
# on peut voir un changement dans la variance après l'imputation de la moyenne / médiane
# cela est attendu, car le pourcentage de données manquantes est assez
# élevé pour la cote, ~17%.
print('Variance des données de départ: ', X_train['iCote'].var())
print('Variance après imputation 400: ', X_train['iCote_400'].var())
print('Variance après imputation -1: ', X_train['iCote_minus1'].var())
Variance des données de départ: 461.1000784035024
Variance après imputation 400: 21728.161265782925
Variance après imputation -1: 407.51209778516744
En fait, l’effet sur la variance sera également déterminé par l’ampleur de la valeur arbitraire choisie pour l’imputation, comparer 99 avec -1.
# on peut voir que la répartition a changé
fig = plt.figure()
ax = fig.add_subplot(111)
X_train['iCote'].plot(kind='kde', ax=ax)
X_train['iCote_400'].plot(kind='kde', ax=ax, color='red')
X_train['iCote_minus1'].plot(kind='kde', ax=ax, color='green')
lines, labels = ax.get_legend_handles_labels()
ax.legend(lines, labels, loc='best')

Comme mentionné ci-dessus, l’imputation déforme la distribution initiale de la variable iCote.
Est-ce important ?
Cela dépend du modèle d’apprentissage machine que vous voulez construire. Les modèles linéaires supposent que les variables sont normalement distribuées. L’imputation de la moyenne / médiane peut déformer la distribution normale originale si le pourcentage de données manquantes est élevé. Par conséquent, la variable finale imputée ne sera plus normalement distribuée, ce qui peut affecter les performances du modèle linéaire.
# nous avons également dit que l'imputation peut affecter la relation
# avec les autres variables de l'ensemble de données, regardons
X_train[['nbPartants.1', 'iCote', 'iCote_400', 'iCote_minus1']].cov()
nbPartants.1 iCote iCote_400 iCote_minus1
nbPartants.1 7.779288 8.079004 -53.313376 8.766945
iCote 8.079004 461.100078 461.100078 461.100078
iCote_400 -53.313376 461.100078 21728.161266 -355.530913
iCote_minus1 8.766945 461.100078 -355.530913 407.512098
# Enfin, j'ai mentionné que l'imputation de valeurs arbitraires peut
# affecter la perception des valeurs aberrantes
# découvrons-le en utilisant un boxplot
X_train[['iCote', 'iCote_400', 'iCote_minus1']].boxplot()


Je télécharge mon guide gratuit
Thank you!
You have successfully joined our subscriber list.
Vous recevrez votre guide par email sans aucun engagement de votre part.