Preprocesamiento

Ingeniería de Features



Santiago Banchero
Juan Manuel Fernández
Eloísa Píccoli

Minería de Datos - UBA

Contenidos

  • Discretización:
    • Binning
    • Por función matemática
  • Normalización:
    • Z-score
    • Min-Max
    • Escalado Robustos
    • Decimal Scaling
  • Variables Dummies
  • Transformaciones:
    • Logaritmo

Observamos la distribución de la variable

data = charts_avg_by_artist_lab06
variable = avg_streams

plot of chunk unnamed-chunk-4

Discretización: Binning

library(arules)

breaks = 5

# discretización de igual ancho
data$disc_variable_interval = arules::discretize(variable, method = "interval", breaks = breaks, labels=c("muy_bajo", "bajo", "medio", "alto", "muy_alto"))

# discretización de igual frecuencia
data$disc_variable_frequency = arules::discretize(variable, method = "frequency", breaks = breaks, labels=c("muy_bajo", "bajo", "medio", "alto", "muy_alto"))

# discretización por kmeans
data$disc_variable_cluster = arules::discretize(variable, method = "cluster", breaks = breaks, labels=c("muy_bajo", "bajo", "medio", "alto", "muy_alto"))

Mas info ejecutando ?arules::discretize en la consola

Discretización: Función Matemática

# Discretización por logaritmo
data$disc_variable_log = floor(log2(variable))
table(data$disc_variable_log)

 21  22  23  24 
 36 509 126   6 

Discretización: Puntos de corte según método

interval_cuts = arules::discretize(variable, method = "interval", breaks = breaks, onlycuts = TRUE)

frequency_cuts = arules::discretize(variable, method = "frequency", breaks = breaks, onlycuts = TRUE)

cluster_cuts = arules::discretize(variable, method = "cluster", breaks = breaks, onlycuts = TRUE)

Discretización: Puntos de corte según método (+)

log_cuts =  unique(data$disc_variable_log)
log_cuts_variable <-vector()

for(cut in log_cuts){
 # Identifico el mínimo que toma la variable para cada uno de los grupos
 log_cuts_variable  <- c(log_cuts_variable , min(data["avg_streams"][data[, "disc_variable_log"] == cut,]))
}

Discretización: Igual Ancho

hist(data$avg_streams, main="Histograma Avg Streams", xlab="Avg Streams por Artista", ylab="Frecuencia", breaks=50)
abline(v=interval_cuts, col="red",lty=5)
legend("topright" , legend=c("Igual Ancho" ),col=c("red"), lty=5, cex=0.8)

plot of chunk unnamed-chunk-11

Discretización: Igual Frecuencia

hist(data$avg_streams, main="Histograma Avg Streams", xlab="Avg Streams por Artista", ylab="Frecuencia", breaks=50)
abline(v=frequency_cuts, col="red",lty=5)
legend("topright" , legend=c("Igual frecuencia" ),col=c("red"), lty=5, cex=0.8)

plot of chunk unnamed-chunk-13

Discretización: Clusters K-Means

hist(data$avg_streams, main="Histograma Avg Streams", xlab="Avg Streams por Artista", ylab="Frecuencia", breaks=50)
abline(v=cluster_cuts, col="red",lty=5)
legend("topright" , legend=c("Clusters" ),col=c("red"), lty=5, cex=0.8)

plot of chunk unnamed-chunk-15

Discretización: Logaritmo

hist(data$avg_streams, main="Histograma Avg Streams", xlab="Avg Streams por Artista", ylab="Frecuencia", breaks=50)
abline(v=log_cuts_variable, col="red",lty=5)
legend("topright" , legend=c("Logaritmo" ),col=c("red"), lty=5, cex=0.8)

plot of chunk unnamed-chunk-17

Normalización

Centrado = Resto algún valor de referencia
Escalado = Divido por alguna dispersión

# z-score 
range(scale(variable, center=TRUE,  scale=TRUE))
[1] -1.223184  5.741844
# Min-Max
range(scale(variable, center=min(variable),  scale=max(variable) - min(variable)))
[1] 0 1

Normalización (+)

# Escalado robusto usando la mediana
range(scale(variable, center=median(variable),  scale=TRUE))
[1] -0.9243279  5.8054091
# Escalado robusto usando la mediana y el rango intercuartil
range(scale(variable, center=median(variable),  scale=IQR(variable)))
[1] -0.8962202  5.6288736
# Escalado decimal (-1 y 1)
d = floor(log10(max(abs(variable)))) + 1
range(variable / 10**d )
[1] 0.037479 0.213296

Variables Dummies

Este tipo de codificación también se la conoce como “One Hot Encoding” o variables “Flags”

library(fastDummies)

# Utilizo la variable discretizada por igual ancho como ejemplo
# Una columna siempre es redundante, exluyo la primera
dic_var_interval_dummies = dummy_cols(data, select_columns=c("disc_variable_interval"), remove_first_dummy=TRUE)
disc_variable_interval_bajo disc_variable_interval_medio disc_variable_interval_alto disc_variable_interval_muy_alto
0 0 0 0
0 0 0 0
1 0 0 0
0 0 0 0
1 0 0 0

Transformación Logaritmica

mediana = median(variable)
media = mean(variable)
sd = sd(variable)
sesgo = (3* (media - mediana)) / sd

print(sesgo)
[1] 0.7996166
# Aplico transformación logaritmica
data$variable_t = log2(variable)
# Calculo el sesgo de la nueva variable (Transformada)
mediana_t = median(data$variable_t)
media_t = mean(data$variable_t)
sd_t = sd(data$variable_t)
sesgo_t = (3* (media_t - mediana_t)) / sd_t
print(sesgo_t)
[1] 0.4603747

Transformación Logaritmica (+)

plot of chunk figures-sideplot of chunk figures-side