【问题标题】:ROC for random forest随机森林的 ROC
【发布时间】:2015-09-16 18:21:18
【问题描述】:

我知道ROC 是在tpr 和fpr 之间绘制的,但我很难确定应该改变哪些参数以获得不同的tpr/fpr 对。

【问题讨论】:

    标签: random-forest roc


    【解决方案1】:

    我在一个类似的问题上写了这个answer。

    基本上,您可以增加某些类的权重和/或对其他类进行下采样和/或更改投票聚合规则。

    [[编辑于 2015 年 7 月 1 日欧洲中部时间下午 13 点 15 分]] @“两个班级很平衡——Suryavansh”

    在这种情况下,您的数据是平衡的,您应该主要使用选项 3(更改聚合规则)。在 randomForest 中,这可以在训练或预测时使用截止参数访问。在其他设置中,您可能必须自己从所有树中提取所有经过交叉验证的投票,应用一系列规则并计算结果 fpr 和 fnr。

    library(randomForest)
    library(AUC)
    
    #some balanced data generator
    make.data = function(obs=5000,vars=6,noise.factor = .4) {
      X = data.frame(replicate(vars,rnorm(obs)))
      yValue = with(X,sin(X1*pi)+sin(X2*pi*2)^3+rnorm(obs)*noise.factor)
      yClass = (yValue<median(yValue))*1
      yClass = factor(yClass,labels=c("red","green"))
      print(table(yClass)) #five classes, first class has 1% prevalence only
      Data=data.frame(X=X,y=yClass)
    }
    
    #plot true class separation
    Data = make.data()
    par(mfrow=c(1,1))
    plot(Data[,1:2],main="separation problem: predict red/green class",
         col = c("#FF000040","#00FF0040")[as.numeric(Data$y)])
    

    #train default RF
    rf1 = randomForest(y~.,Data)
    #you can choose a given threshold from this ROC plot
    plot(roc(rf1$votes[,1],rf1$y),main="chose a threshold from")
    

    #create at testData set from same generator
    testData = make.data() 
    
    
    #predict with various cutoff's 
    predTable = data.frame(
      trueTest = testData$y,
      majorityVote = predict(rf1,testData),
      #~3 times increase false red
      Pred.alot.Red = factor(predict(rf1,testData,cutoff=c(.3,.1))),
      #~3 times increase false green
      Pred.afew.Red = factor(predict(rf1,testData,cutoff=c(.1,.3)))
    )
    
    #see confusion tables
    table(predTable[,c(1,2)])/5000
            majorityVote
    trueTest    red  green
       red   0.4238 0.0762
      green 0.0818 0.4182
    

    .

    table(predTable[,c(1,3)])/5000
            Pred.alot.Red
    trueTest    red  green
        red   0.2902 0.2098
        green 0.0158 0.4842
    

    .

    table(predTable[,c(1,4)])/5000
             Pred.afew.Red
    trueTest    red  green
        red   0.4848 0.0152
        green 0.2088 0.2912
    

    .

    【讨论】:

    • 两个班级很平衡
    猜你喜欢
    • 2021-06-12
    • 2012-09-04
    • 2017-02-20
    • 2013-11-27
    • 2017-03-15
    • 2014-08-07
    • 2015-10-15
    • 2015-02-15
    • 2018-07-10
    相关资源
    最近更新 更多