优化 e1071 封装中的 F 分数

Posted

技术标签:

【中文标题】优化 e1071 封装中的 F 分数【英文标题】:Optimize F-score in e1071 package 【发布时间】:2015-05-29 09:41:24 【问题描述】:

我正在尝试使用 R 中的 e1071 包来实现一个类 SVM。有人可以告诉我如何使用网格搜索优化 F 分数吗?

我尝试了 tune.svm 功能,但它只导致高灵敏度或高特异性。

我试图预测的正类百分比在普通人群中约为 1-2%。

我得到的结果准确率很高,但 F 分数很低:

             Reference
Prediction    members Not members
  members           1           4
  Not members      12         983

           Accuracy : 0.984           
             95% CI : (0.9741, 0.9908)
No Information Rate : 0.987           
P-Value [Acc > NIR] : 0.83691         

              Kappa : 0.1046          

Mcnemar 检验 P 值:0.08012

        Sensitivity : 0.07692         
        Specificity : 0.99595 

这是我的代码的 sn-ps:

tuned <- tune.svm(fo, data = df, 
                  nu =  0.001:0.5,
                  gamma = 10^(-2:0), 
                  type='one-classification'                 
                  );

model <-     svm(fo, data = df , 
                   nu = tuned$best.parameters$nu, 
                   gamma = tuned$best.parameters$gamma,
                   type='one-classification'
                 );

【问题讨论】:

【参考方案1】:

您可以提供 tune.svm 方法的 tunecontrol 参数。

它接受tunecontrol 类的对象。

然后您需要创建具有所需参数的对象。 通过在构建此对象时指定 error.fun 参数,您可以定义要使用的错误函数。

error.fun: 返回要最小化的误差度量的函数。它有两个参数:一个真实值向量和一个预测值向量。如果为 NULL,则误分类误差用于分类预测,均方误差用于数值预测。

因此,放置一个计算 F-Score 的函数应该可以完成这项工作。

【讨论】:

我修改了我的代码,添加了一个计算 F 分数的函数,还修改了 tune 函数:tuned 对不起,因为我对堆栈溢出比较陌生,不知道如何将我的整个代码放在这里的 cmets 中。 tuned &lt;- tune.svm(fo, data = df, nu = 2^(-5:-0.5), gamma = 2^(-6:0), tunecontrol = tune.control(sampling = "cross",performances = TRUE, error.fun = FscoreErr(y,prediction)), type='one-classification' `)

以上是关于优化 e1071 封装中的 F 分数的主要内容,如果未能解决你的问题,请参考以下文章

python封装configparser模块获取conf.ini值(优化版)

Linux企业运维——Docker镜像封装及优化

简单的INI解析封装

Mybatis学习笔记-增删改的操作 -对SqlSession的优化封装-优化代码

如何在 F-beta 分数中选择 beta

优化JDBC封装