超参数调整一类SVM

我正在寻找一种使用高斯(RBF)内核为一类SVM自动选择超参数的软件包或“最佳实践”方法。我目前正在R中实现libsvm的一类svm,因此最好是一种包含该类或至少R的方法。


编辑

仅举一个我正在寻找的例子,我们有虹膜数据集,我们将其中一种作为肯定案例。一种方法是用nu和gamma的不同选择构建一类SVM,然后针对否定情况(其他花朵类型)验证模型的准确性。见下文:

library(datasets)
library(data.table)
library(e1071)
#load the iris data
data(iris)
#separate positive and negative cases
positive_cases <- iris[iris$Species=="virginica",1:4]
negative_cases <- iris[iris$Species!="virginica",1:4]
#get hyperparameter choices
hyp_param_choices <- setDT(expand.grid("nu"=seq(.1,.3,by=.1),"gamma"=1*10^seq(-2,2,by=1)))
hyp_param_choices[,err:=0]

for(hyp_i in 1L:nrow(hyp_param_choices)){
  tuned <- svm(x=positive_cases,y=rep(T,nrow(positive_cases)),#True as they are all in the positive class
               nu =  hyp_param_choices[hyp_i,nu],gamma = hyp_param_choices[hyp_i,gamma],type='one-classification',scale=T #scale the data
  )
  svm_neg_pred <- predict(tuned,#predict the negative classes,should all be false
                          negative_cases)
  #error is sum of svm_neg_pred as this counts all the positives .i.e false positive cases divided by total number of negatives
  set(hyp_param_choices,i=hyp_i,j="err",value=(sum(svm_neg_pred)/nrow(negative_cases)))
}
setorder(hyp_param_choices,err)
print(hyp_param_choices)
     nu gamma  err
 1: 0.1 1e+00 0.00
 2: 0.2 1e+00 0.00
 3: 0.3 1e+00 0.00
 4: 0.1 1e+01 0.00
 5: 0.2 1e+01 0.00
 6: 0.3 1e+01 0.00
 7: 0.1 1e+02 0.00
 8: 0.2 1e+02 0.00
 9: 0.3 1e+02 0.00
10: 0.3 1e-02 0.01
11: 0.2 1e-01 0.01
12: 0.2 1e-02 0.02
13: 0.3 1e-01 0.02
14: 0.1 1e-01 0.03
15: 0.1 1e-02 0.05

实际上,我的问题在训练数据中有一些误报。我们可以将其合并到示例中,方法是将一个负样本添加到正样本中,然后从验证测试中排除这些负样本,然后重新运行:

positive_cases <- rbind(iris[iris$Species=="virginica",1:4],iris[iris$Species!="virginica",1:4][sample(nrow(iris[iris$Species!="virginica",]),10),])

我正在寻找另一种方法来选择论文中最好的一类超参数,否则有某种理由是一种好的方法。


为了提供一些背景知识,我了解了Scholkopf et al.一类SVM的原始实现,并且了解了该方法的目的是将一类数据映射到与内核和使用超平面将它们与原点分开,以最大的余量。在这种意义上,起源可以被认为是所有其他类别。我也知道Tax & Duin引入了SVDD。这里的目标是创建尽可能小的数据包围球。通过这种方法,范围以外的所有点都是其他类别/异常值。我也知道,当使用高斯内核时,这两种方法可以得出等效的最小化函数。这两种方法都使用软边距,也允许在一类中分类错误的案例。因为它们是等效的,所以我只会谈论OC-SVM,但是使用SVDD作为答案的方法也将不胜感激!

因此,在我的问题中,我的一类是正例,我想针对与错误分类的例(假阳性)和高斯核的宽度伽马有关的比例优化nu。在我的问题中,我知道会出现误报,这是问题的本质,无法被发现。我还想在不同的数据集上应用多个OC-SVM,因此我需要一种自动方法来根据相关数据集中存在的异常值比例和数据的潜在特征来调整nu和gamma。

由于这个问题基本上是无监督的,所以我显然不能以正常的方式使用nu和γ范围的CV,因为这样将选择距原点距离最小的解决方案。请注意,我确实有负面案例,但宁愿在验证步骤中尽可能地将它们保留下来,好像根本不为什么要麻烦一类方法,为什么不使用常规的两类分类方法呢?

我的问题是,是否有人在R中找到了用于执行此操作的软件包或方法?我知道科学文献中有很多方法,包括非常有前途的方法:DTLhere,但是这些似乎没有可用的代码,除非伪代码以及如何将其转换为R并将其与例如,libsvm对于我当前的能力来说似乎是一大进步。

任何帮助或建议将不胜感激!

iCMS 回答:超参数调整一类SVM

您的问题与svm的实施有关。在这里,我在svm上下文下方包括了RBF的草图。本文中的实现使用caret,并且该方法取自kernlab包。接下来是使用iris数据集和Species多项式的示例。我草绘了训练方面的内容,但是可以在测试集上使用predict()和来自同一caret或多类auroc的混淆矩阵来轻松完成测试。

该方法还考虑与cv=10进行交叉验证:

#Some libraries
library(rsample)
library(caret)
library(visdat)
library(recipes)
#Data
data(iris)
# Create training (70%) and test (30%) sets
set.seed(123)
split_strat <- initial_split(iris,prop = 0.7,strata = 'Species')
train_strat <- training(split_strat)
test_strat <- testing(split_strat)

#Tuning a SVM model

# Tune an SVM with radial basis kernel
set.seed(1854) # for reproducibility
model_svm <- caret::train(
  Species ~ .,data = train_strat,method = "svmRadial",trControl = trainControl(method = "cv",number = 10),tuneLength = 10
)

# Plot results
ggplot(model_svm) + theme_light()

enter image description here

您可以更深入地研究寻找kernlab的方法,其中包括用于调整参数的更多选项,这些选项可以添加到caret框架中。我希望这对您有用。

本文链接:https://www.f2er.com/1853270.html

大家都在问