Come sostituire i dati mancanti in un dataset con Python
Per sostituire i dati mancanti in un dataset, uso le classi impute della libreria scikit learn del linguaggio python.
Un esempio pratico
Importo la libreria numpy
import numpy as np
Creo un dataset di prova contenente cinque esempi e due colonne
X = [
[10, np.nan],
[np.nan, 'y'],
[15, 'n'],
[10, 'n'],
[np.nan, np.nan],
]
I dati np.nan sono i dati mancanti (nan significa not a number).
Ora importo la classe ColumnTransformer di scikit-learn per modificare le colonne del dataset.
from sklearn.compose import ColumnTransformer
Poi importo la classe SimpleImputer per sostituire i dati sempre da scikit-learn.
from sklearn.impute import SimpleImputer
Creo un trasformatore da applicare alla prima colonna
Uso la classe SimpleImputer con la strategia 'most frequent' per sostituire il dato mancante con il dato più frequente nella feature (prima colonna).
tr = [
['nome qualsiasi', SimpleImputer(strategy='most_frequent'), [0]]
]
ct=ColumnTransformer(tr, remainder='passthrough')
Per applicare l'imputer a entrambe le colonne basta sostituire [0] con [0,1].
Se non avessi indicato la strategia, la classe avrebbe usato di default la strategia della media aritmetica ossia strategy="mean".
Nota. Altre strategie sono "median" (mediana) e "constant" che permette di sostituire il dato mancante con una determinata costante numerica o alfanumerica indicata nel parametro fill_value.
Uso il trasformatore per modificare il dataset
X = ct.fit_transform(X)
Infine stampo il dataset dopo la modifica per vedere cos'è successo.
print(X)
Il risultato è il seguente:
[[10 nan]
[10 'y']
[15 'n']
[10 'n']
[10 nan]]
L'algoritmo ha sostituito il secondo e il quinto np.nan della prima colonna con il dato più frequente (10) della prima colonna.
E per applicare imputer diversi a colonne differenti?
Per applicare un imputer mi basta aggiungere un secondo metodo di trasformazione per ogni feature (colonna) o gruppi di feature.
tr = [
['nome qualsiasi 1', SimpleImputer(strategy='median'), [0]],
['nome qualsiasi 2', SimpleImputer(strategy='most_frequent'), [1]],
['nome qualsiasi 3', SimpleImputer(strategy='constant'), fill_value='no', [2]]
]
Ogni imputer deve essere separato dal successivo tramite una virgola.
E così via.