1.1 scikit-learn参数介绍
1.1.1 导入
from sklearn.linear_model import LogisticRegression
1.1.2 版本
scikit-learn==0.21.3
1.1.3 参数
1.1.3.1 penalty
l1、l2、elasticnet、none,默认l2
l1: l1正则,邻回归
l2: l2正则,套索回归
elasticnet: 弹性网络,是邻回归和套索回归的正则项的混合
none: 什么都不加
在调参时如果我们主要的目的只是为了解决过拟合,一般penalty选择L2正则化就够了。但是如果选择L2正则化发现还是过拟合,即预测效果差的时候,就可以考虑弹性网络和L1正则化,弹性网络优于L1正则,因为当特征数量超过训练实例数量,又或者是几个特征强相关时,L1正则的表现可能非常不稳定。另外,如果模型的特征非常多,我们希望一些不重要的特征系数归零,从而让模型系数稀疏化的话,也可以使用L1正则化。
penalty参数的选择会影响损失函数优化算法的选择,即参数solver的选择。
若是L2正则,有4种可选的算法:“newton-cg”,“lbfgs”,“liblinear”,“sag”,
若是L1正则,有1种可选的算法:“liblinear”,L1正则化的损失函数不是连续可导的。
若是elasticnet,有1种可选的算法:“saga”
若是none,不支持的算法:“liblinear”
1.1.3.2 dual
布尔类型,True/False,默认False
dual只适用于正则化项为l2 liblinear的情况,通常样本数>特征数的情况下,dual=False。
1.1.3.3 tol
浮点型,默认为1e-4
停止判则的容忍度(误差)。
1.1.3.4 C
正浮点型,默认1.0
C为正则化系数 的逆,即为 。像在SVM中,较小的值指定更强的正则化。
1.1.3.5 fit_intercept
布尔类型,True/False,默认为True
是否存在截距。
1.1.3.6 intercept_scaling
浮点型,默认为1
仅仅在solve=liblinear,并且fit_intercept=True时有用
截距intercept= intercept_scaling * synthetic_feature_weight
当存在截距时,相当于一个合成特性的常量值等于截距,被附加到实例向量。synthetic_feature_weight相当于是原先的截距,是合成特征的常量值,设置intercept_scaling相当于更新截距,一般默认为1。
注意:综合特征权重与其他特征一样,服从L1/L2正则化。为了减少正则化对合成特征权重(截距)的影响,必须增加截距尺度。
1.1.3.7 class_weight
字典类型或者“balanced”,默认None
字典类型格式:{class_label: weight}
class_weight='balanced'时,class_weight = n_samples / (n_classes * np.bincount(y)),即权重=总样本数/(分类类别个数*每个类别的样本数),使得各类别的权重是一样的。
比如说二分类,0:40,1:60,那么0类型每个样本所占的权重就是100/(2*40)=5/4, 1类型每个样本所占的权重就是100/(2*60)=5/6, 5/4*40:5/6*60=1:1
在0.17版本中默认为balanced
Note:
在分类模型中,我们经常会遇到两类问题:
第一种是误分类的代价很高。比如对合法用户和非法用户进行分类,将非法用户分类为合法用户的代价很高,我们宁愿将合法用户分类为非法用户,这时可以人工再甄别,但是却不愿将非法用户分类为合法用户。这时,我们可以适当提高非法用户的权重。
第二种是样本是高度失衡的,比如我们有合法用户和非法用户的二元样本数据10000条,里面合法用户有9995条,非法用户只有5条,如果我们不考虑权重,则我们可以将所有的测试集都预测为合法用户,这样预测准确率理论上有99.95%,但是却没有任何意义。这时,我们可以选择balanced,让类库自动提高非法用户样本的权重。
提高了某种分类的权重,相比不考虑权重,会有更多的样本分类划分到高权重的类别,从而可以解决上面两类问题。
当然,对于第二种样本失衡的情况,我们还可以考虑用下一节讲到的样本权重参数: sample_weight,而不使用class_weight。
1.1.3.8 random_state
整数类型,默认None
随机种子,伪随机数生成器的种子,在重新排序数据的时候使用,如果随机种子不变,数据排序位置不变。如果random_state=None,那么random_state是一个随机数。在solver == ‘sag’ or ‘liblinear’的时候被使用。
1.1.3.9 solver
字符串,‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’,默认是’ liblinear’
算法,用于最优化问题。具体原理如下详细讲述。
a) liblinear:liblinear是一个针对线性分类场景而设计的工具包,支持线性的SVM和Logistic回归等,但是无法通过定义核函数的方式实现非线性分类。使用了开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数。
b) lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
c) newton-cg:也是牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
d) sag:即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候。
e) saga: 快速梯度下降
在小数据集上,‘liblinear’是一个好的选择,‘sag’ 和 ‘saga’用于大数据集上。
对于多分类问题,仅仅是‘newton-cg’, ‘sag’, ‘saga’ ,‘lbfgs’可以处理多分类损失。
‘newton-cg’, ‘lbfgs’, ‘sag’, ‘saga’能处理L2正则或none
‘liblinear’, ‘saga’能处理L1正则
‘saga’也支持elasticnet(弹性网络)
‘liblinear’不支持penalty=’none’,只能处理一对多的多元逻辑回归。
注:‘sag’, ‘saga’仅在特征比例大致相同时可以快速收敛。可以从sklearn.preprocessing中处理数据。
在0.17版本中有随机平均梯度下降算法。
在0.19版本中有SAGA算法。
在0.20版本中设置了警告,在0.22版本中默认值会从’liblinear’转变为’ lbfgs’。
1.1.3.10 max_iter
整数类型,默认100
算法收敛的最大迭代次数。用于迭代最优的参数。
Note:
如果设置太低,算法可能在离最优解还很远时就停了;如果设置得太高,模型达到最优解后,继续迭代参数不再变化,又会浪费时间。一个简单的办法是,在开始时设置一个非常大的迭代次数,但是当梯度向量的值变得很微小时中断算法-也就是它的范数变得低于ε(称为容差)时,这时梯度下降几乎达到了最小值。
1.1.3.11 multi_class
字符串类型,’ovr’, ‘multinomial’, ‘auto’,默认为’ovr’
ovr: one-vs-rest(OvR)一对多(用于多元逻辑回归),一类设为1,其他类设为0
multinomial: many-vs-many(MvM),多对多,多项式
auto: 自动
如果选择’ovr’,二分类问题适用于每个标签。对于多项式,损失最小化是多项式损失符合整个概率分布,即使数据是二分类。
‘multinomial’在solver=’liblinear’时是不可用的。
当数据是二分类,或者solver=’liblinear’时,若multi_class=’auto’,则设置为’ovr’,否则的话设置为’multinomial’。
在0.18版本中,随机平均梯度下降用于’multinomial’。
在0.20版本中设置了警告,在0.22版本中默认值会从’ovr’改成’auto’。
Note:
OvR的思想很简单,无论你是多少元逻辑回归,我们都可以看做二元逻辑回归。具体做法是,对于第K类的分类决策,我们把所有第K类的样本作为正例,除了第K类样本以外的所有样本都作为负例,然后在上面做二元逻辑回归,得到第K类的分类模型。其他类的分类模型获得以此类推。
而MvM则相对复杂,这里举MvM的特例one-vs-one(OvO)作讲解。如果模型有T类,我们每次在所有的T类样本里面选择两类样本出来,不妨记为T1类和T2类,把所有的输出为T1和T2的样本放在一起,把T1作为正例,T2作为负例,进行二元逻辑回归,得到模型参数。我们一共需要T(T-1)/2次分类。
可以看出OvR相对简单,但分类效果相对略差(这里指大多数样本分布情况,某些样本分布下OvR可能更好)。而MvM分类相对精确,但是分类速度没有OvR快。
1.1.3.12 verbose
整数,默认为0
日志冗长度。
verbose=0,不输出训练过程
verbose=1,偶尔输出
verbose>1,对每个子模型都输出
对’liblinear’和’lbfgs’算法设置任何正整数的日志冗长度。
1.1.3.13 warm_start
布尔类型,True/False,默认为False
当在相同的数据集上反复拟合一个估计值,但是对于多个参数值(例如在网格搜索中查找性能最大化的值),可以重用从以前的参数值中学到的模型,来节省时间。当warm_start=True,重用上一个调用的解决方案来适应初始化。当warm_start=False,将上一次的解决方案擦除。对’liblinear’算法不起作用。
在0.17版本中支持lbfgs, newton-cg, sag, saga算法。
1.1.3.14 n_jobs
整数 或者 None,默认为None
n_jobs为cpu核数,当多类并行操作时且multi_class=’ovr’。
当solver=’liblinear’,不管’ multi_class’ 是否有规定,n_jobs这个参数会被忽略。
n_jobs=None,代表1,除非在joblib.parallel_backend环境中(为-1),n_jobs=-1,意味着使用所有的处理器。
1.1.3.15 l1_ratio
浮点型类型 或者 None,默认为None
Elastic-Net(弹性网络)主要参数,l1_ratio的取值范围为:0 <= l1_ratio <= 1,当penalty='elasticnet'才有用。l1_ratio=0等价于penalty='l2';l1_ratio=1等价于penalty='l1';当0 < l1_ratio <1时,介于L1和L2之间。l1_ratio即为弹性网络的混合比例。
1.1.4 属性
1.1.4.1 classes_
输出array类型
y标签(分类器)的类别列表
1.1.4.2 coef_
输出array类型
目标函数的特征系数。
当为二分类问题时,coef_的形状为shape(1, n_features);当multi_class='multinomial'时,coef_对应的结果为1(True),-coef_对应的结果为0(False)
1.1.4.3 intercept_
截距。
如果fit_intercept=False,截距为0。当为二分类问题时,intercept_的形状为shape(1, n_features);当multi_class='multinomial',intercept_对应的结果为1,-intercept_对应的结果为0。
1.1.4.4 n_iter_
所有类的实际迭代次数。二分类或多分类仅返回一个元素。对于二分类结果,仅返回分类中迭代次数最大的一个。
在0.20版本中,在SciPy <= 1.0.0中,lbfgs迭代次数的个数可能会超过最大迭代次数max_iter。n_iter会报告为最大的迭代次数max_iter。