gpt4 book ai didi

Python 机会 : how to pass additional arguments to optimization routines

转载 作者:太空宇宙 更新时间:2023-11-03 11:01:50 27 4
gpt4 key购买 nike

背景

我正在使用支持向量机对不平衡类进行二元分类(即我的训练集中正负标签的比例约为 100)。我想优化以下参数: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 不采用任何额外的关键字参数(Xy)。我已经尝试了上述的不同变体,但无法弄清楚如何将不应优化的其他参数传递给例程。

据我所知,我不能使用 scikit-learn 的网格搜索,因为我想优化 m 参数,这对估算器来说不是“固有的”。任何人都可以指出一个解决方案或其他 python 包来进行网格搜索吗?

最佳答案

回答实际问题前的几点评论:

  1. 当使用 RBF 内核时,您确实必须调整 gamma 以获得好的结果。仅调整错误分类惩罚(C权重)是不够的。
  2. main API functionsoptunity.maximizeoptunity.minimizeoptunity.optimize,而不是您正在使用的特定于求解器的方法。尽管两者都提供相似的功能,但 API 函数可能更易于使用。
  3. 对于真正的调整任务,我强烈建议使用默认的粒子群优化器而不是网格搜索。您将以更少的函数评估(= 时间)获得更好的结果。
  4. 使用 Optunity 的交叉验证工具可能比使用 scikit-learn 的工具更容易。不过,这完全是可选的。您可以找到有关此的更多信息 here .
  5. 超参数 mw 有点多余。如果您要优化类(class)权重,则不必平衡类(class)。我会停止优化类(class)平衡(为此你必须在 - 或过采样 = 改变你的数据)。

解决方案

您为 optimize 指定的函数必须是目标函数,这意味着此函数的唯一参数必须是您要优化的超参数。有关这方面的更多信息,请参阅 Optunity's paper .在您的具体示例中,这意味着参数应为 cmw

要修复 Xy,您可以使用任何标准的 Python 方法,例如 functools.partial 或闭包。在我看来,闭包是最干净的方法:

def fix_data(X_fixed, y_fixed):
def svm_acc(m, w, c):
X, y = balanceClasses(X_fixed, y_fixed, 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() )

return svm_acc

函数 fix_data 修复了某个数据集 X_fixedy_fixed 并根据需要生成一个仅将超参数作为参数的函数.然后你可以做这样的事情(假设你已经构建了求解器等):

svm_acc_with_fixed_data = fix_data(X, y)
best_pars, _ = s.optimize(svm_acc_with_fixed_data)

关于Python 机会 : how to pass additional arguments to optimization routines,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30990342/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com