¿Cómo hacer una transformación de variables?

Autor: | Última modificación: 16 de abril de 2024 | Tiempo de Lectura: 3 minutos
Temas en este post: ,

Algunos de nuestros reconocimientos:

Premios KeepCoding

La transformación de variables es un proceso que se realiza para procurar mantener una distribución normal en los histogramas que dan como resultado en algún ejercicio de aplicación.

En este post veremos un ejercicio que nos enseña cómo realizar una transformación de variables.

Transformación de variables: ejercicio

Tenemos un dataset con las siguientes variables:

  • diagnosis
  • radius mean
  • texture mean
  • perimeter mean
  • area mean
  • smoothness mean
  • compactness mean
  • concavity mean
  • concave points mean
  • symmetry mean
  • fractal dimension mean
  • radius se
  • texture se
  • perimeter se area se
  • smoothness se
  • compactness se
  • concavity se
  • concave points se
  • symmetry se
  • fractal dimension se
  • radius worst
  • texture worst
  • perimeter worst
  • area worst
  • smoothness worst
  • compactness worst
  • concavity worst
  • concave points worst
  • symmetry worst
  • fractal dimension worst

Lo primero que haremos será echar un vistazo a todos los datos contenidos en el dataset, incluyendo las variables. Como todos los datos son numéricos, un histograma puede ser una buena opción:

data = pd.read_table ('./data/breast_cancer.csv', sep = ' , ', decimal = ' , ')
data = data.drop (['id', 'Unnamed: 32'], axis = 1)
data ['diagnosis'] = np.where (data ['diagnosis'] == 'M', 1, 0)

#Pintamos histogramas para cada clase
plt.figure (figsize = (20, 20))

idx_0 = data ['diagnosis'] == 0
idx 1 = data ['diagnosis'] == 1

for 1, feature in enumerate (data.columns.drop (['diagnosis'])):
plt.subplot(6, 5, 1 + 1)
plt.hist (data.loc [idx_0, feature], density = 0, alpha = 0.75, label = 'y = 0')
plt.hist (data.loc [idx_1, feature], density = 0, facecolor = 'red', alpha = 0.75, label ='y = 1')
plt.legend ()
plt.title (feature)

plt.show ()

Lo que haremos en este ejercicio de transformación de variables será leer, eliminar y convertir a numérico con la línea de código data [‘diagnosis’] = np.where (data [‘diagnosis’] == ‘M’, 1, 0). Por último, pintamos histogramas para cada clase.

A continuación, los histogramas que han surgido:

Transformación de variables

A la vista de los histogramas anteriores, podemos hacer transformaciones sobre las variables para que el histograma se parezca más a una gaussiana. Esto se conoce como transformación de variables y no modifica el resultado de la clasificación. Cuando tenemos distribuciones asimétricas (como por ejemplo area_se), podemos aplicar una transformación logarítmica o raíz cuadrada

Ten en cuenta que para transformar una variable hay que conocer el margen dinámico de la misma (no podemos aplicar logaritmos a valores negativos). Es decir, si vamos a hacer una transformación logarítmica, tenemos que estar seguros de que podemos hacer esa transformación de variables sobre esa variable en específico.

Lo que tenemos que hacer antes de cualquier cosa es la comprobación de que no existe ninguna variable negativa, porque en caso contrario, además de que el logaritmo no va a funcionar, el resultado va a explotar debido a que no se puede trabajar con valores negativos.

Así pues, tendríamos que agregar ese check a nuestro algoritmo, de forma que si llega una instancia nueva que tiene un valor negativo porque hay un error, se pueda rechazar, es decir, descartar esa instancia.

Lo que haremos aquí es aplicar una transformación de variables logarítmica a radius_se, perimeter_se, area_se y compactness_se.

¿Cómo hacer una transformación de variables?

Existen otras variables, como fractal_dimension_se, sobre las que podríamos trabajar, pero por ahora solo abordaremos las señaladas en los recuadros verdes de la imagen.

Aplicamos la transformación de variables y volvemos a pintar logaritmos en el histograma. Luego, observamos cómo las variables van a ser mucho más normales, es decir, van a seguir una distribución gaussiana:

features to transform = ['radius_se', 'perimeter_se', 'area_se', 'compactness_se']

for feature in features_to_transform:
data [feature] = data [feature].apply (lambda x: np.log10 (x))
#Transformación de variables
#Pintamos de nuevo histogramas para cada clase
plt.figure (figsize = (20, 20))

idx_0 = data ['diagnosis'] == 0
idx_1 = data ['diagnosis'] == 1

for i, feature in enumerate (data.columns.drop (['diagnosis'])):
plt.subplot (6, 5, i + 1)
plt.hist (data.loc [idx_0, feature], normed =1, alpha = 0.75, label = 'y = 8")
plt.hist (data.loc [idx_1, feature], normed = 1, facecolor = 'red', alpha = 0.75, label = 'y = 1')
plt.legend ()
plt.title (feature)
plt.show ()
¿Cómo hacer una transformación de variables?

Por último, mostraremos los datos de train y test de este ejercicio:

from sklearn.model_selection import train_test_split

#preparamos los datos
features = data.columns.drop (['diagnosis'])
X = data [features).values
y = data ['diagnosis').values
X_train, X_test, y_train, y_test = train_test_split (x, y, test_size = 0.2, random_state = 0)

print ('Datos train: ', X_train.shape)
print('Datos test: ', X_test.shape)

Datos train: (455, 30)

Datos test: (114, 30)

¿Qué sigue?

La transformación de variables es una de las tantas temáticas que debes conocer necesariamente si quieres incursionar en el mundo del Big Data. Para seguir avanzando, en KeepCoding tenemos el Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp, una formación intensiva en la que adquirirás las herramientas teóricas y prácticas para continuar aprendiendo sobre este interesante y amplio mundo de la programación y el Big Data. ¡No esperes más y empieza a cambiar tu futuro ahora al solicitar más información!

Posts Relacionados

¡CONVOCATORIA ABIERTA!

Big Data, IA & Machine Learning

Full Stack Bootcamp

Clases en Directo | Profesores en Activo | Temario 100% actualizado