Eliminación de muestras o de características

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 howthresh. 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:

t = titanic.dropna(axis = 0, how = "any")

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:

t.shape
(182, 15)

Obsérvese que el número de filas resultantes es mucho menor que el original:

titanic.shape
(891, 15)

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:

t = titanic.dropna(axis = 1, thresh = 750)

Ahora, el tamaño del DataFrame resultante sería:

t.shape
(891, 13)

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:

len(titanic) - titanic.isna().sum()
survived       891
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:

titanic.info()
<class 'pandas.core.frame.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.