模型调参经验-LR、SVM、RF、GBDT、Xgboost、LightGBM

会调包其实是基础,过程中还能加深对模型的理解,发散优化的思路。总结一下sklearn和tensorflow两个框架中主流模型的调参经验,不定期补充。

LR

penalty,选择正则化方式:
主要为解决过拟合问题,一般penalty选择L2正则化就够了。但是如果选择L2正则化发现还是过拟合,即预测效果差的时候,就可以考虑L1正则化。另外,如果模型的特征非常多,我们希望一些不重要的特征系数归零,从而让模型系数稀疏化的话,也可以使用L1正则化。
penalty参数的选择会影响我们损失函数优化算法的选择。newton-cg, lbfgs和sag这三种优化算法时都需要损失函数的一阶或者二阶连续导数,因此不能用于没有连续导数的L1正则化,只能用于L2正则化。而liblinear通吃L1正则化和L2正则化。

solver,选择loss函数的优化算法:
1、liblinear:开源liblinear库实现,内部使用坐标轴下降法。
2、lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化。
3、 newton-cg:也是牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
4、sag:即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候,SAG是一种线性收敛算法,这个速度远比SGD快。

sag每次仅仅使用了部分样本进行梯度迭代,所以当样本量少的时候不要选择它,而如果样本量非常大,比如大于10万,sag是第一选择,其次两个牛顿法。但是sag不能用于L1正则化,所以当样本量大,又需要L1正则化的话就要做取舍。

liblinear也有自己的弱点,对于多元逻辑回归常见的one-vs-rest(OvR)和many-vs-many(MvM),liblinear只支持OvR。而MvM一般比OvR分类相对准确一些,所以如果我们需要相对精确的多元逻辑回归时,就不能选择liblinear,也意味着不能使用L1正则化。

综上,liblinear支持L1和L2,只支持OvR做多分类,“lbfgs”, “sag” “newton-cg”只支持L2,支持OvR和MvM做多分类。

multi_class,分类方式选择:
有 ovr和multinomial两个值可以选择,默认是 ovr。multinomial即前面提到的many-vs-many(MvM)。

OvR的思想是多元逻辑回归,都可以看成二元。具体做法是,对于第K类的分类决策,我们把所有第K类的样本作为正例,除了第K类样本以外的所有样本都作为负例,然后在上面做二元逻辑回归,得到第K类的分类模型。其他类的分类模型获得以此类推。

举MvM的特例one-vs-one(OvO)作讲解。如果模型有T类,我们每次在所有的T类样本里面选择两类样本出来,不妨记为T1类和T2类,把所有的输出为T1和T2的样本放在一起,把T1作为正例,T2作为负例,进行二元逻辑回归,得到模型参数。我们一共需要T(T-1)/2次分类。

综上,OvR相对简单,但分类效果相对略差(这里指大多数样本分布情况,某些样本分布下OvR可能更好)。而MvM分类相对精确,但是分类速度没有OvR快。

class_weight,类型权重参数:
用于标示分类模型中各种类型的权重,不输入则所有类型的权重一样。
选择balanced让类库自己计算类型权重,计算方法为:总样本数/(总类别数*每个类的样本数向量)。即某种类型样本量越多,则权重越低,样本量越少,则权重越高。
或者我们自己输入各个类型的权重,比如对于0,1的二元模型,我们可以定义class_weight={0:0.9, 1:0.1},这样类型0的权重为90%,而类型1的权重为10%。

可以解决的问题为,1.误分类的代价很高,我们可以适当提升代价高那一类的权重。2.样本不均衡,提升样本量少的类别的权重。

sample_weight,样本权重参数:
在调用fit函数时,通过sample_weight来自己调节每个样本的权重。

样本不平衡,造成样本不是总体样本的无偏估计,从而可能导致模型预测能力下降。
遇到这种情况,我们可以通过调节类别和样本的权重来尝试解决。如果上面两种方法都用到了,那么样本的真正权重是class_weight*sample_weight。

关于LR,工程界的共识是: 特征离散化可以得到更好的效果。
总结下原因:
1.离散特征在工程上容易设计,计算的时候计算逻辑简单。比如工程实现可以直接对离散特征的特征编号+取值做hash,来当作他最终的特征id,逻辑简单粗暴。
2.离散化后,做分段,对异常数据有比较好的鲁棒性,比如年龄,>30岁为1,那么有异常数据哪怕是300岁,取值也不会有多大的问题。当然有人可能质疑,我用连续特征也会归一化,那么请看第三点
3.特征分段离散化后,每一个取值都有一个单独的权重,能提升表达能力。比如一个连续值特征0-1, 可能0-0.2部分的差异度要小于0.8-1的差异度,而如果用连续特征,两者公用一个权重,那这里就体现不出来
4.离散化后,可以对特征进行交叉组合,引入非线性因素。这个非常重要!
引入一些离散的id属性,比如广告id,可以直接学习到这个广告的“好坏”,然后一般往往会拿id和一些其他的属性做组合。
离散化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值