Ingeniería de Features
Santiago Banchero
Juan Manuel Fernández
Eloísa Píccoli
Minería de Datos - UBA
data = charts_avg_by_artist_lab06 variable = avg_streams
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 por logaritmo
data$disc_variable_log = floor(log2(variable))
table(data$disc_variable_log)
21 22 23 24
36 509 126 6
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)
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,]))
}
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)
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)
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)
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)
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
# 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
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 |
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