Reducción de Dimensionalidad (Dimensionality Reduction)
(Tips de Programación)
Santiago Banchero
Leo Lucianna
Juan Manuel Fernandez
Minería de Datos - UBA
Vamos a ver algunos tips para implementar las siguientes técnicas en R:
Se eliminan los datos con escasa varianza, para ello se realiza el análisis LVF:
# Tomamos los atributos numéricos del dataframe
lvf<-na.omit(iris[,-c(5)])
# Primero normalizamos los datos (Min-Max) a un rango 0-1
for(i in 1:ncol(lvf)) {
lvf[,i] <- (lvf[,i]-min(lvf[,i]))/(max(lvf[,i])-min(lvf[,i]))
}
# Calculamos la varianza para cada atributo y redondeamos a 4 decimales
varianzas<-round(apply(lvf, 2, var),4)
print(varianzas)
Sepal.Length Sepal.Width Petal.Length Petal.Width
0.0529 0.0330 0.0895 0.1009
Primero debemos analizar si hay candidatos, podemos hacerlo gráficamente con un heatmap:
library(gplots)
library(RColorBrewer)
# Reducing Highly Correlated Columns
dev.off()
ds.cor=cor(iris[,-c(5)], use="complete.obs")
heatmap.2(ds.cor,
cellnote = round(ds.cor,1),
main = "Correlación",
notecol="black",
density.info="none",
trace="none",
margins =c(12,12),
col=brewer.pal('RdYlBu', n=5),
dendrogram="none",
Colv="NA")
El gráfico de heatmap presenta información sobre la correlación entre las variables, con colores de referencia:
Vamos a hacer el análisis “a mano” y con la librería “caret”:
data.numeric<-na.omit(iris[,-c(5)])
# Calculo matriz de correlacion
matriz.correlacion<-cor(data.numeric)
# Verifico la Correlación con la matríz
print(matriz.correlacion)
Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length 1.0000000 -0.1175698 0.8717538 0.8179411
Sepal.Width -0.1175698 1.0000000 -0.4284401 -0.3661259
Petal.Length 0.8717538 -0.4284401 1.0000000 0.9628654
Petal.Width 0.8179411 -0.3661259 0.9628654 1.0000000
Ahora lo hacemos con la librería Caret:
library(caret)
# Buscamos atributos con correlaciones superiores a 0.75
highlyCorrelated <- findCorrelation(matriz.correlacion, cutoff=0.75)
# Imprimimos los nombres de los atributos que cumplen con la condición anterior
print(names(data.numeric[,highlyCorrelated]))
[1] "Petal.Length" "Petal.Width"
Luego deberíamos analizar eliminar esos atributos.
Utilizamos la técnica de Random Forest para ponderar los atributos en función de la importancia en la clasificación. Primero corremos el modelo:
library(randomForest)
model_rf<-randomForest(Species ~ ., data=iris, na.action = na.omit)
importance(model_rf)
MeanDecreaseGini
Sepal.Length 9.803364
Sepal.Width 2.402437
Petal.Length 43.109930
Petal.Width 43.955177
También podemos realizar una gráfica con la importacia de cada variable:
varImpPlot(model_rf)