目录
一、LogisticRegression的用法
LogisticRegression()函数是Sklearn库中的,主要用于逻辑回归,
from sklearn.linear_model import LogisticRegression
官方给出的用法:
class sklearn.linear_model.LogisticRegression(
penalty='l2', *,
dual=False,
tol=0.0001,
C=1.0,
fit_intercept=True,
intercept_scaling=1,
class_weight=None,
random_state=None,
solver='lbfgs',
max_iter=100,
multi_class='auto',
verbose=0,
warm_start=False,
n_jobs=None,
l1_ratio=None)
二、参数注解
LogisticRegression() 这个函数的参数较多,详细注解如下
1. penalty='l2', 正则化选择参数:penalty也称作惩罚项。可选参数为l1,l2, elasticnet和None(表示无指定规范)
LogisticRegression默认的正则化项是 l2 正则化。如果在调参时主要目的是解决overfitting 过拟合问题,一般会选择l2正则化。但是当预测结果不好时,可选用l1正则化。
newton-cg、sag和lbfgs求解算法只支持L2规范。
liblinear和saga 求解算法支持L1 和L2规范
Saga 求解算法只支持elasticnet。
L1规范假设的是模型的参数满足拉普拉斯分布,L2假设的模型参数满足高斯分布,所谓的范式就是加上对参数的约束,使得模型更不会过拟合(overfit),
这里要注意,不是说加了约束就会更好,但是一般情况下,加了约束,可以使得模型的泛化能力更强。
2.dual=False, 对偶或者原始方法,用来指明是否将原问题改成他的对偶问题。默认为false(样本数量>样本特征)。
对偶问题可以理解成相反问题,比如原问题是求解最大值的线性规划,那么他的对偶问题就是转化为求解最小值的线性规划,适用于样本较小的数据集,因样本小时,计算复杂度较低。
对偶方法仅用于求解线性多核 liblinear 的 l2 惩罚项上。要注意的是它仅在penalty='l2' 且solver='liblinear' 有对偶形式,仅此时有效。
3.tol=0.0001, 停止求解的标准,默认为1e-4,float类型,
即设置的参数精度作为最优解,简单来说,就是求解到多少的时候,停止,认为已经求出最优解。
4.C=1.0, 正则化系数 lambda 的倒数,float类型,默认为1.0,必须是正浮点数类型,
像SVM一样,数值越小则反应正则化越强,即防止过拟合的程度更大。
5.fit_intercept=True, 是否存在截距或者偏差,默认为true,布尔类型。
6. intercept_scaling=1, 当且仅当正则化项为 liblinear 且 fit_intercept 为true时有效。默认值为1,float类型。
7.class_weight=None, 各种类型的权重,可以是字典或者 ’balanced’ 字符串,默认值为None,也就是不考虑权重。
如果选择‘balanced’,那么类库会根据训练样本计算权重,某种类型的样本量越多,则权重越低;样本量越少,则权重越高。
class_weight在分类模型中应用的两类问题:
第一种是误分类的代价很高。比如对合法用户(1)和非法用户(0)进行分类,将非法用户分类为合法用户的代价很高,我们宁愿将合法用户分类为非法用户,这时可以人工再甄别,但是却不愿将非法用户分类为合法用户。这时,我们可以适当提高非法用户的权重。
比如自定义class_weight={0:0.8,1:0.2},这样类型0的权重为80%,而类型1的权重为20%。
第二种是样本是高度失衡的,比如我们有合法用户和非法用户的二元样本数据10000条,里面合法用户有9995条,非法用户只有5条,如果我们不考虑权重,则我们可以将所有的测试集都预测为合法用户,这样预测准确率理论上有99.95%,但是却没有任何意义。
这时,我们可以选择balanced,让类库自动提高非法用户样本的权重。提高了某种分类的权重,相比不考虑权重,会有更多的样本分类划分到高权重的类别,从而可以解决上面两类问题。
8.random_state=None, 随机种子,默认为none,仅在正则化项为 sag 或 liblinear 时有效。
如果是int,则random_state是随机数生成器使用的种子;
如果是RandomState实例,则random_state是随机数生成器;
如果为None,则随机数生成器是np.random使用的RandomState实例。
9.solver='lbfgs', 决定了对逻辑回归损失函数的优化方法。只有五个可选参数,即newton-cg, lbfgs, liblinear, sag, saga。
liblinear:使用开源的liblinear库实现,使用坐标轴下降法来迭代优化损失函数。
lbfgs:拟牛顿法的一种,利用损失函数二阶导数也即海森矩阵来迭代优化损失函数。
newton-cg:利用损失函数二阶导数也即海森矩阵来迭代优化损失函数。
sag:随机平均梯度下降,与普通梯度下降法的区别时每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候。
saga:线性收敛的随机优化算法的的变种。
要注意的是:newton-cg、lbfgs以及sag三种方式均要求损失函数具有一阶或者二阶连续导数,因此不能用于没有连续导数的 l1正则化,只能用于l2正则化。而 liblinear 则对正则化项 l1和 l2均适用。当样本总数非常大,超过10w时,sag是第一选择。
对于多元逻辑回归,当我们拿逻辑回归算法时,称之为多分类。对于多元逻辑回归常见的有one-vs-rest(OvR)和many-vs-many(MvM)
而liblinear仅支持OvR,所以当需要相对准确的分类时,一般不选择liblinear,也就是说多元逻辑回归时不选择l1正则化。
换种说法,MvM相对于OvR分类更为精确,但是分类速度没有OvR快。如果选择了ovr,则4种损失函数的优化方法liblinear,newton-cg,lbfgs和sag都可以选择。但是如果选择了multinomial,则只能选择newton-cg, lbfgs和sag了。
总结:
liblinear适用于小数据集,而sag和saga适用于大数据集因为速度更快。
对于多分类问题,只有newton-cg,sag,saga和lbfgs能够处理多项损失,而liblinear受限于一对剩余(OvR)。意思就是说,用 liblinear的时候,如果是多分类问题,得先把一种类别作为一个类别,剩余的所有类别作为另外一个类别。一次类推,遍历所有类别,进行分类。
newton-cg,sag和 lbfgs这三种优化算法时都需要损失函数的一阶或者二阶连续导数,因此不能用于没有连续导数的L1正则化,只能用于L2正则化。而 liblinear和 saga在L1正则化和 L2正则化中都可以使用。
同时,sag每次仅仅使用了部分样本进行梯度迭代,所以当样本量少的时候不要选择它,而如果样本量非常大,比如大于10万,sag是第一选择。但是sag不能用于L1正则化,所以当你有大量的样本,又需要L1正则化的话就要自己做取舍了。要么通过对样本采样来降低样本量,要么回到L2正则化。
从上面的描述,大家可能觉得,既然newton-cg, lbfgs和sag这么多限制,如果不是大样本,我们选择 liblinear不就行了嘛!错,因为liblinear也有自己的弱点!
我们知道,逻辑回归有二元逻辑回归和多元逻辑回归。对于多元逻辑回归常见的有one-vs-rest(OvR) 和 many-vs-many(MvM) 两种。而MvM一般比OvR分类相对准确一些。可是liblinear只支持OvR,不支持MvM,这样如果我们需要相对精确的多元逻辑回归时,就不能选择liblinear了。也意味着如果我们需要相对精确的多元逻辑回归不能使用L1正则化了。
10. max_iter=100, max_iter:算法收敛的最大迭代次数,默认为10。仅在正则优化算法为newton-cg、sag和lbfgs时有效。
11.multi_class='auto', 分类方式选择参数,可选参数为 ovr 和 multinomial。默认为ovr。
其中 one-vs-rest OvR(一对剩余的),multinomial 是 many-vs-many MvM(多对多)。两者的区别主要在于多元逻辑回归。OvR相对简单,但是分类效果略差。而MvM则相对精确但分类速度不如OvR.
12.verbose=0, 日志冗长度。默认为0,即不输出训练过程。为1时偶尔输出结果,大于1则对每一个子模型都输出。要注意的是它是int类型。
13.warm_start=False, 热启动参数,布尔类型,默认false。如果为true,则下一次训练时,重新使用上一次的调用作为初始化。
14. n_jobs=None, 表示进程个数
默认None。相当于 n_jobs=1.
若值为 -1,则用所有的CPU进行运算。
若值为1,则不进行并行运算,这样的话方便调试。
若值小于-1,则用到的CPU数为(n_cpus + 1 + n_jobs)。因此如果 n_jobs值为-2,则用到的CPU数为总CPU数减1。
15. l1_ratio=None,取值范围0 <= l1_ratio <= 1。
默认None。
仅当penalty=‘elasticnet’ 时使用。设置’ l1_ratio=0等价于使用penalty=‘l2’,而设置l1_ratio=1等价于使用penalty=‘l1’。对于0 < l1_ratio <1,惩罚是L1和L2的组合