Inyección electrónica, Diagnostico por imagenes.pdf
teim_sesion_007_14_15.pdf
1. Sesión 07. “Seguimos Tomando Decisiones…”
1480-Técnicas Estadísticas en Investigación de Mercados
Grado en Estadística empresarial
Profesor: Xavier Barber i Vallés
Departamento: Estadística, Matemáticas e Informática
3. 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.
4. 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.
6. 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.
8. 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)
9. ¿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.
10. 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.)
16. “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.
17. Problemas de los “bosques”
• Si tus variables predictoras son de distintos tipos:
– Utiliza cforest (pkg:party) con la opción por defecto
controls=cforest_unbiased(); y varimp(obj).
En caso contrario se puede usar indistintamente el paquete
party con varimp(obj)o randomForest con VI
importance(obj, type=1) o el índice Gini
importance(obj, type=2); pero nunca olvides
poner scale=FALSE.
• Si tus variables predictoras están altamente
correlacionadas:
– cforest del paquete party.
19. rpart
Este es el primer paquete de R para árboles de
clasificación y árboles de regresión. Tiene las
funciones de “cortar” y gráficos muy generales.
La salida del árbol es fácil de comparar con un
GLM o un GAM (Generalized Additove Models).
20. rpart
library(rpart)
#http://people.hbs.edu/mtoffel/datasets/rsei212/rsei212_chemical.txt
raw.orig < - read.csv(file="rsei212_chemical.txt", header=T, sep="t")
# Keep the dataset small and tidy
# The Dataverse: hdl:1902.1/21235
raw = subset(raw.orig, select=c("Metal","OTW","AirDecay","Koc"))
row.names(raw) = raw.orig$CASNumber
raw = na.omit(raw);
frmla = Metal ~ OTW + AirDecay + Koc
# Metal: Core Metal (CM); Metal (M); Non-Metal (NM); Core Non-Metal (CNM)
fit = rpart(frmla, method="class", data=raw)
printcp(fit) # display the results
plotcp(fit) # visualize cross-validation results
summary(fit) # detailed summary of splits
# plot tree
plot(fit, uniform=TRUE, main="Classification Tree for Chemicals")
text(fit, use.n=TRUE, all=TRUE, cex=.8)
# tabulate some of the data
table(subset(raw, Koc>=190.5)$Metal)
Basic Decision Tree
tree
30. varSelRF
library(varSelRF)
x = matrix(rnorm(25 * 30), ncol = 30)
x[1:10, 1:2] = x[1:10, 1:2] + 2
cl = factor(c(rep("A", 10), rep("B", 15)))
rf.vs1 = varSelRF(x, cl, ntree = 200, ntreeIterat = 100,
vars.drop.frac = 0.2)
rf.vs1
plot(rf.vs1)
## Example of importance function show that forcing x1 to be the most
important
## while create secondary variables that is related to x1.
x1=rnorm(500)
x2=rnorm(500,x1,1)
y=runif(1,1,10)*x1+rnorm(500,0,.5)
my.df=data.frame(y,x1,x2,x3=rnorm(500),x4=rnorm(500),x5=rnorm(500))
rf1 = randomForest(y~., data=my.df, mtry=2, ntree=50, importance=TRUE)
importance(rf1)
cor(my.df)
42. 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 los 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 de la sesión anterior (paquete BCA-> CCS)
data(CCS, package="BCA")
#### 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)
43. ¡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])
### el bosque…..
data.cforest <- cforest(MonthGive ~ . ,data =CCS2[CCS$Sample=="Estimation”,]
, 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))
44. Importancia de las variables
dotplot(sort(data.cforest.varimp),
xlab="Variable Importance in DATAn
-predictors to right of dashed vertical line are
significant-",
panel = function(x,y){
panel.dotplot(x, y, col='darkblue', pch=16, cex=1.1)
panel.abline(v=abs(min(data.cforest.varimp)), col='red',
lty='longdash', lwd=2) } )
45. Los resultados
Variable Importance in DATA
−predictors to right of dashed vertical line are
significant−
YearsGive
SomeUnivP
hh1mem
FinUnivP
AveDonAmt
NewDonor
Age20t39
Age70pls
hh1t2mem
AveIncEA
Sample
Age80pls
AdultAge
DwelValEA
Region
Age20t29
Age60pls
LastDonAmt
DonPerYear
0.000 0.004 0.008
46. 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
47. La importancia de las variables
> data.cforest.varimp2
Region Log.YearsGive Log.AveDonAmt Log.LastDonAmt Log.DonPerYear
1e-03 5e-04 2e-03 0e+00 1e-03
NewDonor Age20t29 Age20t39 Age60pls Age70pls
0e+00 1e-03 1e-03 0e+00 1e-03
Age80pls AdultAge SomeUnivP FinUnivP hh1t2mem
-5e-04 -5e-04 5e-04 -1e-03 0e+00
50. 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”.
51. 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.DonPerYear + Age70pls + Age20t39
+ Age20t29+Region,
data=CCS2[CCS$Sample=="Estimation",])
52. treeFinal.lrm.model
Logistic Regression Model
lrm(formula = MonthGive ~ Log.AveDonAmt + Log.DonPerYear + Age70pls +
Age20t39 + Age20t29 + Region, data = CCS2[CCS$Sample == "Estimation",
])
Model Likelihood Discrimination Rank Discrim.
Ratio Test Indexes Indexes
Obs 544 LR chi2 118.71 R2 0.261 C 0.761
No 280 d.f. 10 g 1.240 Dxy 0.522
Yes 264 Pr(> chi2) <0.0001 gr 3.457 gamma 0.523
max |deriv| 3e-07 gp 0.258 tau-a 0.261
Brier 0.199
Coef S.E. Wald Z Pr(>|Z|)
Intercept -4.1284 0.6394 -6.46 <0.0001
Log.AveDonAmt 0.9957 0.1351 7.37 <0.0001
Log.DonPerYear 1.1230 0.3835 2.93 0.0034
Age70pls 0.8381 1.2445 0.67 0.5007
Age20t39 1.0080 2.6798 0.38 0.7068
Age20t29 0.6653 4.2080 0.16 0.8744
Region=R2 0.3757 0.2723 1.38 0.1676
Region=R3 0.2017 0.3043 0.66 0.5075
Region=R4 -0.4745 0.4354 -1.09 0.2757
Region=R5 -0.0358 0.3010 -0.12 0.9053
Region=R6 -0.6034 0.5692 -1.06 0.2891
53. 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???????