Blogs

Warnings about normalizing data
  • Santiago Morante
  • 4075 Views
  • 13 Comments
  • Algorithms . Algoritmos . Analítica Avanzada . Big Data . Blog Synergic . Data . Data Normalization . Data Science . datos . Machine Learning . Normalización de Datos .

For many machine learning algorithms, normalizing the data of analysis is a must. A supervised example would be neural networks. It is known that normalizing the input data to the networks improve the results. If you don’t believe me it’s ok (no offense taken), but you may prefer to believe Yann Le Cunn (Director of AI Research in Facebook and founding father of convolutional networks) by checking section 4.3 of this paper. You can catch up the idea with the first sentence of the section: Convergence [of backprop] is usually faster if the average of each input variable over the training set is close to zero. Among other things, one reason is that when the neural network tries to correct the error performed in a prediction, it updates the weights in the network by an amount proportional to the input vector, which is bad if input is large.

Another example, in this case of an unsupervised algorithm, is K-means. This algorithms tries to group data in clusters so that the data in each cluster shares some common characteristics. This algorithm performs two steps:

  1. Assign centers of clusters in some point in space (random at first time, calculating the centroid of each cluster the rest of times)
  2. Associate each point to the closest center.

In this second step, the distances between each point and the centers are calculated usually as a Minkowski distance (commonly the famous Euclidean distance). Each feature weights the same in the calculation, so features measured in high ranges will influence more than those measured in low ranges e.g. the same feature would influence more in the calculation if measured in millimeters than in kilometers (because the numbers would be bigger). So the scale of the features must be in a comparable range.

Now you now that normalization is important, let us see what options we have to normalize our data.

A couple of ways to normalize data

Feature scaling

Each feature is normalized within the limits of the feature.

Blog 1

This is a common technique used to scale data into a range. But the problem when normalizing each feature within its empiricallimits (so that, the maximum and the minimum found in this column) is that noise may be amplified.

One example: imagine we have internet data from a particular house and we want to make a model to predict something (maybe the price to charge). One of our hypothetical features could be the bandwidth of the fiber optic connection. Suppose the house purchased a 30Mbit internet connection, so the bit rate is approximatelly the same every time we measure it (lucky guy).

Blog 19 1

It looks like a pretty stable connection right?. As the bandwidth is measured in a scale far from 1, let us scale it between 0 and 1 using our feature scaling method (sklearn.preprocessing.MinMaxScaler).

Blog 19 2

After the scaling, our data is distorted. What it was an almost flat signal, now looks like a connection with a lot of variation. This fact tells us that feature scaling is not adequate to nearly constant signals.

Standard scaler

Next try. Ok, scaling in a range didn’t work for a noisy flat signal, but what about standardizing the signal?. Each feature woulde be normalize by:

Blog 4

This could work on the previous case, but don’t open the bottle yet. Mean and standard deviation are very sensitive to outliers (small demonstration). This means that outliers may attenuate the non-outlier part of the data.

Now imagine we have data about how often the word “hangover” is posted on Facebook (for real). The frequency is like a sine wave, with lows during the weekdays and highs on weekends. It also has big outliers after “Halloween” and similar dates. We have idealized this siutation with the next dataset (3 parties in 50 days. Not bad).

Blog 19 3

Despite having outliers, we would like to be able to distinguish clearly that there exist a measurable difference between weekdays and weekends. Now we want to predict something (that’s our business) and we would like to preserve the fact that during the weekends the values are higer, so we think of standardizing the data (sklearn.preprocessing.StandardScaler). We check the basic parameters of standardization.

Blog 19 4

What happened? First, we were not able to scale the data between 0 and 1. Second, we now have negative numbers, which is not a dead end, but complicates the analysis. And third, now we are not able to clearly distinguish the differences between weekdays and weekend (all close to 0), because outliers have interfered with the data.

From a very promising data, now we have an almost irrelevant one. One solution to his situation could be to preprocess the data and eliminate the outliers (things change with outliers).

 Scaling over the maximum value

The next idea that comes to mind is to scale the data by dividing it by its maximum value. Let see how it behaves with our datasets (sklearn.preprocessing.MaxAbsScaler).

Blog 19 5

Blog 19 6

Good!, our data is in range 0,1… But, wait! what happended with the differences between weekdays and weekends?, they are all close to zero!. As in the case of standardization, outliers flatten the differences among the data when scaling over the maximum.

 Normalizer

The next tool in the box of the data scientist is to normalize samples individually to unit norm (check this if you don’t remember what a norm is).

Blog 19 7

This data rings a bell in your head right? let’s normalize it (here by hand, but also available as sklearn.preprocessing.Normalizer).

Blog 19 8

At this point of the post, you know the story, but this case is worse than the previous ones. In this case we don’t even get the highest outlier as 1, it is scaled to 0.74, which flattens the rest of the data even more.

 Robust scaler

The last option we are going to evaluate is Robust scaler. This method removes the median and scales the data according to the Interquartile Range (IQR). It is supposed to be robust to outliers.

Blog 19 9

Blog 19 10

You may not see it in the plot (but you can see it in the output), but this scaler introduced negative numbers and did not limit the data to the range [0, 1]. (ok, I quit).

There are others methods to normalize your data (based on PCA, taking into accounts possible physical bounds, etc), but now you know how to evaluate wheter your algorithm is going to influence negatively in your data.

 Things to remember (basically: know your data)

Normalization may (possibly [dangerously]) distort your data.

There is no ideal method to normalize or scale all the dataset. So it is the job of the data scientist to know how the data is distributed, know the existence of outliers, check ranges, know the physical limits (if any) and so on. With this knowledge, one can select the best technique to normalize the feature, probably using a different method for each feature.

If you know nothing about your data, I would recommend you to first check the existence of outliers (remove them if neccesary) and then scale over the maximum of each feature (while crossing your fingers).

Expert Data Scientist at @synergicpartner | PhD in Robotics/Machine Learning. Follow me on Github (smorante)

13 COMMENTS
  1. Lucia
    Friday June 16th, 2017 Reply

    Estimado, estoy haciendo un análisis discriminante, para esta técnica se suele Estandarizar o normalizar los datos (restando media y dividiendo entre el desvío estándar)
    Sin embargo una de las variables a incorporar es la proporción de urbanización considerando distintas ciudades del mundo, y por tanto distintos denominadores, yo entiendo que en ese caso estandarizar es incorrecto. Estoy en lo cierto???

    ejemplo

    pais proporción de contaminación

    Argentia (45/300)
    Italia (90/250)
    Chipre (70/180)

    Leí su trabajo “Precauciones a la hora de normalizar datos en Data Science” y por eso lo estoy consultando.

    Desde ya mil gracias.

    Cordiales saludos Lucia

  2. Santiago Morante
    Tuesday June 20th, 2017 Reply

    Hola Lucia,

    Muchas gracias por tu interés en el artículo.

    En el caso que mencionas, la variable ya está, en si misma, normalizada, ya que representa una proporción (un porcentaje). Esa columna en principio no haría falta normalizarla para los análisis.

    Sin embargo, cabe recordar, que si quieres hacer una análisis junto con otras variables, éstas tienen que poder compararse, teniendo rango parecidos. Por ejemplo, si quieres comparar la proporción de contaminación (que se mide entre 0 y 1), con el número de coches que circulan por la carretera más cercana por hora (que puede ser del orden de miles), tendrás que transformar la variable “número de coches” para que se mida en un rango parecido a “proporción de contaminación”.

    Saludos

  3. LUIS
    Sunday April 1st, 2018 Reply

    Muy buen post Santiago. Gracias,

  4. SERGIO MARIN
    Sunday April 1st, 2018 Reply

    Estimado Santiago buenos días desde Colombia. Primero que todo darte gracias por este articulo, me ha aclarado muchas dudas y ha sido supremamente claro con los conceptos. Tengo una pregunta, creo entender que de todos los métodos explicados tanto el MinMax Scaler, el Standar Scaler y el Max Abs Scaler no transforman la forma o la distribución de la data, solo cambian su escala a diferencia que Normalizar si cambia la distribución de la data, si esto es así, ¿Robust Scale cambia la distribución de la data o solo cambia la escala de la misma?.

    Y tengo la misma duda con otros métodos como el Quantile transformer.

    Mil gracias por tu respuesta,

    1. Santiago Morante
      Thursday April 5th, 2018 Reply

      Hola Sergio,

      El escalado de variables usando MinMax scaler si modifica la forma de los datos. Si ves el ejemplo del post se puede ver como la distribución era casi uniforme y después de usar MinMax scaler pasa a ser una señal ruidosa. Otros escalados como Standard scaler no modifican la distribución, pues simplemente la desplazan (al restar la media) y la escalan (al dividir por una constante).

      En el caso de Robust scaler lo que el algoritmo hace es restar la mediana (sólo este paso no afectaría a la forma) y luego escala los datos con respecto al rango intercuartilico (IQR). Es este segundo apartado el que puede distorsionar tus datos. Al igual que en el caso de MinMax scaler, si la señal es muy plana, tu IQR será muy pequeño, luego, al dividir cada punto de la señal por el IQR las variaciones serán grandes, distorsionando la señal original.

      Para probar esto que te cuento, lo he implementado en python y he comprobado que, efectivamente, Robust scaler distorsiona señales quasi constantes. Te adjunto el código por si quieres comprobarlo. Quantile transformer parece que también modifica la señal original (te adjunto este enlace con ejemplos: http://scikit-learn.org/stable/auto_examples/preprocessing/plot_all_scaling.html).

      Saludos

      ## Python

      # Señal original
      import numpy as np
      import matplotlib.pyplot as plt

      #initialize the seed
      np.random.seed(314)

      # generate 50 numbers between 0 and 30
      datasetFlat = np.random.rand(50) + 30

      #plot them
      x = np.linspace(0, len(datasetFlat))
      plt.plot(x, datasetFlat, ‘-‘, linewidth=2)

      #force limits on the figure
      axes = plt.gca()
      axes.set_ylim([0,50])

      # Señal normalizada
      from sklearn.preprocessing import RobustScaler
      #create scaler
      scaler = RobustScaler()

      #apply scaler
      datasetSinOutlierRobust = scaler.fit_transform(np.array(datasetFlat).reshape(-1,1))

      #plot
      plt.plot(x, datasetSinOutlierRobust, ‘-‘, linewidth=2, color=”orange”)

  5. Julio Charry
    Thursday April 26th, 2018 Reply

    De antemano Gracias.
    Para comparar medidas entre diferentes indicadores financieros se esta normalizando los diferentes indicadores de medidas con la formula MinMax Scaler, que se comporta bien para los indicadores con valores positivos, sin embargo cuando se tienen valores negativos como en el caso del indice financiero “Riesgo Financiero” que puede tomar valor cero o negativos se tiene dificulta para comparar puesto que cero es un buen desempeño. Por favor su orientación.
    Saludo Cordial. Julio .

  6. Santiago Morante
    Friday April 27th, 2018 Reply

    Estimado Julio,

    No entiendo exactamente cúal es el problema en la comparación. Si lo que quieres es normalizar tus variables, que contienen número negativos, entre -1 y 1, te remito a esta entrada que te puede ayudar:

    https://stats.stackexchange.com/questions/178626/how-to-normalize-data-between-1-and-1

    Con la solución que proponen ahí, un cero real no correspodnerá a un cero transformado, lo que puede que sea un problema en tu caso.

    Mi recomendación, si quieres conservar el cero como tal, es normalizar los valores positivos entre el máximo positivo y normalizar los valores negativos entre el máximo negativo. Con esto consigues una escala en la que el cero sigue significando lo mismo.

    Saludos cordiales

  7. Roberto González
    Friday May 18th, 2018 Reply

    Hola buen día estimado, quería consultarte sobre cómo normalizar variables cuando ellas llevan muchos ceros por falta de información. Qué puedo hacer cuando no quiero descartar ningún registro.

    1. Santiago Morante
      Friday June 8th, 2018 Reply

      Hola, Roberto.

      Para encontrar una solución adecuada a tu problema, tienes que preguntarte primero una serie de cuestiones: ¿Por qué están a cero esos valores? ¿Es porque es el valor por defecto cuando no hay datos o es un valor válido para esa variable?.

      Supongamos primero que es un valor por defecto para indicar “vacío” o “nulo”, en este caso, existen varias alternativas a tu problema:

      1. Puedes ignorar los nulos y realizar la transformación que consideres adecuada. Después imputas los valores a la media de los resultados normalizados y así no afectarán demasiado.

      2. Puedes, por otra parte, imputar los valores cero a un valor fijo, por ejemplo la media, y después normalizar.

      Si el cero, en cambio, es un valor adecuado y factible en tu variable, no sería justo tratarlo aparte. Lo recomendable sería normalizarlo junto al resto de valores. Lo importante en este caso es encontrar el método de normalización adecuado.

      Saludos cordiales

  8. Victor Villacorta
    Thursday July 5th, 2018 Reply

    Exxelente articulo, consulta.. Habra un metodo que mida la variacion de la data pos normalizado ??

  9. Santiago Morante
    Wednesday July 18th, 2018 Reply

    Habría que definir antes de qué estamos hablando cuando hablamos de variación, para poder elaborar una respuesta

  10. Gabriel Diaz Padilla
    Friday August 3rd, 2018 Reply

    Que pasa si estandarizo con respecto al valor maximo x(i)/max(x) es correcto, ya que obtengo valores en la escala 0-1
    gracias

    1. Santiago Morante
      Wednesday September 5th, 2018 Reply

      Si es correcto o no dependerá de tu problema a resolver. Dividir por el máximo tiene la ventaja de no modificar la forma de la señal, pero a cambio, si tus datos tienen valores extremos, la señal se aplanará, con lo que perderás información.

LEAVE A COMMENT

Featured customer