1
votes

Comment faire une imputation correcte en Python / Sklearn

J'ai les données suivantes ci-dessous. Remarquez que l'âge a Nan. Mon objectif est d'imputer correctement toutes les colonnes.

import pandas as pd
import numpy as np

#https://www.kaggle.com/shivamp629/traincsv/downloads/traincsv.zip/1
data = pd.read_csv("train.csv")

data2 = data[['PassengerId', 'Survived','Pclass','Age','SibSp','Parch','Fare']].copy()

from sklearn.preprocessing import Imputer

fill_NaN = Imputer(missing_values=np.nan, strategy='mean', axis=1)
data2_im = pd.DataFrame(fill_NaN.fit_transform(data2), columns = data2.columns)

data2_im

J'ai un code fonctionnel qui impute toutes les colonnes. Les résultats sont ci-dessous. Les résultats semblent problématiques.

+----+-------------+----------+--------+-----------+-------+-------+---------+
| ID | PassengerId | Survived | Pclass |    Age    | SibSp | Parch |  Fare   |
+----+-------------+----------+--------+-----------+-------+-------+---------+
|  0 | 1.0         | 0.0      | 3.0    | 22.000000 | 1.0   | 0.0   | 7.2500  |
|  1 | 2.0         | 1.0      | 1.0    | 38.000000 | 1.0   | 0.0   | 71.2833 |
|  2 | 3.0         | 1.0      | 3.0    | 26.000000 | 0.0   | 0.0   | 7.9250  |
|  3 | 4.0         | 1.0      | 1.0    | 35.000000 | 1.0   | 0.0   | 53.1000 |
|  4 | 5.0         | 0.0      | 3.0    | 35.000000 | 0.0   | 0.0   | 8.0500  |
|  5 | 6.0         | 0.0      | 3.0    | 2.909717  | 0.0   | 0.0   | 8.4583  |
+----+-------------+----------+--------+-----------+-------+-------+---------+

Mon code est ci-dessous:

+----+-------------+----------+--------+------+-------+-------+---------+
| ID | PassengerId | Survived | Pclass | Age  | SibSp | Parch |  Fare   |
+----+-------------+----------+--------+------+-------+-------+---------+
|  0 |           1 |        0 |      3 | 22.0 |     1 |     0 | 7.2500  |
|  1 |           2 |        1 |      1 | 38.0 |     1 |     0 | 71.2833 |
|  2 |           3 |        1 |      3 | 26.0 |     0 |     0 | 7.9250  |
|  3 |           4 |        1 |      1 | 35.0 |     1 |     0 | 53.1000 |
|  4 |           5 |        0 |      3 | 35.0 |     0 |     0 | 8.0500  |
|  5 |           6 |        0 |      3 | NaN  |     0 |     0 | 8.4583  |
+----+-------------+----------+--------+------+-------+-------+---------+

C'est bizarre l'âge est 2,909717. Existe-t-il une façon appropriée de procéder à une imputation moyenne simple? Je suis d'accord pour faire colonne par colonne mais je ne suis pas clair avec la syntaxe / l'approche. Merci pour toute aide.


0 commentaires

3 Réponses :


1
votes

Le problème est que vous utilisez le mauvais axe. Le code correct doit être:

fill_NaN = Imputer(missing_values=np.nan, strategy='mean', axis=0)

Notez le axis=0.


0 commentaires

1
votes

La racine de votre problème est cette ligne:

fill_NaN = Imputer(missing_values=np.nan, strategy='median', axis=0)

, ce qui signifie que vous faites la moyenne sur les lignes (oranges et pommes).

Essayez de la remplacer par:

fill_NaN = Imputer(missing_values=np.nan, strategy='mean', axis=0) # axis=0

et vous aurez le comportement attendu.

strategy = 'median' pourrait être encore mieux, car il est robuste contre les valeurs aberrantes:

fill_NaN = Imputer(missing_values=np.nan, strategy='mean', axis=1)


1 commentaires

merci pour l'aide complète. Vous avez raison, la moyenne arithmétique n'est pas bonne.



1
votes

Essayez comme

data2.fillna(data2.mean())

ou

fill_NaN = Imputer(missing_values=np.nan, strategy='mean', axis=0)


0 commentaires