【问题标题】:R: Apply SVM function for group by in data frameR:在数据框中对分组应用 SVM 函数
【发布时间】:2020-05-24 20:05:10
【问题描述】:

我有一个看起来像这样的数据框 (df):

   Value Country ID
1   21   RU    AAAU9001025
2   24   NG    AAAU9001848
3   17   EG    ACLU2799370
4   2    EG    ACLU2799370
5   56   RU    ACLU2799370 

我想针对每个国家/地区的值运行 SVM 分类器以检测异常值,并且基于相对较小的样本,我想指出它是否是每一行中的异常值。所以我的输出将是一个带有额外逻辑列的数据框,表明它是否是异常值:

    Value Country ID    SVM
1   21  RU  AAAU9001025 FALSE
2   24  NG  AAAU9001848 FALSE
3   17  EG  ACLU2799370 FALSE
4   2   EG  ACLU2799370 TRUE
5   56  RU  ACLU2799370 TRUE
6   25  EG  AMFU3022141 FALSE

我正在使用以下代码,但我无法创建所需的数据框:

lapply(split(df,df$Country), 
       function(x) {(e1071::svm(x$Value[1:(ifelse(nrow(x)<50000,nrow(x),50000))], 
                                nu=0.98, type="one-classification", kernel="polynomial"))
         })

请帮我解决这个问题,谢谢!

【问题讨论】:

    标签: r dataframe group-by svm


    【解决方案1】:

    模拟您的数据:

    NROWS = c(3000,6000,10000)
    names(NROWS)=c("RU","EG","NG")
    
    df = lapply(names(NROWS),function(i){
    data.frame(
    Value = c(rnorm(0.9*NROWS[i]),rpois(0.1*NROWS[i],5)),
    Country=i,
    ID = paste0(i,"_",1:NROWS[i])
    )
    })
    
    df = do.call(rbind,df)
    

    创建一个函数来执行 svm,因为您预测一个子集但返回所有内容..

    library(e1071)
    
    SVM_f = function(x,limit=5000){
    N = min(c(limit,length(x)))
    mdl = svm(x[sample(length(x),N)],
    nu=0.98, type="one-classification", kernel="polynomial")
    predict(mdl,x)
    }
    
    res = by(df,df$Country,function(x){
    data.frame(x,SVM = SVM_f(x$Value))
    })
    res = do.call(rbind,res)
              Value Country   ID   SVM
    RU.1  1.2802954      RU RU_1 FALSE
    RU.2 -2.7119588      RU RU_2 FALSE
    RU.3 -0.4856534      RU RU_3 FALSE
    RU.4 -0.5041824      RU RU_4 FALSE
    RU.5 -0.7043723      RU RU_5 FALSE
    RU.6  0.0472744      RU RU_6 FALSE
    

    您也可以使用 dplyr,但它可能会运行得慢一些:

    library(dplyr)
    df %>% group_by(Country) %>% mutate(SVM=SVM_f(Value))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      • 1970-01-01
      • 2020-10-03
      • 1970-01-01
      相关资源
      最近更新 更多