R:在数据框中对分组应用 SVM 函数
R: Apply SVM function for group by in data frame
我有一个看起来像这样的数据框 (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"))
})
请帮我解决这个问题,谢谢!
模拟你的数据:
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,因为你预测的是一个子集,但 return 一切..
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))
我有一个看起来像这样的数据框 (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"))
})
请帮我解决这个问题,谢谢!
模拟你的数据:
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,因为你预测的是一个子集,但 return 一切..
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))