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:
-
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.
-
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_length y sepal_width:
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()
Ahora importemos el escalador, instanciémoslo y transformemos el dataset original (las cuatro características predictivas):
Podemos reconstruir el DataFrame original con los nuevos valores y visualizar las primeras muestras:
transformed_iris["species"] = iris["species"]
transformed_iris.columns = iris.columns
Si mostramos la información estadística del resultado, comprobaremos que, efectivamente, la mediana toma el valor 0 en las cuatro características:
Llevemos las dos primeras características predictivas a un diagrama de dispersión para visualizar la distribución de los datos transformados:
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()