[PYTHON] Remplissez les valeurs manquantes avec Scikit-learn impute

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.

Créer des données de test

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)

Imputer_4_1.png

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)

Imputer_7_1.png

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)

Imputer_10_1.png

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)

Imputer_13_1.png

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)

Imputer_16_1.png

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)

Imputer_19_1.png

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)

Imputer_22_1.png

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.

Résumé

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

Remplissez les valeurs manquantes avec Scikit-learn impute
Identifiez les valeurs aberrantes avec le classificateur de forêt aléatoire de scikit-learn
Scikit-learn DecisionTreeClassifier avec des valeurs de type datetime
Regrouper les écoles représentatives à l'été 2016 avec scikit-learn
"Kaggle memorandum" Rechercher / supprimer les valeurs manquantes
Isomap avec Scikit-learn
Supprimer les lignes avec des valeurs arbitraires dans pandas DataFrame
Clustering avec scikit-learn (1)
Clustering avec scikit-learn (2)
PCA avec Scikit-learn
Une histoire remplie de valeurs absolues de numpy.ndarray
kmeans ++ avec scikit-learn
(Suite) Essayez d'autres fonctions de distance avec kmeans dans Scikit-learn
SVM multi-classes avec scikit-learn
Clustering avec scikit-learn + DBSCAN
Remplissez 5 équipes égales
Échange de valeurs en Python
DBSCAN (clustering) avec scikit-learn
Installez scikit.learn avec pip
Calculer tf-idf avec scikit-learn
[Django] Comment donner des valeurs d'entrée à l'avance avec ModelForm
Prétraitement dans l'apprentissage automatique 3 Données de valeur manquante / aberrante / de déséquilibre