Técnica de Binning para gestión de ruido
Juan Manuel Fernandez
En esta clase, vamos a abordar la implementación de la técnica de binning (por igual ancho e igual frecuencia) para la gestión de ruido en datos.
Puede entenderse al ruido como un error aleatorio o varianza en una variable medida.
Vamos a trabajar con la librería infotheo para la discretización de atributos.
Se etiquetan las instancias de acuerdo al bin que le corresponde según la técnica Equal Freq:
library(infotheo)
# Discretize recibe el atributo, el método de binning y la cantidad de bins
bin_eq_freq <- discretize(iris$Sepal.Width,"equalfreq", 5)
# Incorporo atributo al dataframe
iris_disc <- data.frame(iris$Sepal.Width, bin_eq_freq)
# Cambio los nombres de los atributos
names(iris_disc) <- c('Sepal.Width', 'E.Freq.Bin')
# Muestro los primeros 3 datos
iris_disc[1:3,]
Sepal.Width E.Freq.Bin
1 3.5 5
2 3.0 2
3 3.2 4
Se etiquetan las instancias de acuerdo al bin que le corresponde según la técnica Equal Width:
library(infotheo)
# Discretize recibe el atributo, el método de binning y la cantidad de bins
bin_eq_width <- discretize(iris$Sepal.Width,"equalwidth", 5)
# Incorporo atributo al dataframe
iris_disc <- data.frame(iris_disc, bin_eq_width)
# Cambio los nombres de los atributos
names(iris_disc) <- c('Sepal.Width', 'E.Freq.Bin', 'E.Width.Bin')
# Muestro los primeros 3 datos
iris_disc[1:3,]
Sepal.Width E.Freq.Bin E.Width.Bin
1 3.5 5 4
2 3.0 2 3
3 3.2 4 3
Ahora se realiza el suavizado por la media según la discretización por igual frecuencia:
# Por cada bin calculamos la media y reemplazamos en el atributo suavizado
for(bin in 1:5){
# Calculo de media
media_bin = mean(iris_disc$Sepal.Width[iris_disc$E.Freq.Bin==bin])
#
iris_disc$E.Freq.Suav[iris_disc$E.Freq.Bin==bin] = media_bin
}
iris_disc[1:3,]
Sepal.Width E.Freq.Bin E.Width.Bin E.Freq.Suav
1 3.5 5 4 3.752000
2 3.0 2 3 2.924000
3 3.2 4 3 3.296774
También realizamos el suavizado por la media según la discretización por igual ancho:
# Por cada bin calculamos la media y reemplazamos en el atributo suavizado
for(bin in 1:5){
# Calculo de media
media_bin = mean(iris_disc$Sepal.Width[iris_disc$E.Width.Bin==bin])
#
iris_disc$E.Width.Suav[iris_disc$E.Width.Bin==bin] = media_bin
}
iris_disc[1:3,]
Sepal.Width E.Freq.Bin E.Width.Bin E.Freq.Suav E.Width.Suav
1 3.5 5 4 3.752000 3.671429
2 3.0 2 3 2.924000 3.151471
3 3.2 4 3 3.296774 3.151471
# grafico Sepal.Width ordenado de menor a mayor
plot(sort(iris_disc$Sepal.Width) , type = "l", col="red", ylab = "Sepal.Width", xlab = "Observaciones", main = "Dato original vs suavizado")
# Agrego la serie de la variable media
lines(sort(iris_disc$E.Width.Suav),
type = "l", col="blue")
legend("topleft", legend=c("Original", "Suavizado"), col=c("red", "blue"), lty=1)