Imputation de valeur arbitraire

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()
val absente
# 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')
repartition

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()
val arbitraires 2

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.