重复调用 Python Scikit 分类器 `.fit` 方法有什么影响吗?

Does calling Python Scikit classifier `.fit` method repeatedly effect anything?

我正在使用 scikit SVM,我想用 sample_weights 自定义并传递给分类器的 SVM 测试 SVM,并再次使用通常的实现,其中 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 方法后的结果可能具有不公平的优势——它们的优化起点非常接近良好的决策边界。

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

这对 SVM 来说根本不重要,因为它总是收敛到全局最小值。它没有 "start around good solution",SVM 不是神经网络——它不需要很好的初始化。换句话说 - 您可以调用 fit 多次,而不必重新初始化分类器。在 sklearn 的情况下,它更加明显,因为它的 .fit 方法甚至不传递当前的拉格朗日乘数,它只是调用 SVM 求解器的外部低级实现。