web-dev-qa-db-fra.com

Imputation de valeur manquante en python avec KNN

J'ai un jeu de données qui ressemble à ceci

1908    January 5.0 -1.4
1908    February    7.3 1.9
1908    March   6.2 0.3
1908    April   NaN   2.1
1908    May NaN   7.7
1908    June    17.7    8.7
1908    July    NaN   11.0
1908    August  17.5    9.7
1908    September   16.3    8.4
1908    October 14.6    8.0
1908    November    9.6 3.4
1908    December    5.8 NaN
1909    January 5.0 0.1
1909    February    5.5 -0.3
1909    March   5.6 -0.3
1909    April   12.2    3.3
1909    May 14.7    4.8
1909    June    15.0    7.5
1909    July    17.3    10.8
1909    August  18.8    10.7  

Je veux remplacer le NaNs en utilisant KNN comme méthode. J'ai regardé la classe sklearns Imputer mais elle ne supporte que l'imputation moyenne, médiane et mode. Il y a une demande de fonctionnalité ici mais je ne pense pas que cela ait été mis en œuvre à partir de maintenant. Des idées sur la façon de remplacer les NaNs des deux dernières colonnes avec KNN?

Edit: Comme je dois exécuter des codes sur un autre environnement, je n'ai pas le luxe d'installer des paquets. sklearn, pandas, numpy et d’autres forfaits standard sont les seuls que je puisse utiliser.

15
Clock Slave

Le paquet fancyimpute prend en charge ce type d'imputation, à l'aide de l'API suivante:

from fancyimpute import KNN    
# X is the complete data matrix
# X_incomplete has the same values as X except a subset have been replace with NaN

# Use 3 nearest rows which have a feature to fill in each row's missing features
X_filled_knn = KNN(k=3).complete(X_incomplete)

Voici les imputations supportées par ce package:

• SimpleFill: remplace les entrées manquantes par la moyenne ou la médiane de chaque colonne.

• KNN: imputations du voisin le plus proche qui pondère les échantillons à l'aide de la méthode différence quadratique moyenne sur les entités pour lesquelles deux rangées ont données observées.

• SoftImpute: achèvement de la matrice par seuillage progressif itératif de la SVD décompositions. Inspiré du paquet softImpute pour R, qui est basé sur des algorithmes de régularisation spectrale pour l'apprentissage de grande taille Matrices incomplètes de Mazumder et. Al.

• IterativeSVD: achèvement de la matrice par SVD de rang inférieur itératif décomposition. Devrait être similaire à SVDimpute à partir de valeur manquante méthodes d'estimation des puces à ADN par Troyanskaya et. Al.

• MICE: réimplémentation de l'imputation multiple par des équations chaînées.

• MatrixFactorization: Factorisation directe de la matrice incomplète en U et V de bas rang, avec une pénalité de faible densité N1 sur les éléments de U et une pénalité de L2 sur les éléments de V. Résolu par descente de gradient.

• NuclearNormMinimization: implémentation simple d’Exact Matrix Achèvement via l'optimisation convexe par Emmanuel Candes et Benjamin Recht en utilisant cvxpy. Trop lent pour les grandes matrices.

• BiScaler: Estimation itérative de la moyenne des rangées/colonnes et de la norme déviations pour obtenir une matrice doublement normalisée. Pas de garantie de converger mais fonctionne bien dans la pratique. Tiré de l'achèvement de la matrice et du rang bas SVD via les moindres carrés en alternance rapide.

14
Miriam Farber

Cette demande d'extraction à consulter ajoute le support de KNN. Vous pouvez en obtenir le code - https://github.com/scikit-learn/scikit-learn/pull/9212

2
Omri

l’imputation KNN de fancyimpute ne prend plus en charge la fonction complete comme le suggère une autre réponse, nous devons maintenant utiliser fit_transform

# X is the complete data matrix
# X_incomplete has the same values as X except a subset have been replace with NaN
# Use 3 nearest rows which have a feature to fill in each row's missing features

X_filled_knn = KNN(k=3).fit_transform(X_incomplete)    

référence https://github.com/iskandr/fancyimpute

0
Rajshekar Reddy