优化 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 <- 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值(优化版)