Re: [R-es] Fórmula con variables al azar
Hola, Las diferencias con respecto a un random forest (no sé si usaste randomForest o ranger) pueden venir del resto de parámetros (los valores por defecto de rpart están en rpart.control() ) son diferentes a los de random forest (al menos para los de ranger), por ejemplo número de elementos a considerar en el split. Gracias, Carlos. El jue, 7 ene 2021 a las 22:12, Manuel Mendoza () escribió: > Gracias José Luis, y también a Carlos y a Juan. Respecto a lo que dices, > José Luis, de usar un random forest, es que es eso lo que estoy > programando, un RF. Tenía ya hecho el programa del bootstrap con árboles, y > a partir de él he programado un RF. He solucionado el problema que tenía > con lo que me ha dicho Carlos. Funciona bien, aunque me extraña que la > correlación sobre las muestras OOB no mejore respecto al bootstrap, > mientras que hecho con el paquete randomForest mejoraba sustancialmente. > Os lo pongo aquí, tal cual, por si queréis echarle un ojo. > Un saludo > > set.seed(5) > data <- read.table(file="Data.csv",header=T,sep=",") > > colnames(data) > p=19 > nreps<- 1000 > > # Creamos una matriz vacía para guardar las predicciones de cada árbol: > OOBpreds<- matrix(NA, nrow=nrow(data), > ncol=nreps,dimnames=list(rownames(data))) > > target <- c('IFd') > vars <- setdiff(names(data), target) > > for (i in 1:nreps){ > selected<-sample(1:nrow(data),size=floor((2/3)*nrow(data)),replace=T) > training<- data[selected,] > OOB<-data[-selected,]# El out of bag incluye las que no están en > el training data set > num_vars <- floor(p/3) > vars_samp <- vars[ sample(1:length(vars), num_vars)] > fmla <- as.formula(paste(target, " ~ ", paste(vars_samp, collapse= "+"))) > fit <- rpart(fmla, data = training) > OOBpreds[-selected, i]<-predict(fit, OOB) > if(i%%10==0){print(paste("Iteración ",i))} # i%%10==0 significa: el > resto de dividir i entre 10 es 0 > } > > ResOOB<-rowMeans(OOBpreds, na.rm=T) # se obtiene la media de todas las > predicciones para cada muestra > OOBBagging<-lm(data$IFd ~ ResOOB) # para calcular la correlación entre la > predicción y la observación > rsqOOBRT<-summary(OOBBagging)$adj.r.squared# R2 > > windows();plot(data$IFd ~ > ResOOB,main=paste("R2=",round(rsqOOBRT,2)));abline(0,1,lty=2,col=2) > > > > > > > El jue, 7 ene 2021 a las 11:03, José Luis Cañadas () > escribió: > >> Hola Manuel. >> ¿No has pensado en hacer un randomforest, poniendo qeu use todos los >> datos en cada muestra bootstrap y un porcentaje de las variables? >> >> El jue, 7 ene 2021 a las 1:42, Carlos Ortega () >> escribió: >> >>> Hola Manuel, >>> >>> Esta es una forma, uso el conjunto de datos "car90" que viene incluido en >>> "rpart". >>> >>> #- >>> library(rpart) >>> >>> data(car90) >>> target <- c('Mileage') >>> vars <- setdiff(names(car90), target) >>> >>> num_loops <- 10 >>> for( i in 1:num_loops) { >>>num_vars <- 6 >>>vars_samp <- vars[ sample(1:length(vars), num_vars)] >>>fmla <- as.formula(paste(target, " ~ ", paste(vars_samp, collapse= >>> "+"))) >>>fit <- rpart(fmla, data = car90) >>>print(fit) >>> } >>> >>> #- >>> >>> Se puede sofisticar esto, para capturar incluso la salida de cada >>> iteración... :-). >>> >>> Gracias, >>> Carlos Ortega >>> www.qualityexcellence.es >>> >>> El mié, 6 ene 2021 a las 22:44, Manuel Mendoza (< >>> mmend...@fulbrightmail.org>) >>> escribió: >>> >>> > Muy buenas, hago un árbol de regresión (aunque podría ser cualquier >>> otro >>> > análisis) dentro de un loop y quiero que en cada vuelta coja un >>> conjunto >>> > distinto de variables. En la df hay 19 predictores pero quiero que >>> utilice >>> > solo 6 de ellos, al azar, cada vez. ¿Qué debería poner donde hay un >>> > interrogante? >>> > >>> > fit<- rpart(IFd ~ ? , data=training) >>> > >>> > Gracias, como siempre, >>> > Manuel >>> > >>> > [[alternative HTML version deleted]] >>> > >>> > ___ >>> > R-help-es mailing list >>> > R-help-es@r-project.org >>> > https://stat.ethz.ch/mailman/listinfo/r-help-es >>> > >>> >>> >>> -- >>> Saludos, >>> Carlos Ortega >>> www.qualityexcellence.es >>> >>> [[alternative HTML version deleted]] >>> >>> ___ >>> R-help-es mailing list >>> R-help-es@r-project.org >>> https://stat.ethz.ch/mailman/listinfo/r-help-es >>> >> -- Saludos, Carlos Ortega www.qualityexcellence.es [[alternative HTML version deleted]] ___ R-help-es mailing list R-help-es@r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es
Re: [R-es] Fórmula con variables al azar
Gracias José Luis, y también a Carlos y a Juan. Respecto a lo que dices, José Luis, de usar un random forest, es que es eso lo que estoy programando, un RF. Tenía ya hecho el programa del bootstrap con árboles, y a partir de él he programado un RF. He solucionado el problema que tenía con lo que me ha dicho Carlos. Funciona bien, aunque me extraña que la correlación sobre las muestras OOB no mejore respecto al bootstrap, mientras que hecho con el paquete randomForest mejoraba sustancialmente. Os lo pongo aquí, tal cual, por si queréis echarle un ojo. Un saludo set.seed(5) data <- read.table(file="Data.csv",header=T,sep=",") colnames(data) p=19 nreps<- 1000 # Creamos una matriz vacía para guardar las predicciones de cada árbol: OOBpreds<- matrix(NA, nrow=nrow(data), ncol=nreps,dimnames=list(rownames(data))) target <- c('IFd') vars <- setdiff(names(data), target) for (i in 1:nreps){ selected<-sample(1:nrow(data),size=floor((2/3)*nrow(data)),replace=T) training<- data[selected,] OOB<-data[-selected,]# El out of bag incluye las que no están en el training data set num_vars <- floor(p/3) vars_samp <- vars[ sample(1:length(vars), num_vars)] fmla <- as.formula(paste(target, " ~ ", paste(vars_samp, collapse= "+"))) fit <- rpart(fmla, data = training) OOBpreds[-selected, i]<-predict(fit, OOB) if(i%%10==0){print(paste("Iteración ",i))} # i%%10==0 significa: el resto de dividir i entre 10 es 0 } ResOOB<-rowMeans(OOBpreds, na.rm=T) # se obtiene la media de todas las predicciones para cada muestra OOBBagging<-lm(data$IFd ~ ResOOB) # para calcular la correlación entre la predicción y la observación rsqOOBRT<-summary(OOBBagging)$adj.r.squared# R2 windows();plot(data$IFd ~ ResOOB,main=paste("R2=",round(rsqOOBRT,2)));abline(0,1,lty=2,col=2) El jue, 7 ene 2021 a las 11:03, José Luis Cañadas () escribió: > Hola Manuel. > ¿No has pensado en hacer un randomforest, poniendo qeu use todos los datos > en cada muestra bootstrap y un porcentaje de las variables? > > El jue, 7 ene 2021 a las 1:42, Carlos Ortega () > escribió: > >> Hola Manuel, >> >> Esta es una forma, uso el conjunto de datos "car90" que viene incluido en >> "rpart". >> >> #- >> library(rpart) >> >> data(car90) >> target <- c('Mileage') >> vars <- setdiff(names(car90), target) >> >> num_loops <- 10 >> for( i in 1:num_loops) { >>num_vars <- 6 >>vars_samp <- vars[ sample(1:length(vars), num_vars)] >>fmla <- as.formula(paste(target, " ~ ", paste(vars_samp, collapse= >> "+"))) >>fit <- rpart(fmla, data = car90) >>print(fit) >> } >> >> #- >> >> Se puede sofisticar esto, para capturar incluso la salida de cada >> iteración... :-). >> >> Gracias, >> Carlos Ortega >> www.qualityexcellence.es >> >> El mié, 6 ene 2021 a las 22:44, Manuel Mendoza (< >> mmend...@fulbrightmail.org>) >> escribió: >> >> > Muy buenas, hago un árbol de regresión (aunque podría ser cualquier otro >> > análisis) dentro de un loop y quiero que en cada vuelta coja un conjunto >> > distinto de variables. En la df hay 19 predictores pero quiero que >> utilice >> > solo 6 de ellos, al azar, cada vez. ¿Qué debería poner donde hay un >> > interrogante? >> > >> > fit<- rpart(IFd ~ ? , data=training) >> > >> > Gracias, como siempre, >> > Manuel >> > >> > [[alternative HTML version deleted]] >> > >> > ___ >> > R-help-es mailing list >> > R-help-es@r-project.org >> > https://stat.ethz.ch/mailman/listinfo/r-help-es >> > >> >> >> -- >> Saludos, >> Carlos Ortega >> www.qualityexcellence.es >> >> [[alternative HTML version deleted]] >> >> ___ >> R-help-es mailing list >> R-help-es@r-project.org >> https://stat.ethz.ch/mailman/listinfo/r-help-es >> > [[alternative HTML version deleted]] ___ R-help-es mailing list R-help-es@r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es
Re: [R-es] Fórmula con variables al azar
Hola Manuel. ¿No has pensado en hacer un randomforest, poniendo qeu use todos los datos en cada muestra bootstrap y un porcentaje de las variables? El jue, 7 ene 2021 a las 1:42, Carlos Ortega () escribió: > Hola Manuel, > > Esta es una forma, uso el conjunto de datos "car90" que viene incluido en > "rpart". > > #- > library(rpart) > > data(car90) > target <- c('Mileage') > vars <- setdiff(names(car90), target) > > num_loops <- 10 > for( i in 1:num_loops) { >num_vars <- 6 >vars_samp <- vars[ sample(1:length(vars), num_vars)] >fmla <- as.formula(paste(target, " ~ ", paste(vars_samp, collapse= > "+"))) >fit <- rpart(fmla, data = car90) >print(fit) > } > > #- > > Se puede sofisticar esto, para capturar incluso la salida de cada > iteración... :-). > > Gracias, > Carlos Ortega > www.qualityexcellence.es > > El mié, 6 ene 2021 a las 22:44, Manuel Mendoza (< > mmend...@fulbrightmail.org>) > escribió: > > > Muy buenas, hago un árbol de regresión (aunque podría ser cualquier otro > > análisis) dentro de un loop y quiero que en cada vuelta coja un conjunto > > distinto de variables. En la df hay 19 predictores pero quiero que > utilice > > solo 6 de ellos, al azar, cada vez. ¿Qué debería poner donde hay un > > interrogante? > > > > fit<- rpart(IFd ~ ? , data=training) > > > > Gracias, como siempre, > > Manuel > > > > [[alternative HTML version deleted]] > > > > ___ > > R-help-es mailing list > > R-help-es@r-project.org > > https://stat.ethz.ch/mailman/listinfo/r-help-es > > > > > -- > Saludos, > Carlos Ortega > www.qualityexcellence.es > > [[alternative HTML version deleted]] > > ___ > R-help-es mailing list > R-help-es@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es > [[alternative HTML version deleted]] ___ R-help-es mailing list R-help-es@r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es
Re: [R-es] Fórmula con variables al azar
Hola Manuel, Esta es una forma, uso el conjunto de datos "car90" que viene incluido en "rpart". #- library(rpart) data(car90) target <- c('Mileage') vars <- setdiff(names(car90), target) num_loops <- 10 for( i in 1:num_loops) { num_vars <- 6 vars_samp <- vars[ sample(1:length(vars), num_vars)] fmla <- as.formula(paste(target, " ~ ", paste(vars_samp, collapse= "+"))) fit <- rpart(fmla, data = car90) print(fit) } #- Se puede sofisticar esto, para capturar incluso la salida de cada iteración... :-). Gracias, Carlos Ortega www.qualityexcellence.es El mié, 6 ene 2021 a las 22:44, Manuel Mendoza () escribió: > Muy buenas, hago un árbol de regresión (aunque podría ser cualquier otro > análisis) dentro de un loop y quiero que en cada vuelta coja un conjunto > distinto de variables. En la df hay 19 predictores pero quiero que utilice > solo 6 de ellos, al azar, cada vez. ¿Qué debería poner donde hay un > interrogante? > > fit<- rpart(IFd ~ ? , data=training) > > Gracias, como siempre, > Manuel > > [[alternative HTML version deleted]] > > ___ > R-help-es mailing list > R-help-es@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es > -- Saludos, Carlos Ortega www.qualityexcellence.es [[alternative HTML version deleted]] ___ R-help-es mailing list R-help-es@r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es
[R-es] Fórmula con variables al azar
Muy buenas, hago un árbol de regresión (aunque podría ser cualquier otro análisis) dentro de un loop y quiero que en cada vuelta coja un conjunto distinto de variables. En la df hay 19 predictores pero quiero que utilice solo 6 de ellos, al azar, cada vez. ¿Qué debería poner donde hay un interrogante? fit<- rpart(IFd ~ ? , data=training) Gracias, como siempre, Manuel [[alternative HTML version deleted]] ___ R-help-es mailing list R-help-es@r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es