2016-08-16 75 views
0

我正在使用scikit SVM,我想测试一个支持定制的sample_weights并传递给分类器的SVM,并且再次使用通常的实现方式,其中sample_weights是每个样本的默认值1。 (sample_weight允许用户给一些样本比其他样本更大的影响)。因此,工作流是标准的 - 将每个模型适合于一个训练子集,在一个持续开发集上测试每个模型,看看我是否应该使用权重。我的代码是这样的:如果调用Python Scikit分类器`.fit`方法是否反复生效?

clf = svm.SVC(kernel = 'rbf', gamma = .001) ## initialize the model- i only do this once! 

clf.fit(X_train, y_train) ## fit the model/do the optimization 
accuracy[name + "_no_weights"] = clf.score(X_test, y_test) ## store results 

clf.fit(X_train, y_train, sample_weight = sample_weight_test) ## fit the model/do the optimization w/ different regularization 
accuracy[name + "_w_weights"] = clf.score(X_test, y_test) ## store results 

通知我是测试使用的内核我将不得不重新定义clf重新初始化分类。重点是,上面我在两种情况下训练相同的分类器,但我不重新初始化分类器。所以可能是我第二次打电话.fit它的参数已经初始化(不是随机的,而是以前的训练)。这意味着在第二种方法可能具有不公平的优势后,结果 - 他们的优化起点非常接近良好的决策边界。

有人知道这是如何工作或有建议吗?

回答

1

这对SVM无关紧要,因为它总是收敛到全局最小值。它不是“围绕好的解决方案开始”,SVM不是一个神经网络 - 它不需要一个好的初始化。换句话说 - 您可以调用适合的次数,而不必重新初始化分类器。在sklearn的情况下,它甚至更加明显,因为它的.fit方法甚至不通过当前的拉格朗日乘子,它只是简单地调用外部的,低层次的SVM求解器。

+0

Ahh ..二次优化问题有独特的全局min ?!这是你的陈述证明吗?另外,很好的答案。你说这是一个有争议的问题,我们总是处于最好的情况。 – travelingbones

+0

@travelingbones svm-problem的解决方案并不一定是唯一的,但在这里并不重要。事实上,这是一个凸优化问题,导致许多算法接近全局最小值。但是,对于一些算法(例如现成的QP解算器,坐标下降,SMO等)来说只有这样。当前流行的基于SGD的方法(通常用于大数据)可能会因某些元参数(最简单:没有足够的迭代/时代和学习速率)而失败。 – sascha

+1

@travelingbones这种证明你可以在任何书中找到数值分析。凸函数具有唯一的(根据值)最小值(并且在坐标方面严格凸出一个唯一的)。与sascha建议相反 - 这也适用于svm问题 - 它有一个独特的解决方案。然而,由于数值逼近和缺乏精度 - 实际实现不会收敛到实际的全局解决方案,而只是“足够接近”(值得注意的是,对于任何类型的迭代优化来说都是如此)。 – lejlot

相关问题