scikit-learn:SVC 和 SGD 有什么区别?
scikit-learn: what is the difference between SVC and SGD?
支持向量机:http://scikit-learn.org/stable/modules/svm.html#classification
新加坡元:http://scikit-learn.org/stable/modules/sgd.html#classification
我的眼睛看起来和他们写的一样"an SGD implements a linear model"。有人可以解释一下它们之间的区别吗?
SVM 是一个 support-vector machine 而 是一个特殊的线性模型 。从理论上看,这是一个 凸优化问题 ,我们可以在多项式时间内获得全局最优解。 有许多不同的优化方法。
以前大家用的一般Quadratic Programming solvers. Nowadays specialized approaches like SMO其他的都用
sklearn 的专用 SVM 优化器基于 liblinear and libsvm。如果你对算法感兴趣,这里有很多文档和研究论文。
请记住,SVC (libsvm) 和 LinearSVC (liblinear) 对优化问题做出了不同的假设,这导致同一任务的不同性能(线性内核:LinearSVC 比 SVC 更有效一般情况下;但有些任务无法由 LinearSVC 处理)。
SGD 是一种基于Stochastic Gradient Descent(这是一种通用优化方法!)的优化器,可以优化许多不同的凸优化问题(实际上:这或多或少是相同的方法在所有这些深度学习方法中使用;所以人们也在非凸设置中使用它;抛弃理论保证)。
sklearn 说:随机梯度下降 (SGD) 是一种简单但非常有效的方法,可以在凸损失函数下对线性分类器进行判别式学习。现在它实际上更加通用,但在这里足以注意到它包含(某些)SVM、逻辑回归和其他。
现在基于 SGD 的优化与 QP 和其他优化有很大不同。如果以 QP 为例,没有可调整的超参数。这有点简化,因为可以进行调整,但不需要保证收敛性和性能! (QP 求解器的理论,例如 Interior-point method 更稳健)
基于 SGD 的优化器(或一般的 一阶方法)很难调整!他们需要调整!学习率或学习时间表通常是要考虑的参数,因为收敛取决于这些(理论和实践)!
这是一个非常复杂的话题,但是一些简化的规则:
专门的 SVM 方法
- 样本数量越多规模越小
- 不需要超参数调优
基于 SGD 的方法
- 一般情况下可以更好地扩展大数据
- 需要超参数调优
- 仅解决上述可接近的任务的子集(无内核方法!)
我的意见:根据您的时间预算,使用(更易于使用的)LinearSVC,只要它能正常工作!
澄清一下:我强烈建议获取一些数据集(例如从 sklearn 中获取)并在这些候选者之间进行一些比较。参数调整的需要不是理论上的问题!您会很容易地看到 SGD 案例中的非最佳 (objective / loss) 结果!
永远记住:随机梯度下降对特征缩放很敏感 docs。这或多或少是一阶方法的结果。
SVC(SVM) 使用基于内核的优化,其中,输入数据被转换为复杂数据(未分解),并被扩展从而识别 类 之间更复杂的边界。 SVC 可以进行线性和非线性分类
SVC可以通过设置核参数为'linear'进行线性分类
svc = SVC(内核='linear')
SVC 可以执行非线性分类 通过将内核参数设置为 'poly' , 'rbf'(默认)
svc = SVC(内核='poly')
svc = SVC(内核='rbf')
SGDClassifier使用梯度下降优化技术,其中,最优系数通过迭代过程确定。 SGDClassifier 只能进行线性分类
当参数损失设置为'hinge'(默认值)时,SGDClassifer 可以使用线性 SVC(SVM) 模型,即 SGDClassifier(loss='hinge')
支持向量机:http://scikit-learn.org/stable/modules/svm.html#classification
新加坡元:http://scikit-learn.org/stable/modules/sgd.html#classification
我的眼睛看起来和他们写的一样"an SGD implements a linear model"。有人可以解释一下它们之间的区别吗?
SVM 是一个 support-vector machine 而 是一个特殊的线性模型 。从理论上看,这是一个 凸优化问题 ,我们可以在多项式时间内获得全局最优解。 有许多不同的优化方法。
以前大家用的一般Quadratic Programming solvers. Nowadays specialized approaches like SMO其他的都用
sklearn 的专用 SVM 优化器基于 liblinear and libsvm。如果你对算法感兴趣,这里有很多文档和研究论文。
请记住,SVC (libsvm) 和 LinearSVC (liblinear) 对优化问题做出了不同的假设,这导致同一任务的不同性能(线性内核:LinearSVC 比 SVC 更有效一般情况下;但有些任务无法由 LinearSVC 处理)。
SGD 是一种基于Stochastic Gradient Descent(这是一种通用优化方法!)的优化器,可以优化许多不同的凸优化问题(实际上:这或多或少是相同的方法在所有这些深度学习方法中使用;所以人们也在非凸设置中使用它;抛弃理论保证)。
sklearn 说:随机梯度下降 (SGD) 是一种简单但非常有效的方法,可以在凸损失函数下对线性分类器进行判别式学习。现在它实际上更加通用,但在这里足以注意到它包含(某些)SVM、逻辑回归和其他。
现在基于 SGD 的优化与 QP 和其他优化有很大不同。如果以 QP 为例,没有可调整的超参数。这有点简化,因为可以进行调整,但不需要保证收敛性和性能! (QP 求解器的理论,例如 Interior-point method 更稳健)
基于 SGD 的优化器(或一般的 一阶方法)很难调整!他们需要调整!学习率或学习时间表通常是要考虑的参数,因为收敛取决于这些(理论和实践)!
这是一个非常复杂的话题,但是一些简化的规则:
专门的 SVM 方法
- 样本数量越多规模越小
- 不需要超参数调优
基于 SGD 的方法
- 一般情况下可以更好地扩展大数据
- 需要超参数调优
- 仅解决上述可接近的任务的子集(无内核方法!)
我的意见:根据您的时间预算,使用(更易于使用的)LinearSVC,只要它能正常工作!
澄清一下:我强烈建议获取一些数据集(例如从 sklearn 中获取)并在这些候选者之间进行一些比较。参数调整的需要不是理论上的问题!您会很容易地看到 SGD 案例中的非最佳 (objective / loss) 结果!
永远记住:随机梯度下降对特征缩放很敏感 docs。这或多或少是一阶方法的结果。
SVC(SVM) 使用基于内核的优化,其中,输入数据被转换为复杂数据(未分解),并被扩展从而识别 类 之间更复杂的边界。 SVC 可以进行线性和非线性分类
SVC可以通过设置核参数为'linear'进行线性分类 svc = SVC(内核='linear')
SVC 可以执行非线性分类 通过将内核参数设置为 'poly' , 'rbf'(默认) svc = SVC(内核='poly') svc = SVC(内核='rbf')
SGDClassifier使用梯度下降优化技术,其中,最优系数通过迭代过程确定。 SGDClassifier 只能进行线性分类
当参数损失设置为'hinge'(默认值)时,SGDClassifer 可以使用线性 SVC(SVM) 模型,即 SGDClassifier(loss='hinge')