Presentación de PowerPoint - técnicas estadisticas en análisis de

Anuncio
Sesión 016. “Seguimos Tomando Deciciones…”
1480-Técnicas Estadísticas en Investigación de Mercados
Grado en Estadística empresarial
Curso 2012-13 – Segundo semestre
Profesor: Xavier Barber i Vallés
Departamento: Estadística, Matemáticas e Informática
ÁRBOLES Y BOSQUES
Diferencias entre
Árboles de Clasificación y de Regresión
DIFERENCIA 1:
Esto puede parecer un asunto trivial, ¡pues se sabe la diferencia!
Árboles de clasificación, como su nombre indica se utiliza para separar el
conjunto de datos en clases que pertenecen a la variable de respuesta. Por lo
general, la variable de respuesta tiene dos clases: Sí o No (1 ó 0). Por lo tanto
los árboles de clasificación se utilizan cuando la variable de respuesta o de
destino es categórica en la naturaleza.
Se necesitan árboles de regresión cuando la variable respuesta es numérica o
continua. Por ejemplo, el precio predicho de un bien de consumo. Por lo tanto
los árboles de regresión son aplicables para los problemas de predicción en
lugar de clasificación.
En cualquier caso, los predictores o variables independientes pueden ser
categóricas o numéricas. Es la variable de destino la que determina qué tipo
de árbol de decisión es necesario.
Diferencias entre
Árboles de Clasificación y de Regresión
DIFERENCIA 2:
En un árbol de clasificación estándar, la idea es dividir el conjunto de datos basado en
la homogeneidad de los datos. Digamos, por ejemplo, tenemos dos variables: la edad
y el peso que predicen si una persona va a registrarse para ser socio de un gimnasio o
no. En los datos de “calentamiento” se observó que el 90% de las personas que son
mayores de 40 años se ha registrado, dividimos los datos aquí y la edad se convierte
en un nodo superior del árbol. Casi podemos decir que esta separación ha hecho que
los datos de "90% de pureza". Medidas rigurosas de impurezas, basado en la
proporción de cálculo de los datos que pertenecen a una clase, tales como la entropía
o índice de Gini se utilizan para cuantificar la homogeneidad en los árboles de
clasificación.
En un árbol de regresión, la idea es la siguiente: dado que la variable de destino no
tiene clases, ajustar un modelo de regresión para la variable de destino con cada una
de las variables independientes. Luego, para cada variable independiente, los datos se
dividen en varios puntos de división. En cada punto de división, se eleva al cuadrado el
"error" entre el valor predicho y los valores reales de conseguir una "suma de errores
cuadrados (SSE)“ mínima.
RANDOM FOREST
Random forest, ¿qué son?
•
•
•
•
Random Forest son un tipo de método de particionamiento recursivo
especialmente adecuado para pequeñas n y grandes p (pocos datos y
muchas variables).
Se calculan subconjuntos de árboles de regresión al azar, es decir, se eligen
subconjuntos de X frente a la misma Y.
De esta manera, los bosques aleatorios son capaces de examinar mejor la
contribución y el comportamiento que cada predictor tiene, aun cuando
por lo general se eclipsa el efecto de un predictor por sus competidores
más importantes en los modelos más simples.
Por otra parte, los resultados de un conjunto de árboles de
clasificación/regresión se han demostrado mejores para producir
predicciones que los resultados de un solo árbol de clasificación.
¿cómo funciona?
library(randomforest)
– randomForest implements Breiman’s random
forest algorithm for classification and regression.
It can also be used in unsupervised mode for
assessing proximities among data points.
library (party):
– cforest: An implementation of the random forest
and bagging ensemble algorithms utilizing
conditional inference trees as base learners.
Random Forests
Leo Breiman and Adele Cutler
http://www.stat.berkeley.edu/~breiman/RandomForests/
Random Forests(tm) is a trademark of Leo Breiman and Adele Cutler and is licensed
exclusively to Salford Systems for the commercial release of the software.
Our trademarks also include RF(tm), RandomForests(tm), RandomForest(tm) and
Random Forest(tm)
En marcha!!
> library(languageR)
> library(Design)
> library(Party)
### ajustando los parámetros del random forest.
> data.controls <- cforest_unbiased(ntree=1000, mtry=3)
## inicializando la semilla
> set.seed(47)
#### ajuste del RF
> data.cforest <- cforest(Resp ~ x + y + z…, data =
mydata, controls=data.controls)
#### obteniendo la “importancia” de cada variable”
data.cforest.varimp <- varimp(data.cforest, conditional TRUE)
> write.table(data.cforest.varimp, file="FILEPATH.txt")
> dotplot(sort(data.cforest.varimp))
#(Note: conditional variable importance will take a while and is fairly CPU-intensive,
#especially for data sets with many variables, observations, and levels to the
#variables. I would highly recommend running these calculations on a high-powered
#computer.)
“Importancia” de las Variables
“Importancia” de las variable
“Importancia” de las variable
“Estadísticos” del bosque
C = concordancia (medida de 0 a 1).
Dxy= D de Sommers que mide la diferencia entre
la concondarcia y la discordancia.
CARIDAD MENSUAL VÍA
RANDOM FOREST
Selección Aleatoria del Árbol
Cargamos las librerías que vamos a utilizar y creamos el
objeto de los datos:
library(languageR) ## por si necesitamos algunas funcioens
library(design)
## por si queremos hacer ANOVAs a lso modelos lineales
library(party)
## Importante…
library(BCA)
## los datos
library(rpart)
## Importante
library(rms)
## diagnostico de rpart
library(randomForest)## otra versión de random forest
library(ModelGood)
## ajustes del modelo logistico
### recuperamos los datos del CCS
data(CCS, package="BCA")
de la sesión anterior (paquete BCA-> CCS)
#### Seccionamos la muestra para evitar problemas de overfitting
CCS$Sample <- create.samples(CCS, est = 0.34, val = 0.33, rand.seed = 1)
CCS$Sample<-factor(CCS$Sample)
¡Me estás “estresando”!
### ajustando los parámetros del random forest.
data.controls <- cforest_unbiased(ntree=10, mtry=3)
## inicializando la semilla
set.seed(47)
#### ajuste del RF
# [1] "Region"
"YearsGive"
"AveDonAmt"
"LastDonAmt"
# [5] "DonPerYear"
"NewDonor"
"Age20t29"
"Age20t39"
# [9] "Age60pls"
"Age70pls"
"Age80pls"
"AdultAge"
#[13] "SomeUnivP"
"FinUnivP"
"hh1t2mem"
"hh1mem"
#[17] "AveIncEA"
"DwelValEA"
"EngPrmLang"
"Sample" <<--OJO!!!
#[21] "Log.AveDonAmt" "Log.DonPerYear" "Log.LastDonAmt" "Log.YearsGive"
#[25] "NewRegion"
CCS2<-data.frame(CCS[,-20])
### por problemas de espacio de mi ordenador quito alguna variable,
data.cforest <- cforest(MonthGive ~ . ,data =CCS2[CCS$Sample=="Estimation",1:12]
, controls=data.controls)
#### obteniendo la “importancia” de cada variable”
data.cforest.varimp <- varimp(data.cforest, conditional=TRUE)
write.table(data.cforest.varimp, file="FILEPATH.txt")
dotplot(sort(data.cforest.varimp))
Los resultados
Region YearsGive AveDonAmt LastDonAmt DonPerYear NewDonor Age20t29 Age20t39 Age60pls
-0.003 0.001
0.002
0.004
-0.003
0.000
0.002
-0.001
0.002
LastDonAmt
Age60pls
Age20t29
AveDonAmt
YearsGive
NewDonor
Age20t39
Region
DonPerYear
-0.002
0.000
0.002
sort(data.cforest.varimp)
0.004
Importancia de las variables
dotplot(sort(data.cforest.varimp),
LastDonAmt
xlab="Variable
Importance in DATA\n
-predictors to right of dashed vertical line are
Age60pls
significant-",
panel
= function(x,y){
Age20t29
panel.dotplot(x, y, col='darkblue', pch=16, cex=1.1)
panel.abline(v=abs(min(data.cforest.varimp)), col='red',
AveDonAmt
lty='longdash', lwd=2)
} )
YearsGive
NewDonor
Age20t39
Region
DonPerYear
-0.002
0.000
0.002
0.004
Variable Importance in DATA
-predictors to right of dashed vertical
significant-
Probando con otras variables
## Hay que poner más "arboles y más variables"####
### ajustando los parámetros del random forest.
data.controls <- cforest_unbiased(ntree=1000, mtry=3)
## inicializando la semilla
set.seed(47)
### todas la variables o algunas?? dependerá de la capacidad de cálculo de nuestro ordenador
sele=c(1, 16:19,21:25)
data.cforest2 <- cforest(MonthGive ~ . ,
data=CCS2[CCS$Sample=="Estimation",sele] , controls=data.controls)
#### obteniendo la “importancia” de cada variable”
data.cforest.varimp2 <- varimp(data.cforest2, conditional=TRUE)
data.cforest.varimp2
La importancia de las variables
> data.cforest.varimp2
hh1t2mem
0.00040
hh1mem
0.00050
AveIncEA
0.00170
DwelValEA Log.AveDonAmt
0.00010
0.00415
Log.DonPerYear Log.LastDonAmt Log.YearsGive NewRegion
0.00220
0.00485
0.00280
-0.00040
La importancia de las Variables
Log.LastDonAmt
Log.AveDonAmt
Log.YearsGive
Log.DonPerYear
AveIncEA
hh1mem
hh1t2mem
DwelValEA
NewRegion
0.000
0.001
0.002
0.003
0.004
0.005
Importancia de las Variables en CCS
-Las variables a la derecha de la lin
La concordancia del Modelo
Una vez obtenida la importancia de las
variables, nos queda saber si el modelo va a ser
un buen modelo para predecir.
Para ello o bien realizamos el árbol de “decisión”
o “regresión”, o bien realizamos una regresión
log´sitica sólo con las variables “importantes”.
La concordancia del Modelo
#################
##### o bien creamos un árbol con las variables:
##### log.AveDonamt+Log.LastDonamt+Log.YearGive
##### o bien generamos una regresión logistica
####con estas variables sólo:
treeFinal.lrm.model <- lrm(MonthGive~
Log.AveDonAmt +
Log.LastDonAmt + Log.YearsGive,
data=CCS2[CCS$Sample=="Estimation",])
treeFinal.lrm.model
Logistic Regression Model
lrm(formula = MonthGive ~ Log.AveDonAmt + Log.LastDonAmt + Log.YearsGive,
data = CCS2[CCS$Sample == "Estimation", ])
Obs
544
No
280
Yes
264
max |deriv| 2e-07
Model Likelihood
Ratio Test
LR chi2
108.15
d.f.
3
Pr(> chi2) <0.0001
Coef
Intercept
-3.0231
Log.AveDonAmt
0.7013
Log.LastDonAmt 0.4616
Log.YearsGive -0.3599
S.E.
Wald Z
0.4542 -6.66
0.3094 2.27
0.2836 1.63
0.1509 -2.39
Discrimination
Indexes
R2
0.240
g
1.170
gr
3.222
gp
0.246
Brier
0.204
Pr(>|Z|)
<0.0001
0.0234
0.1036
0.0171
Rank Discrim.
Indexes
C
0.748
Dxy
0.496
gamma
0.499
tau-a
0.248
Predicciones con mis Importantes
pred.lrm.treefinal <- predictStatusProb(treeFinal.lrm.model,
newdata=CCS2[CCS$Sample=="Validation",])
boxplot(pred.lrm.treefinal~CCS2$MonthGive[CCS$Sample=="Validation"])
abline(h = 0.5, col="red")
#### Clasifica bien???????
No
Yes
0.2
0.4
0.6
0.8
1.0
Descargar