我在使用scikit的SVM,并且我想测试一个SVM模型,既使用自定义的sample_weights
传递给分类器,又使用sample_weights
为每个样本默认值1
的常规实现。(sample_weight
允许用户对某些样本赋予更大的影响力。)所以工作流程是标准的——将每个模型拟合到训练子集上,然后在保留的开发集上测试每个模型,以确定是否应该使用权重。我的代码如下:
clf = svm.SVC(kernel = 'rbf', gamma = .001) ## 初始化模型 - 我只做一次!
clf.fit(X_train, y_train) ## 拟合模型/进行优化
accuracy[name + "_no_weights"] = clf.score(X_test, y_test) ## 存储结果
clf.fit(X_train, y_train, sample_weight = sample_weight_test) ## 拟合模型/使用不同的正则化进行优化
accuracy[name + "_w_weights"] = clf.score(X_test, y_test) ## 存储结果
请注意,如果我要测试使用哪个内核,我需要通过重新定义clf
来重新初始化分类器。关键是,上述情况下我是在训练同一个分类器,但没有重新初始化分类器。因此,在第二次调用.fit
时,其参数可能已经初始化(不是随机的,而是来自之前的训练)。这意味着第二次.fit
方法后的结果可能具有不公平的优势——它们的优化起点非常接近一个好的决策边界。
有谁知道这是如何运作的,或者有什么建议吗?
回答:
这对SVM来说根本不重要,因为它总是收敛到全局最小值。它不会“围绕好的解决方案开始”,SVM不是神经网络——它不需要好的初始化。换句话说——你可以随意多次调用fit
,并且不需要重新初始化分类器。在sklearn的情况下,这一点更为明显,因为它的.fit
方法甚至不传递当前的拉格朗日乘数,它只是调用外部的、低级的SVM求解器实现。