背景
我正在使用支持向量机来进行二分类,但我的训练数据中正负标签的比例不平衡(即正标签与负标签的比例约为100:1)。我希望优化以下参数:m(我从训练数据中抽取的正标签与负标签的比例)、w(类别权重)和SVM参数C。
问题
我想通过网格搜索来优化这些参数,并将得分函数定义如下:
def svm_acc(X, y, m, w, c):
X, y = balanceClasses(X, y, m)
clf = svm.SVC(kernel='rbf', C=c, class_weight = {1: w})
scores = cross_validation.cross_val_score(clf, X, y, 5)
return( scores.mean() )
其中X是特征矩阵,y是二元分类标签,svm_acc
返回5折交叉验证的平均准确率。我已经在optunity中尝试了以下方法:
import optunity as opt
s = opt.solvers.GridSearch(mult=[1,10], w=[1,10], c=[1,10])
best_pars, _ = s.optimize(svm_acc, X=X, y=y)
但是我遇到了这个错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: optimize() got an unexpected keyword argument 'X'
我从文档中了解到
optimize
不需要任何额外的关键字参数(X
和y
)。我尝试了上述代码的不同变化,但一直无法弄清如何传递不应该被优化到程序中的其他参数。据我所知,我不能使用scikit-learn的gridsearch,因为我想优化
m
参数,这个参数不是估计器的内在属性。是否有人可以指点我找到解决方案,或者其他用于进行网格搜索的Python包?