调用Python Scikit分类器`.fit`方法会反复影响吗?

时间:2016-08-16 18:56:28

标签: python machine-learning scikit-learn svm libsvm

我正在使用scikit SVM,我想测试一个SVM,同时将sample_weights自定义并传递给分类器,再次使用通常的实现,其中sample_weights是每个样本的默认值1。 (sample_weight允许用户给某些样本带来比其他样本更大的影响。)因此,工作流是标准的 - 将每个模型拟合到训练子集,在持久的开发集上测试每个模型以查看是否应该使用权重或不。我的代码是这样的:

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时它的参数已经初始化(不是随机的,而是来自之前的训练)。这意味着在第二个.fit方法之后的结果可能具有不公平的优势 - 它们的优化起点非常接近良好的决策边界。

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

1 个答案:

答案 0 :(得分:1)

这对于SVM来说无关紧要,因为它始终收敛于全局最小值。它不是“从良好的解决方案开始”,SVM不是神经网络 - 它不需要良好的初始化。换句话说 - 您可以调用适合您想要的次数,而不必重新初始化分类器。在sklearn的情况下,它更加明显,因为它的.fit方法甚至没有通过当前的拉格朗日乘数,它只是调用SVM求解器的外部低级实现。