Estandarizar unidades de categorías con Scikit-Learn en Python

Alguna vez te pasó que estás elaborando un modelo predictivo de Machine Learning y al momento de cuantificar las categorías el modelo le da mayor relevancia a una que a otra, cuando tendría que haber ponderado a ambas por igual?

Pongamos un ejemplo. Supongamos que tenemos un data set con 3 columnas (edad, salario al que aspira el candidato, contratado). Donde la Edad es la edad de postulantes a una oferta de trabajo, el salario al que aspira es lo que pide por realizar ese trabajo y donde contratado indica si el postulante fue contratado o no (Si – No).

En ese caso vamos a tener una categoría edad de 2 dígitos y una categoría de salario de 4, 5 o más dígitos. En otros casos la diferencia puede ser más drástica aún, con lo que corremos el peligro de que nuestro modelo le otorgue mucha más importancia al salario que a la edad, y eso no es necesariamente exacto.

Para eso es que la biblioteca Scikit-Learn nos provee de una función llamada StandardScaler que permite unificar la ponderación de las variables.

Para importarla a nuestro proyecto en Python utilizamos la siguiente linea:

1
from sklearn.preprocessing import StandardScaler

La definimos:

1
scaler = StandardScaler()

Donde scaler es el nombre que le otorgamos a la función para invocarla. Para luego ejecutarla sobre las variables independientes que deseamos:

1
2
edad = scaler.transform(edad)
salario = scaler.transform(salario)

Allí hemos ejecutado la función StandardScaler() sobre las variables edad y salario que suponemos son dos arrays ya definidos con los datos de sus columnas correspondientes. En el ejemplo hice que se aplique y sobreescriba a la misma variable, pero bien podríamos definir una nueva si queremos mantener la variable original con la magnitud original.

Qué hizo este ejemplo? Lo que hace StandardScaler es establecer una media idéntica para todas las variables a las que se aplica. Y esa media va a ser siempre 0 y los valores de cada una de las filas del array van a asignarse en torno a él (si son mayores se van a expresar positivamente y si son menores se van a expresar negativamente).

Vamos a ver el ejemplo de la documentación oficial:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> from sklearn.preprocessing import StandardScaler
>>> data = [[0, 0], [0, 0], [1, 1], [1, 1]]
>>> scaler = StandardScaler()
>>> print(scaler.fit(data))
StandardScaler(copy=True, with_mean=True, with_std=True)
>>> print(scaler.mean_)
[ 0.5 0.5]
>>> print(scaler.transform(data))
[[-1. -1.]
[-1. -1.]
[ 1. 1.]
[ 1. 1.]]
>>> print(scaler.transform([[2, 2]]))
[[ 3. 3.]]

La linea 1 importa la librería del mismo modo que lo hicimos antes.

La linea 2 crea un array con los valores entre corchetes.

La linea 3 define la función StandardScaler() en la variable scaler.

La linea 4 imprime cuál es la media y el standard que se aplicará.

La linea 6 hace un print del atributo mean_ que muestra cuál es la media antes de aplicar la estandarización.

La linea 8 imprime la matriz transformada. Vemos que los 0’s se convirtieron en -1 y los 1 siguen siendo 1. Ya que la nueva media no es 0,5 sino 0 y que los valores se han estandarizado en base a ella.

Así es que en la línea 13 se imprime un nuevo valor [[2, 2]] al que se le aplica la estandarización y el resultado es [[ 3. 3.]].

 

Autor entrada: Farid

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *