Scikit-learn impute est utilisé pour remplir les données manquantes comme pré-processus pour l'apprentissage automatique. J'ai essayé de vérifier le comportement en utilisant des données simples.
data = {
'A': [a for a in range(10)],
'B': [a * 2 for a in range(10)],
'C': [a * 3 for a in range(10)],
'D': [a * 4 for a in range(10)],
}
import pandas as pd
data = pd.DataFrame(data)
data
A | B | C | D | |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
1 | 1 | 2 | 3 | 4 |
2 | 2 | 4 | 6 | 8 |
3 | 3 | 6 | 9 | 12 |
4 | 4 | 8 | 12 | 16 |
5 | 5 | 10 | 15 | 20 |
6 | 6 | 12 | 18 | 24 |
7 | 7 | 14 | 21 | 28 |
8 | 8 | 16 | 24 | 32 |
9 | 9 | 18 | 27 | 36 |
import numpy as nan
data2 = pd.DataFrame(data)
#data2['B'][3] = np.nan
data2.loc.__setitem__(((2), ("B")), np.nan)
data2.loc.__setitem__(((3), ("C")), np.nan)
data2.loc.__setitem__(((5), ("C")), np.nan)
data2.loc.__setitem__(((6), ("D")), np.nan)
data2.loc.__setitem__(((7), ("D")), np.nan)
data2
A | B | C | D | |
---|---|---|---|---|
0 | 0 | 0.0 | 0.0 | 0.0 |
1 | 1 | 2.0 | 3.0 | 4.0 |
2 | 2 | NaN | 6.0 | 8.0 |
3 | 3 | 6.0 | NaN | 12.0 |
4 | 4 | 8.0 | 12.0 | 16.0 |
5 | 5 | 10.0 | NaN | 20.0 |
6 | 6 | 12.0 | 18.0 | NaN |
7 | 7 | 14.0 | 21.0 | NaN |
8 | 8 | 16.0 | 24.0 | 32.0 |
9 | 9 | 18.0 | 27.0 | 36.0 |
%matplotlib inline
import matplotlib.pyplot as plt
plt.plot(data2)
Comme décrit ci-dessus, nous avons créé la colonne B contenant une valeur manquante, la colonne C en contenant deux et la colonne D contenant des valeurs manquantes consécutives.
SimpleImputer
La classe SimpleImputer fournit une méthode de calcul de base pour saisir les valeurs manquantes. Les valeurs manquantes peuvent être calculées en utilisant les valeurs constantes spécifiées ou en utilisant les statistiques (moyenne, médiane ou la plus fréquente) de chaque colonne dans laquelle les valeurs manquantes sont présentes.
default(mean)
La valeur par défaut est remplie avec la valeur moyenne.
from sklearn.impute import SimpleImputer
imp = SimpleImputer() #missing_values=np.nan, strategy='mean')
data3 = pd.DataFrame(imp.fit_transform(data2))
data3
0 | 1 | 2 | 3 | |
---|---|---|---|---|
0 | 0.0 | 0.000000 | 0.000 | 0.0 |
1 | 1.0 | 2.000000 | 3.000 | 4.0 |
2 | 2.0 | 9.555556 | 6.000 | 8.0 |
3 | 3.0 | 6.000000 | 13.875 | 12.0 |
4 | 4.0 | 8.000000 | 12.000 | 16.0 |
5 | 5.0 | 10.000000 | 13.875 | 20.0 |
6 | 6.0 | 12.000000 | 18.000 | 16.0 |
7 | 7.0 | 14.000000 | 21.000 | 16.0 |
8 | 8.0 | 16.000000 | 24.000 | 32.0 |
9 | 9.0 | 18.000000 | 27.000 | 36.0 |
%matplotlib inline
import matplotlib.pyplot as plt
plt.plot(data3)
Comme mentionné ci-dessus, selon le type de données, il peut ne pas être naturel de renseigner la valeur moyenne.
median
Vous pouvez également remplir les valeurs manquantes avec des valeurs médianes.
from sklearn.impute import SimpleImputer
imp = SimpleImputer(missing_values=np.nan, strategy='median')
data4 = pd.DataFrame(imp.fit_transform(data2))
data4
0 | 1 | 2 | 3 | |
---|---|---|---|---|
0 | 0.0 | 0.0 | 0.0 | 0.0 |
1 | 1.0 | 2.0 | 3.0 | 4.0 |
2 | 2.0 | 10.0 | 6.0 | 8.0 |
3 | 3.0 | 6.0 | 15.0 | 12.0 |
4 | 4.0 | 8.0 | 12.0 | 16.0 |
5 | 5.0 | 10.0 | 15.0 | 20.0 |
6 | 6.0 | 12.0 | 18.0 | 14.0 |
7 | 7.0 | 14.0 | 21.0 | 14.0 |
8 | 8.0 | 16.0 | 24.0 | 32.0 |
9 | 9.0 | 18.0 | 27.0 | 36.0 |
%matplotlib inline
import matplotlib.pyplot as plt
plt.plot(data4)
Comme la valeur moyenne, lors du remplissage avec la valeur médiane, elle peut devenir un type de remplissage artificiel en fonction du contenu des données.
most_frequent
Vous pouvez également renseigner les valeurs les plus fréquentes.
from sklearn.impute import SimpleImputer
imp = SimpleImputer(missing_values=np.nan, strategy='most_frequent')
data5 = pd.DataFrame(imp.fit_transform(data2))
data5
0 | 1 | 2 | 3 | |
---|---|---|---|---|
0 | 0.0 | 0.0 | 0.0 | 0.0 |
1 | 1.0 | 2.0 | 3.0 | 4.0 |
2 | 2.0 | 0.0 | 6.0 | 8.0 |
3 | 3.0 | 6.0 | 0.0 | 12.0 |
4 | 4.0 | 8.0 | 12.0 | 16.0 |
5 | 5.0 | 10.0 | 0.0 | 20.0 |
6 | 6.0 | 12.0 | 18.0 | 0.0 |
7 | 7.0 | 14.0 | 21.0 | 0.0 |
8 | 8.0 | 16.0 | 24.0 | 32.0 |
9 | 9.0 | 18.0 | 27.0 | 36.0 |
%matplotlib inline
import matplotlib.pyplot as plt
plt.plot(data5)
S'il n'y a pas de valeur la plus fréquente, elle semble être remplie avec la première valeur.
constant
Vous pouvez également définir un nombre prédéterminé et le remplir avec.
from sklearn.impute import SimpleImputer
imp = SimpleImputer(missing_values=np.nan, strategy='constant', fill_value=99)
data6 = pd.DataFrame(imp.fit_transform(data2))
data6
0 | 1 | 2 | 3 | |
---|---|---|---|---|
0 | 0.0 | 0.0 | 0.0 | 0.0 |
1 | 1.0 | 2.0 | 3.0 | 4.0 |
2 | 2.0 | 99.0 | 6.0 | 8.0 |
3 | 3.0 | 6.0 | 99.0 | 12.0 |
4 | 4.0 | 8.0 | 12.0 | 16.0 |
5 | 5.0 | 10.0 | 99.0 | 20.0 |
6 | 6.0 | 12.0 | 18.0 | 99.0 |
7 | 7.0 | 14.0 | 21.0 | 99.0 |
8 | 8.0 | 16.0 | 24.0 | 32.0 |
9 | 9.0 | 18.0 | 27.0 | 36.0 |
%matplotlib inline
import matplotlib.pyplot as plt
plt.plot(data6)
Eh bien, comme c'est contre nature!
KNNImputer
La classe KNNImputer remplit les valeurs manquantes à l'aide de l'approche k-Nearest Neighbours. Par défaut, la métrique de distance euclidienne nan_euclidean_distances, qui prend en charge les valeurs manquantes, est utilisée pour trouver les voisins les plus proches. Les caractéristiques des voisins sont soit moyennées uniformément, soit pondérées par la distance à chaque voisin. S'il manque une ou plusieurs entités à un échantillon, ses voisins peuvent différer selon les caractéristiques particulières entrées. Si le nombre de voisins disponibles est inférieur à n_neighbors et qu'il n'y a pas de distance définie par rapport à l'ensemble d'apprentissage, la moyenne de l'ensemble d'apprentissage pour cette fonctionnalité sera utilisée lors de la saisie. S'il y a au moins un voisin avec la distance définie, la moyenne pondérée ou non pondérée des voisins restants sera utilisée à l'entrée.
n_neighbors=2
Définissons explicitement le nombre de voisins à considérer à n_neighbors = 2.
from sklearn.impute import KNNImputer
imputer = KNNImputer(n_neighbors=2)
data7 = pd.DataFrame(imputer.fit_transform(data2))
data7
0 | 1 | 2 | 3 | |
---|---|---|---|---|
0 | 0.0 | 0.0 | 0.0 | 0.0 |
1 | 1.0 | 2.0 | 3.0 | 4.0 |
2 | 2.0 | 4.0 | 6.0 | 8.0 |
3 | 3.0 | 6.0 | 9.0 | 12.0 |
4 | 4.0 | 8.0 | 12.0 | 16.0 |
5 | 5.0 | 10.0 | 15.0 | 20.0 |
6 | 6.0 | 12.0 | 18.0 | 18.0 |
7 | 7.0 | 14.0 | 21.0 | 26.0 |
8 | 8.0 | 16.0 | 24.0 | 32.0 |
9 | 9.0 | 18.0 | 27.0 | 36.0 |
%matplotlib inline
import matplotlib.pyplot as plt
plt.plot(data7)
Il semble qu'il ne puisse pas être bien rempli s'il manque deux fois de suite.
default(n_neighbors=5)
Par défaut, il semble prendre en compte jusqu'à 5 voisins.
from sklearn.impute import KNNImputer
imputer = KNNImputer()
data8 = pd.DataFrame(imputer.fit_transform(data2))
data8
0 | 1 | 2 | 3 | |
---|---|---|---|---|
0 | 0.0 | 0.0 | 0.0 | 0.0 |
1 | 1.0 | 2.0 | 3.0 | 4.0 |
2 | 2.0 | 5.2 | 6.0 | 8.0 |
3 | 3.0 | 6.0 | 12.0 | 12.0 |
4 | 4.0 | 8.0 | 12.0 | 16.0 |
5 | 5.0 | 10.0 | 16.2 | 20.0 |
6 | 6.0 | 12.0 | 18.0 | 23.2 |
7 | 7.0 | 14.0 | 21.0 | 23.2 |
8 | 8.0 | 16.0 | 24.0 | 32.0 |
9 | 9.0 | 18.0 | 27.0 | 36.0 |
%matplotlib inline
import matplotlib.pyplot as plt
plt.plot(data8)
La façon de remplir la colonne D est relativement meilleure, mais au lieu de cela, elle a eu un léger effet négatif sur la façon de remplir les colonnes B et C.
Il n'y a probablement pas de moyen parfait de remplir les valeurs manquantes, alors considérez les caractéristiques de vos données et choisissez la méthode sous-optimale!
Recommended Posts