SGDClassifier和LR,SVM的区别

版权声明:本文为CSDN博主「tianbwin2995」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tianbwin2995/article/details/51853869

 

看了许多文献,以及最近的项目经验,终于真正地搞懂了LR。

以前总听大家说,看你对机器学习搞得透彻不透彻,就看你逻辑回归理解得怎么样;自己是统计出身的我,一直很有自信,以为无非就是个极大似然估计,求那个似然函数的极大值而已。然而实际上,这个之中也有很多的说法在里面,比如,求参数的方法。

在逻辑回归中,我们极大似然估计的参数是可以通过“极大化该参数值”得到的,然而得到参数之后,并不代表我们就完成了,因为成千上万的样本,我们的参数要“收敛”才是一个稳定的model。

那么问题来了,怎样更新我的参数,让其收敛呢? 
有两种方式:在sklearn的LogisticRegression里,是通过每次增加负样本权重【】的方式,让样本“重新排列”,之后得到了一个新的theta,直到两次样本基本上都不怎么变。 
在sklearn里,还有一个分类器,之前一直没搞懂,感觉跟logistic回归的结果啊,目的啊都是一样的啊,那么它出现的意义是什么? 
后来我重新读了一遍,发现LR那里面的参数没有学习率,衰减率,等等。

让我突然意识到这个LR的参数好像不是通过梯度下降求的。

后面这个SGDClassification,里面有learning rate,有decay等等,后来发现,是通过真正的梯度下降来求参的。【名称也就是“随机梯度下降”】

然后,看见许多人都说,在大规模数据下,基本上都要用到梯度下降的方法。

【以下转自“机器学习算法一览,应用建议与解决思路 ”】

3.3 关于大数据样本集和高维特征空间

我们在小样本的toy dataset上,怎么捣鼓都有好的方法。但是当数据量和特征样本空间膨胀非常厉害时,很多东西就没有那么好使了,至少是一个很耗时的过程。举个例子说,我们现在重新生成一份数据集,但是这次,我们生成更多的数据,更高的特征维度,而分类的类别也提高到5。 
3.3.1 大数据情形下的模型选择与学习曲线

在上面提到的那样一份数据上,我们用LinearSVC可能就会有点慢了,我们注意到机器学习算法使用图谱推荐我们使用SGDClassifier。其实本质上说,这个模型也是一个线性核函数的模型,不同的地方是,它使用了随机梯度下降做训练,所以每次并没有使用全部的样本,收敛速度会快很多。再多提一点,SGDClassifier对于特征的幅度非常敏感,也就是说,我们在把数据灌给它之前,应该先对特征做幅度调整,当然,用sklearn的StandardScaler可以很方便地完成这一点。

SGDClassifier每次只使用一部分(mini-batch)做训练,在这种情况下,我们使用交叉验证(cross-validation)并不是很合适,我们会使用相对应的progressive validation:简单解释一下,estimator每次只会拿下一个待训练batch在本次做评估,然后训练完之后,再在这个batch上做一次评估,看看是否有优化。 
【转载结束】

然后,在VW中,实际上也就是优化了一个SGD,因为VW里的参数基本上都是各种学习率。

所以说,我理解,VW实际上就是一个优化了的,通过梯度下降的方法来解决各种求解loss function的分类器。

如果loss function是hinge loss 那么就是SVM

如果是log 那就是LR

如果是square 平方误差,那么就是线性回归

如果是quantile,那么就是求解中位数的线性回归

如果是0-1损失 就是说“计数缺失了多少”,那么【在vw后面加binary】

【以下转自知乎】 
1.数据集很大还是优先考虑 SGD regressor。 
尤其特别大数据集,SGD外,几乎别无他法。跑不动。 
2.不是特别特别大的, 
先试试岭回归或linear kernal的SVR。 
3.不管用,换RBF kernal或者Ensemble regressor。 
4.如果有important features要先feature selection,则适用Lasso,ElasticNet。同样是指非特大数据集。

作者:Fu Tiffany 
链接:https://www.zhihu.com/question/21704547/answer/74404131 
来源:知乎 
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

总结

用自己语言总结一下,可能不全面,有机会再补充: 
1. LR有两种求参数的方法,一种是梯度下降,一种是改变正负样本权重。梯度下降的时候,把特征归一化会有利于梯度的下降【参见知乎:为什么 feature scaling 会使 gradient descent 的收敛更好?https://www.zhihu.com/question/37129350】扁平的梯度下降的方向不是真正速率最快的方向。 
2. FTRL用的就是随机梯度下降SGD(OGD)的方法,它不同点在于每个特征都是独立随机下降的。而且会根据某个特征出现的比例来加载权重的。因此会导致某几个特征出现的值很大,影响评分。【因为负样本的存在】 
3. LR输出的是样本的概率 
4. BFGS用的是拟牛顿的办法,模仿了逆hessian矩阵。避免了存储逆hessian矩阵。 
5. LR和SVM的区别:SVM寻求的是一个超平面,因此并不是每个样本都对其平面有影响;LR是每个样本点对超平面都有影响。SVM是无法输出概率的,得到的也是距离超平面的一个距离的函数。【libsvm也是一个距离的测度,求解的时候也是转换成lr再求解的】 
6. SVM必须中心化,因为这是跟“距离”有关的,不正规化之后会出问题 
7. LR的损失函数是log loss SVM的损失函数是hinge LOSS
————————————————

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SGDClassifier()的默认参数如下: loss='hinge', penalty='l2', alpha=0.0001, l1_ratio=0.15, fit_intercept=True, max_iter=None, tol=None, shuffle=True, verbose=0, epsilon=0.1, n_jobs=None, random_state=None, learning_rate='optimal', eta0=0.0, power_t=0.5, early_stopping=False, validation_fraction=0.1, n_iter_no_change=5, class_weight=None, warm_start=False, average=False. ### 回答2: SGDClassifier()是scikit-learn中的一个分类器模型,它基于随机梯度下降(Stochastic Gradient Descent,SGD)算法实现。SGD算法是一种常用的优化算法,用于解决大规模机器学习问题。 SGDClassifier()的默认参数如下: 1. loss='hinge':损失函数的选择,默认为hinge函数,用于最小化分类错误的数量。除了'hinge'之外,还可以选择其他损失函数,例如'log'(对数损失)和'perceptron'(感知器损失)。 2. penalty='l2':正则化项的选择,默认为L2正则化。L2正则化通过惩罚参数的平方和来防止过拟合。此外,还可以使用'L1'正则化以提高模型的稀疏性。 3. alpha=0.0001:正则化项的强度,默认为0.0001。较小的alpha值将导致更强的正则化,有助于防止过拟合。 4. l1_ratio=0.15:L1正则化项在正则化中的占比,默认为0.15。l1_ratio的值越小,使用L2正则化的比例越大,反之则越大。 5. fit_intercept=True:是否应该在计算中使用截距,默认为True。如果设置为True,则模型将会自动添加一个截距项。 6. max_iter=1000:最大迭代次数,默认为1000。模型在达到最大迭代次数之前会尝试找到最佳参数。 7. tol=1e-3:优化算法的停止容忍度,默认为1e-3。如果更新的参数小于tol的值,优化过程将会停止。 总结来说,SGDClassifier()的默认参数选择了适用于大规模机器学习问题的合理选项。根据具体问题的特点,我们可以根据需要调整这些参数来获得更好的模型性能。 ### 回答3: SGDClassifier()是Scikit-learn库中的一个分类器,它基于随机梯度下降算法进行训练。下面是SGDClassifier()的默认参数: 1. loss参数默认为'hinge',这是一种用于线性SVM的损失函数。它对应于hinge损失,可以将样本正确分类的边际最小化,以最大程度地确保分类的准确性。 2. penalty参数默认为'l2',这是一种正则化项,用于防止模型过拟合。它采用L2范数,对模型的权重进行约束,以避免过多依赖于特定的样本。 3. alpha参数默认为0.0001,这是随机梯度下降算法的学习率。它控制模型更新的步长,过高的值可能导致在每次迭代中跳过最优解,而过低的值可能导致收敛速度过慢。 4. fit_intercept参数默认为True,它指示模型是否要训练一个截距项。截距项可以考虑到数据中的偏移,以更好地拟合数据。 5. max_iter参数默认为1000,它指定了随机梯度下降算法的最大迭代次数。当达到最大迭代次数时,算法将停止训练。 6. shuffle参数默认为True,它指示是否在每次迭代之前重新洗牌训练数据。重新洗牌可以消除数据中的顺序模式,有助于更好地拟合数据。 7. random_state参数默认为None,它控制随机数生成器的种子,以确保每次运行的结果是一致的。 综上所述,SGDClassifier()的默认参数为使用'hinge'损失函数、L2正则化、学习率为0.0001、训练截距项、最大迭代次数为1000、每次迭代前重新洗牌数据,并且不设置随机数种子。根据具体的需求,我们可以根据数据的特点和实际情况来调整这些默认参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值