Métodos de regresión, clasificación y clustering

Publicado por

Índice

  1. Regresión lineal
  2. Regresión logística
  3. Árboles. CART
  4. Clustering

1. Regresión lineal

El análisis de regresión linean es una técnica estadística utilizada para estudiar la relación entre variables. En el ámbito de la investigación se utiliza para predecir un amplio rango de fenómenos.

Consiste en un modelo matemático usado para aproximar la relación de dependencia entre una variable dependiente Y, las variables independientes X<sub>i</sub> y un termino independiente B. Este modelo puede ser expresado en forma de recta.

La primera forma de regresión lineal documentada fue el método de los mínimos cuadrados publicado por Legendre en 1805.

El termino lineal se emplea para distinguirlo del resto de técnicas de regresión que utilizan modelos matemáticos basados en cualquier función matemática. Los modelos lineales son una explicación simplificada de la realidad.

La regresión lineal múltiple involucra mas de una variable independiente.

Ejemplo práctico con R:

model1 = lm(Price ~ HarvestRain + WinterRain, data = wine)
summary(model1)

Para comprobar lo bueno que es el modelo hay que fijarse en el parámetro R2 y el R2 ajustado. También nos índica que variables son significativas para nuestro modelo.

Predicción con el modelo anterior en R

climatePredictions = predict(climateReg3, newdata = climate_test)
 
SSE(Sum of Squared Errors)=sum((climatePredictions-climate_test$Temp)^2)
RMSE(Root Mean Square Error) = sqrt(SSE/nrow(climate_train))
SST(Total Sum of Square)=sum((mean(climate_train$Temp) - climate_test$Temp)^2)
R2 = 1 - SSE/SST
 

Para comparar nuestro modelo existe el modelo de referencia o baseline que no utiliza ninguna de las variables dependientes y que deberíamos mejorar.

Cuando se trabaja con modelos de regresión lineal hay que tener en cuenta la correlación entre variables (-1<p<1) y estudiar la multicolinearidad, generada a través de la relación lineal entre pares de variables independientes (-0.7<p<0.7). Para solucionar este problema deberemos eliminar las variables innecesarias.

cor(wine$winterRain, wine$Price)

Nota: He escrito un post explicando más en detalle la regresión lineal, para verlo  pinchar aquí.

2. Regresión Logística

Existe un artículo dedicado a este tema más extenso, en el siguiente enlace.

Es similar a la regresión lineal pero con la diferencia de que su variable dependiente es categórica.  Esta variable puede tomar dos valores (binomial) o múltiples. En nuestro caso comenzaremos estudiando la probabilidad de que nuestra variable dependiente tenga el valor 0 o 1 en función de un conjunto de variables independientes o predictoras.

Las probabilidades que describen el posible resultado de un único ensayo se modelan, como una función de variables explicativas, utilizando una función logística.

El logit es aplicar a la función logística el log para eliminar el neperiano de uno de los lados de la fórmula. Cuanto mayor es el logit mayor P(y=1).

QualityLog = glm(PoorCare ~ ., data=train, family=binomial)
summary(QualityLog)
predictTest = predict(QualityLog, type="response", newdata=test) 

Para comprobar la diferencia entre modelos hay que tener en cuenta el parámetro AIC, cuanto más bajo mejor será el modelo.

Cuando predecimos con un modelo de regresión logística generamos valores en forma de probabilidad para la variable dependiente entre 0 y 1. Para decidir si estos valores serán un 0 o un 1, debemos establecer un umbral de discriminación.

Este umbral se denomina threshold. Dependiendo de este valor generaremos mas errores de tipo I o de tipo II. Los errores de tipo I son llamados falsos positivos, y son aquellos que se predice 1 cuando en realidad era 0. Los errores de tipo II también llamados falsos negativos son aquellos que se predice 0 cuando en realidad era 1.

Esto se entiende mejor visualizando la matriz de confusión.

Sensibilidad = TP / (TP + FN)
Especifidad = TN / (TN + FP)

A mayor threshold, mayor especifidad y menor sensibilidad.
A menor threshold, menor especifidad y mayor sensibilidad.

La curva ROC es una representación gráfica de la sensibilidad frente a la especificidad para un sistema clasificador binario según se varía el umbral de discriminación.

Otra interpretación de este gráfico es la representación del ratio de verdaderos positivos frente al ratio de falsos positivos también según se varía el umbral de discriminación (valor a partir del cual decidimos que un caso es un positivo).

Para poder comprar las diferentes curvas ROC se utliza el indicador AUC que es el área bajo la curva ROC o AUC. Este índice se puede interpretar como la probabilidad de que un clasificador ordenará o puntuará una instancia positiva elegida aleatoriamente más alta que una negativa

#Instalar paquete ROCR para representar curva ROC y AUC
 install.packages("ROCR")
 library(ROCR)

#Compute the ROC curve over the predicted values
 ROCRpredTest = prediction(predictTest, test$PoorCare)
 ROCRperf = performance(ROCRpredTest, "tpr" , "fpr")
 plot(ROCRperf, colorize=TRUE,print.cuttoffs.at=c(0,1,0.1),text.adj=c(-0.2,1.7))

#Compute the test set AUC
 auc = as.numeric(performance(ROCRpredTest, "auc")@y.values)
 plot(auc)

3. Árboles. CART – Classification And Regression Trees

Los árboles de regresión CART son una alternativa de regresión que no requiere supuestos sobre los datos a analizar y es un método de fácil interpretación de los resultados. Fueron desarrollados en los años 80 por Breiman, Freidman, Olshen y Stone en su libro.

La metodología CART utiliza datos históricos para construir arboles de regresión o de clasificación los cuales pueden ser utilizados para clasificar o predecir futuros datos. Los árboles funcionan bien con variables númericas o categóricas. Es un modelo robusto frente a los outliers y muy interpretable.

Utilizar árboles de clasificación para explicar y predecir la pertenencia de los objetos (observaciones, individuos) a una clase, sobre la base de variables explicativas cuantitativas y cualitativas. – Utilizar un árbol de regresión para crear un modelo explicativo y predictivo para una variable cuantitativa dependiente basada en variables explicativas cuantitativas y cualitativas.

######################
##        CART      ##
######################

################## LIBRARIES ##########################################
#Library for cart models
 library(rpart)
 library(rpart.plot)

#Library for Random Forest
 library(randomForest)

#Library for compute ROC curve & AUC value
 library(ROCR)

#Libraries for Cross Validation. Choose a correct cp parameter.
 library(caret)
 library(e1071)

################## PREPARE DATA ########################################

#Read and split data
 stevens = read.csv("Unit4/stevens.csv")
 library(caTools)

set.seed(3000)
 split = sample.split(stevens$Reverse, SplitRatio = 0.7)
 train = subset(stevens, split == TRUE)
 test = subset(stevens, split == FALSE)

#Random Forest preparation
 train$Reverse = as.factor(train$Reverse)
 test$Reverse = as.factor(test$Reverse)

###################### PREDICTING ###############################

# Make the tree and plot
 cart = rpart(Reverse ~ .,data = train, method = "class", minbucket = 100)
 prp(cart)

#Predictions CAR Model
 predictCART = predict(cart, newdata = test, type="class")
 table(test$Reverse, predictCART) # Accuracy=65.9%

#Prediction ROC
 predictROC = predict(cart, newdata = test)
 pred = prediction(predictROC[,2], test$Reverse)
 perf = performance(pred,"tpr","fpr")
 plot(perf, colorize=TRUE)

#Calculate AUC.
 as.numeric(performance(pred, "auc")@y.values)


Random Forest
:

Random Forests (Breiman, 2001) es un algoritmo para clasificación y regresión de amplio uso en la comunidad que tiene un rendimiento especialmente bueno para datos de alta dimensionalidad. Random Forest puede considerarse como la integración de las siguientes técnicas: Decision Trees, Bagging, y Random Subspace. Mas información.

#Random Forest Prediction
set.seed(200)
randomForest = randomForest(Reverse~.+ Unconst, data = train, 
                            nodesize=25, ntrees=200)
predictForest = predict(randomForest, newdata = test)
table(test$Reverse, predictForest) #Accuracy(200)=69.4%

Para interpretar Random Forest.
One metric that we can look at is the number of times, aggregated over all of the trees in the random forest model, that a certain variable is selected for a split.
To view this metric, run the following lines of R code (replace “MODEL” with the name of your random forest model):

vu = varUsed(MODEL, count=TRUE)
vusorted = sort(vu, decreasing = FALSE, index.return = TRUE)
dotchart(vusorted$x, names(MODEL$forest$xlevels[vusorted$ix]))

A different metric we can look at is related to “impurity”, which measures how homogenous each bucket or leaf of the tree is. In each tree in the forest, whenever we select a variable and perform a split, the impurity is decreased.
Therefore, one way to measure the importance of a variable is to average the reduction in impurity, taken over alzl the times that variable is selected for splitting in all of the trees in the forest.

 varImpPlot(MODEL)

Cross-Validation: es la técnica que se utiliza para definir el parámetro óptimo de complejidad de un árbol, establecemos el número de de buckets finales y el incremento.

numFolds = trainControl(method="cv", number=10)
cpGrid = expand.grid(.cp=seq(0.01,0.5,0.01))
train(Reverse ~ Petitioner + Respondent + LowerCourt + Unconst, 
 data = train, method="rpart",trControl=numFolds,tuneGrid=cpGrid)

cartCV = rpart(e + Petitioner + Respondent + LowerCourt + Unconst, 
               data=train, method="class",cp=0.18)
prp(cartCV)

4. Clustering

Es una técnica de agrupamiento de datos para su exploración teniendo en cuenta el concepto “maximizar la similaridad entre los elementos de la clase y minimizar la similaridad entre los grupos” descrito por Han, Kamber & Pei. En el algoritmo de clustering esto se traduce en identificar y agrupar instancias que son muy similares. K-means es probablemente el mejor ejemplo de un algoritmo de clustering. El clustering  es un tipo de análisis no supervisado porque buscar relaciones entre variables descriptivas pero no busca relaciones con una variable objetivo.

El clustering lo utilizan Netflix o Amazon para su motor de recomendaciones. Estas recomendaciones pueden ser basadas en contenido o colaborativas. Por ejemplo Netflix puede recomendarte películas basadas en tus puntuaciones y en la similitud con las de otros usuarios, así estaríamos hablando de recomendaciónes colaborativas. Si por el contratio la recomendación se basa en datos descriptivos de la película, como el género, director, reparto,… la recomendación sería basada en contenidos.

Estos algoritmos miden la distancia Euclidea entre dos puntos para comprobar al grupo de datos-cluster que debería pertenecer.Para medir la distancia que hay entre grupos se utiliza la distancia mínima que existe entre los dos puntos más similares de los dos grupos. La distancia euclidea es:

dij=√(xi1 – xi2)2 + … + (√(xin – xin)2)

Esta distancia esta muy afectada por la escala en la que se encuentren la variables por eso se recomienda normalizar los datos antes de aplicar el algoritmo.

Clustering jerárquico

El cluster jerárquico funciona como sigue:

  1. Cada punto del conjunto tiene su propio cluster
  2. El algoritmo comienza combinando los dos grupos más cercanos
  3. El algoritmo continua agrupando hasta que solo queda un cluster

A priori no conocemos cual será el número exacto de clusters en los que debemos dividir el problema, podremos tener una aproximación basada en la intuición observando el dendrograma.

El problema con este método es que una vez asignado una observación a un grupo ésta no puede ser reasignada a otro grupo, por eso estos métodos se utilizan al inicio como primera aproximación a la solución y después utilizar métodos no jerárquicos para mejorar la solución.

K-means

El algoritmo k-means agrupa observaciones siguiendo los siguientes pasos:

  1. Especificar el número de clusters k
  2. Aleatoriamente asignar cada observación a un cluster
  3. Calcular el centroide de cada cluster
  4. Reasignar cada observación al centroide mas cercano
  5. Volver a recalcular el centroide de cada cluster
  6. Repetir 4 o 5 veces hasta que no se obtengan mejoras

Este algoritmo se suele utilizar en combinación de Random Forest.

Ejemplo práctico con R:

daily = read.csv("Unit6/dailykos.csv")

# Calcular la distancia euclidea entre los puntos del dataset y 
# generar un cluster jerárquico.
distances = dist(daily, method="euclidean")
cluster = hclust(distances, method="ward.D")
plot(cluster)

# Dividir los datos en siete grupos
hierGroups = cutree(cluster, k=7)

# Generar un dataset por cada cluster
cluster1 = subset(daily, hierGroups == 1)
cluster2 = subset(daily, hierGroups == 2)
cluster3 = subset(daily, hierGroups == 3)
cluster4 = subset(daily, hierGroups == 4)
cluster5 = subset(daily, hierGroups == 5)
cluster6 = subset(daily, hierGroups == 6)
cluster7 = subset(daily, hierGroups == 7)

# Obtener las 6 palabras mas repetidas en el cluster 1
tail(sort(colMeans(cluster1)))

# Utilizar el clustering k-means
set.seed(1000)
kmc = kmeans(daily, center=7)

# Existe una función para separar los valores de un dataset en función
# del valor de una variable vector. 
KmeansCluster = split(daily, kmc$cluster)

# Los valores de cada grupo pueden ser accedidos asi
KmeansCluster[[1]]

Hay veces que los datos no se encuentran normalizados y como consecuencia las variables en una escala mayor tendran mas peso sobre el cluster.

# Normalizar los datos 
airlinesNorm = predict(preproc, airlines)
summary(airlinesNorm) #mean=0
sd(airlines$Balance) #sd=1

 

Un comentario

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s