La eliminación de muestras o características hace referencia a la eliminación completa de filas o columnas de nuestras tablas que cumplan cierta condición (como incluir un número de nulos mayor que un cierto umbral). Esto puede ser una técnica útil para mejorar el rendimiento del modelo y reducir el ruido en los datos de entrada, aunque es importante tener en cuenta que la eliminación de muestras o características debe realizarse cuidadosamente para evitar la pérdida de información importante. Antes de eliminar cualquier muestra o característica, es recomendable analizar la distribución de valores nulos en el conjunto de datos y comprender la relevancia y el impacto que la eliminación tendría en el modelo a entrenar.
La librería Pandas incluye el método .dropna() asociado a Series y DataFrames. Básicamente, nos ofrece tres opciones:
- Eliminar filas o columnas que contengan algún nulo
- Eliminar filas o columnas cuyos valores sean todos nulos, o
- Eliminar filas o columnas que no contengan un número mínimo de valores no nulos
Este comportamiento se controla mediante los parámetros how y thresh. Así, para eliminar del dataset Titanic las filas que incluyan al menos un nulo (y almacenar el resultado en la variable t), el código sería el siguiente:
Los valores asignados a los parámetros axis y how son los valores por defecto, por lo que no hubiese sido necesario incluirlos (se hecho solo por motivos pedagógicos).
El dataset resultante tiene el siguiente tamaño:
Obsérvese que el número de filas resultantes es mucho menor que el original:
Si deseásemos eliminar aquellas características predictivas que no tengan un mínimo de, por ejemplo, 750 valores no nulos, podríamos conseguirlo de la siguiente forma:
Ahora, el tamaño del DataFrame resultante sería:
Vemos cómo se han eliminado dos columnas. Ésta son age y deck, que vimos en la sección anterior que incluían un número elevado de nulos. Podemos llegar a esta conclusión realizando una inspección visual del número de valores no nulos por columna:
pclass 891
sex 891
age 714
sibsp 891
parch 891
fare 891
embarked 889
class 891
who 891
adult_male 891
deck 203
embark_town 889
alive 891
alone 891
dtype: int64
O recurriedo al método .info() del DataFrame:
RangeIndex: 891 entries, 0 to 890
Data columns (total 15 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 survived 891 non-null int64
1 pclass 891 non-null int64
2 sex 891 non-null object
3 age 714 non-null float64
4 sibsp 891 non-null int64
5 parch 891 non-null int64
6 fare 891 non-null float64
7 embarked 889 non-null object
8 class 891 non-null category
9 who 891 non-null object
10 adult_male 891 non-null bool
11 deck 203 non-null category
12 embark_town 889 non-null object
13 alive 891 non-null object
14 alone 891 non-null bool
dtypes: bool(2), category(2), float64(2), int64(4), object(5)
memory usage: 80.7+ KB
Comprobamos que, efectivamente, las dos columnas mencionadas no alcanzan los 750 valores no nulos.