RobustScaler

El escalador sklearn.preprocessing.RobustScaler aplica un escalado a las características de forma que sea más robusto a los valores atípicos o outliers.

En concreto, RobustScaler realiza dos pasos principales:

  1. Calcula la mediana y el rango intercuartil (IQR) de cada característica en el conjunto de datos (el IQR es la diferencia entre el percentil 75 y el percentil 25 de los datos). La mediana y el IQR son medidas resistentes a los valores atípicos, lo que significa que no se ven afectados por posibles valores extremos que puedan existir en los datos.

  2. Utiliza la mediana y el IQR de cada característica para escalar los datos. En particular, RobustScaler transforma cada valor de la característica restando la mediana de la característica y dividiendo por el IQR de la característica.

Apliquémoslo al dataset Iris. Para poder visualizar los datos originales, fijémonos en apenas dos de las características: sepal_lengthsepal_width:

fig, ax = plt.subplots(figsize = (7, 7))
ax.set_aspect("equal")
scatter = ax.scatter(
    x = iris["sepal_length"], y = iris["sepal_width"],
    c = iris.species.astype("category").cat.codes, zorder = 2, edgecolor = "#999999",
    cmap = ListedColormap(["#E67332", "#FADB15", "#4193E5"])
)
ax.set_title("Sepal length vs. Sepal width")
ax.set_xlabel("Sepal length (cm)")
ax.set_ylabel("Sepal width (cm)")
ax.legend(
    handles = scatter.legend_elements()[0],
    labels = list(iris.species.unique())
)
ax.grid(color = "#EEEEEE", zorder = 1, alpha = 0.9)
plt.show()

RobustScaler

Ahora importemos el escalador, instanciémoslo y transformemos el dataset original (las cuatro características predictivas):

from sklearn.preprocessing import RobustScaler
scaler = RobustScaler()
transformed_iris = scaler.fit_transform(iris.iloc[:, :4])

Podemos reconstruir el DataFrame original con los nuevos valores y visualizar las primeras muestras:

transformed_iris = pd.DataFrame(transformed_iris)
transformed_iris["species"] = iris["species"]
transformed_iris.columns = iris.columns
transformed_iris.head()

RobustScaler

Si mostramos la información estadística del resultado, comprobaremos que, efectivamente, la mediana toma el valor 0 en las cuatro características:

transformed_iris.describe()

RobustScaler

Llevemos las dos primeras características predictivas a un diagrama de dispersión para visualizar la distribución de los datos transformados:

fig, ax = plt.subplots(figsize = (7, 7))
ax.set_aspect("equal")
scatter = ax.scatter(
    x = transformed_iris["sepal_length"], y = transformed_iris["sepal_width"],
    c = transformed_iris.species.astype("category").cat.codes, zorder = 2, edgecolor = "#999999",
    cmap = ListedColormap(["#E67332", "#FADB15", "#4193E5"])
)
ax.set_title("Sepal length vs. Sepal width")
ax.set_xlabel("Sepal length (cm)")
ax.set_ylabel("Sepal width (cm)")
ax.legend(
    handles = scatter.legend_elements()[0],
    labels = list(iris.species.unique())
)
ax.grid(color = "#EEEEEE", zorder = 1, alpha = 0.9)
plt.show()

RobustScaler