【问题标题】:how to run a code efor 1000 times using for loop?如何使用 for 循环运行代码 1000 次?
【发布时间】:2018-01-06 09:58:07
【问题描述】:

我有这段代码,每次运行时都会产生不同的“auc”。我想运行此代码 1000 次,以计算 1000 个存储的 AUC 的平均值。我如何申请循环来做我正在寻找的东西?如果你们为我做这件事并粘贴新代码,将不胜感激。因为我从 4 天以来一直在尝试解决。

#iris is a built-in dataset
main_df<- iris
# extract data for "setosa"
setosa <-main_df[main_df$Species=="setosa" ,]
# extract data for "virginica"
virginica<-main_df[main_df$Species=="virginica" ,]
#merge "setosa" and "virginica" as new dataset
df<- rbind(setosa,virginica)

Cross.AUC<-rep(0,1000) # create a vector of zeros, here will be stored the auc values from each of 1000 runs
for (i in seq(1:1000)) {
#---------------devide data into two datasets 70:30 train:test ----
#---------------train dataset
#select randomly 70% of setosa, generates a 35-by-5 matrix
setosa_70<-setosa[sample(nrow(setosa),round(0.7*dim(setosa)[1])),]
#select randomly 70% of virginica, generates a 35-by-5 matrix
virginica_70<-virginica[sample(nrow(virginica),round(0.7*dim(virginica)[1])),]
#merge setosa and virginica
train<-rbind(setosa_70,virginica_70)
#convert "setosa" to "0" and "virginica" to 1""
train$Species<-ifelse(train$Species=="setosa",0,1)
#select 1st, 2nd and 5th columns
train <-subset(train,select = c(1,2,5))
#--------------test dataset
#select randomly 30% of setosa, generates a 15-by-5 matrix
setosa_30<-setosa[sample(nrow(setosa),round(0.3*dim(setosa)[1])),]
#select randomly 30% of virginica, generates a 15-by-5 matrix
virginica_30<-virginica[sample(nrow(virginica),round(0.3*dim(virginica)[1])),]
#merge setosa and virginica
test<-rbind(setosa_30,virginica_30)
#convert "setosa" to "0" and "virginica" to 1""
test$Species<-ifelse(test$Species=="setosa",0,1)
#select 1st, 2nd and 5th columns
test <-subset(test,select = c(1,2,5))
#merge "train" and "test"
train_test<-rbind(train,test)
#--Model_1--
model <-glm(Species~., family = binomial(link = "logit"),data = train_test)
# install.packages("ROCR")
library(ROCR)
p <- predict(model, newdata=test, type="response")
pr <- prediction(p, test$Species)
auc <- performance(pr, measure = "auc")
auc <- auc@y.values[[1]]
AUC[i]<-auc
}

【问题讨论】:

    标签: r loops for-loop dataframe dataset


    【解决方案1】:

    AUC 替换为Cross.AUC。您没有在您可以在for 循环中访问的范围内定义任何名为AUC 的对象。

    #iris is a built-in dataset
    main_df<- iris
    # extract data for "setosa"
    setosa <-main_df[main_df$Species=="setosa" ,]
    # extract data for "virginica"
    virginica<-main_df[main_df$Species=="virginica" ,]
    #merge "setosa" and "virginica" as new dataset
    df<- rbind(setosa,virginica)
    
    Cross.AUC<-rep(0,1000) # create a vector of zeros, here will be stored the auc values from each of 1000 runs
    for (i in seq(1:1000)) {
      #---------------devide data into two datasets 70:30 train:test ----
      #---------------train dataset
      #select randomly 70% of setosa, generates a 35-by-5 matrix
      setosa_70<-setosa[sample(nrow(setosa),round(0.7*dim(setosa)[1])),]
      #select randomly 70% of virginica, generates a 35-by-5 matrix
      virginica_70<-virginica[sample(nrow(virginica),round(0.7*dim(virginica)[1])),]
      #merge setosa and virginica
      train<-rbind(setosa_70,virginica_70)
      #convert "setosa" to "0" and "virginica" to 1""
      train$Species<-ifelse(train$Species=="setosa",0,1)
      #select 1st, 2nd and 5th columns
      train <-subset(train,select = c(1,2,5))
      #--------------test dataset
      #select randomly 30% of setosa, generates a 15-by-5 matrix
      setosa_30<-setosa[sample(nrow(setosa),round(0.3*dim(setosa)[1])),]
      #select randomly 30% of virginica, generates a 15-by-5 matrix
      virginica_30<-virginica[sample(nrow(virginica),round(0.3*dim(virginica)[1])),]
      #merge setosa and virginica
      test<-rbind(setosa_30,virginica_30)
      #convert "setosa" to "0" and "virginica" to 1""
      test$Species<-ifelse(test$Species=="setosa",0,1)
      #select 1st, 2nd and 5th columns
      test <-subset(test,select = c(1,2,5))
      #merge "train" and "test"
      train_test<-rbind(train,test)
      #--Model_1--
      model <-glm(Species~., family = binomial(link = "logit"),data = train_test)
      # install.packages("ROCR")
      library(ROCR)
      p <- predict(model, newdata=test, type="response")
      pr <- prediction(p, test$Species)
      auc <- performance(pr, measure = "auc")
      auc <- auc@y.values[[1]]
      Cross.AUC[i]<-auc
    }
    
    cat('Mean AUC:', mean(Cross.AUC), '\n')
    

    【讨论】:

      猜你喜欢
      • 2018-08-30
      • 2020-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-21
      • 2023-01-04
      相关资源
      最近更新 更多