【问题标题】:Does calling Python Scikit classifier `.fit` method repeatedly effect anything?调用 Python Scikit 分类器 `.fit` 方法是否会重复产生任何影响?
【发布时间】:2016-12-23 06:38:47
【问题描述】:

我正在使用 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 方法之后的结果可能具有不公平的优势——它们的优化起点非常接近良好的决策边界。

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 啊.. 二次优化问题具有唯一的全局最小值?!那是你陈述的证据吗?另外,很好的答案。你说这是一个有争议的问题,因为我们总是处于最好的情况。
    • @travelingbones svm-problem 的解决方案不一定是唯一的,但在这里无关紧要。事实上,它是一个凸优化问题,导致许多算法接近全局最小值。但这仅适用于某些算法(例如现成的 QP 求解器、坐标下降、SMO 等)。当前流行的基于 SGD 的方法(通常用于海量数据)可能会因某些元参数(最简单:没有足够的迭代/时期和学习率)而失败。
    • @travelingbones 这种证明可以在任何用于数值分析的书中找到。凸函数具有唯一的(就值而言)最小值(并且在坐标方面也严格凸出唯一的)。与 sascha 的建议相反——这也适用于 svm 问题——它有一个独特的解决方案。然而,由于数值近似和缺乏精度 - 实际实现不会收敛到实际的全局解决方案,而只是“足够接近”(值得注意的是,这对于任何类型的迭代优化都是如此)。
    • @lejlot:感谢您的确认。知道凸函数的数学。想确定这是这里的原因。
    猜你喜欢
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    相关资源
    最近更新 更多