目录
1、逻辑回归与线性回归的联系与区别
2、 逻辑回归的原理
3、逻辑回归损失函数推导及优化
4、 正则化与模型评估指标
5、逻辑回归的优缺点
6、样本不均衡问题解决办法
7、 sklearn参数
两者都是广义的线性回归,线性回归优化的目标函数是OLS,逻辑回归则是似然函数。
逻辑回归主要思想: 根据现有数据对分类边界线(Decision Boundary)建立回归公式,以此进行分类。
逻辑回归通过一组预测器变量,可以很有效的预测特征与输出结果。这与线性回归很相似,但更适用于二分类问题。方程系数可以用来估计模型中的自变量的比率,这适用于更广泛的问题模型,另一方面,可以将逻辑回归用于确定某个事件的可能性,输出值为0或1。
在逻辑回归中不仅可以解决二分类问题,也可以求解多分类问题,只不过它常被用来做二分类。
线性回归:通过估计线性方程中的系数,包括一个或多个独立变量,进而给出最佳的预测结果。例如,可以通过年龄、教育背景、工作年份等特征预测销售员全年的销售情况。
线性回归求解的是连续问题,而逻辑回归求解的是离散问题。
1)线性回归要求变量服从正态分布,logistic回归对变量分布没有要求
2)线性回归要求因变量是连续性数值变量,而logistic回归要求因变量是分类型变量
3)线性回归要求自变量和因变量呈线性关系,而logistic回归不要求自变量和因变量呈线性关系
4)线性回归是直接分析因变量与自变量的关系,而logistic回归是分析因变量取某个值的概率与自变量的关系
逻辑回归首先把样本映射到[0,1]之间的数值,这就归功于sigmoid函数,可以把任何连续的值映射到[0,1]之间,数越大越趋向于0,越小越趋近于1。Sigmoid函数公式如下:
其中,sigmoid函数的输入为z=w.T*x,向量w是我们要找的最佳参数,从而使分类器更加准确。为了寻找最优w,会用到一系列方法,如梯度下降法等。
惩罚高阶参数,使它们趋近于0,这样就会得到较为简单的假设,也就是得到简单的函数,这样就不易发生过拟合。但是在实际问题中,并不知道哪些是高阶多项式的项,所以在代价函数中增加一个惩罚项/正则化项,将代价函数中所有参数值都最小化,收缩每一个参数。
正则化:L0、L1、L2
模型评估指标
混淆矩阵
True Positive(真正,TP):将正类预测为正类数
True Negative(真负,TN):将负类预测为负类数
False Positive(假正,FP):将负类预测为正类数→误报 (Type I error)
False Negative(假负,FN):将正类预测为负类数→漏报 (Type II error)
召回率
召回率是覆盖面的度量,度量有多个正例被分为正例,recall=TP/(TP+FN)=TP/P=sensitive,可以看到召回率与灵敏度是一样的。
accuracy=(TN+TP)/sum
1-accuracy=error
F1 score越高越好
ROC在AUC上的得分,也就是ROC下的面积
样本不平衡:指分类任务中不同类别的训练样例数目差别很大的情况(假设正样本较少,反类样例较多)
1.欠采样(undersampling)法是去除训练集内一些多数样本,使得两类数据量级接近,然后在正常进行学习
这种方法的缺点是就是放弃了很多反例,这会导致平衡后的训练集小于初始训练集。而且如果采样随机丢弃反例,会损失已经收集的信息,往往还会丢失重要信息。
欠采样改进方法1
但是我们可以更改抽样方法来改进欠抽样方法,比如把多数样本分成核心样本和非核心样本,非核心样本为对预测目标较低概率达成的样本,可以考虑从非核心样本中删除而非随机欠抽样,这样保证了需要机器学习判断的核心样本数据不会丢失。
举例来说依然是预测用户注册这个目标,我们可以将跳出率为100%的用户名下的所有会话都可以划分为非核心样本,因为跳出用户包含的信息量非常少(其他行为特征为空),将此部分用户样本排除可以最大可能的保留更多原始数据信息。
欠采样改进方法2
另外一种欠采样的改进方法是 EasyEnsemble 提出的继承学习制度,它将多数样本划分成若 N个集合,然后将划分过后的集合与少数样本组合,这样就形成了N个训练集合,而且每个训练结合都进行了欠采样,但从全局来看却没有信息丢失。
2.过采样(oversampling)是对训练集内的少数样本进行扩充,既增加少数样本使得两类数据数目接近,然后再进行学习。
简单粗暴的方法是复制少数样本,缺点是虽然引入了额外的训练数据,但没有给少数类样本增加任何新的信息,非常容易造成过拟合。
过采样改进方法1
通过抽样方法在少数类样本中加入白噪声(比如高斯噪声)变成新样本一定程度上可以缓解这个问题。如年龄,原年龄=新年龄+random(0,1)
过采样代表算法:SMOTE 算法
SMOTE[Chawla et a., 2002]是通过对少数样本进行插值来获取新样本的。比如对于每个少数类样本a,从 a最邻近的样本中选取 样本b,然后在对 ab 中随机选择一点作为新样本。
3.阈值移动
这类方法的中心思想不是对样本集和做再平衡设置,而是对算法的决策过程进行改进。
举个简单的例子,通常我们对预测结果进行分类时,当预测 ( 代表正类可能性) 值>0.5时,判定预测结果为正,反之为负。规定决策规则
若>1,则预测为正例
不难发现,只有当样本中正反比例为1:1时,阈值设置为0.5才是合理的。如果样本不平衡决策规则需要进行变更,另 代表正例个数, 代表负例个数,改进决策规则:
若 ,则预测为正例
因为训练集是总体样本的无偏采样,观测几率就代表真实几率,决策规则中 代表样本中正例的观测几率,只要分类器中的预测几率高于观测几率达到改进判定结果的目标。
penalty
:正则化选择参数,参数可选值为l1和l2,分别对应l1正则化和l2正则化,默认是l2正则化。
调整该参数的目的主要是为了防止过拟合,一般penalty选择l2正则化就够啦,但是如果选择l2正则化发现依然过拟合,即预测效果还是很差的时候,就可以考虑l1正则化。如果模型的特征非常多,我们希望做一些特征选择(即把一些不重要的特征过滤掉),这个时候也可以考虑用l1正则化。
penalty参数的选择会影响我们损失函数优化算法的选择,即参数solver
的选择,如果是l2正则化,可选的优化算法 {‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’}都可以选择。但是如果penalty是L1正则化的话,就只能选择‘liblinear’了。这是因为L1正则化的损失函数不是连续可导的,而{‘newton-cg’, ‘lbfgs’,‘sag’}这三种优化算法时都需要损失函数的一阶或者二阶连续导数。而‘liblinear’并没有这个依赖。这几个优化方法在solver参数环节进行讲述。
dual
:用来指明是否将原问题改成他的对偶问题,对偶问题可以理解成相反问题,比如原问题是求解最大值的线性规划,那么他的对偶问题就是转化为求解最小值的线性规划,适用于样本较小的数据集,因样本小时,计算复杂度较低。
tol
:残差收敛条件,默认是0.0001,也就是只需要收敛的时候两步只差<0.0001就停止,可以设置更大或更小。(逻辑回归模型的损失函数是残差平方和)
C
:正则化系数,正则化强度的导数,必须是一个正数,值越小,正则化强度越大,即防止过拟合的程度更大。
fit_intercept
:是否将截距/方差加入到决策模型中,默认为True。
class_weight
:class_weight是很重要的一个参数,是用来调节正负样本比例的,默认是值为None,也就是正负样本的权重是一样的,你可以以dict的形式给模型传入任意你认为合适的权重比,也可以直接指定一个值“balanced”,模型会根据正负样本的绝对数量比来设定模型最后结果的权重比。
比如,有一数据集的正负样本绝对数量比为4:6,如果你给参数class_weight赋予balanced值,那么最后模型结果中,正负样本的权重比就会变成6:4。
random_state
:随机种子的设置,默认是None,如果设置了随机种子,那么每次使用的训练集和测试集都是一样的,这样不管你运行多少次,最后的准确率都是一样的;如果没有设置,那么每次都是不同的训练集和测试集,最后得出的准确率也是不一样的。
solver
:用来指明损失函数的优化方法,默认是‘liblinear’方法,sklearn自带了如下几种:
参数值优化方法liblinear使用了坐标轴下降法来迭代优化损失函数lbfgs拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数newton-cg也是牛顿法法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数sag即随机平均梯度下降,是梯度下降法的变种,是一种线性收敛算法,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候
newton-cg, lbfgs和sag这三种优化算法时都需要损失函数的一阶或者二阶连续导数,因此不能用于没有连续导数的L1正则化,只能用于L2正则化。而liblinear对L1正则化和L2正则化都适用。同时,因sag每次仅仅使用了部分样本进行梯度迭代,所以当数据量较少时不宜选用,而当数据量很大时,为了速度,sag是第一选择。
max_iter
:算法收敛的最大迭代次数,即求取损失函数最小值的迭代次数,默认是100,multi_class
:分类方法参数选择,‘ovr’和‘multinomial’两个值可以选择,默认值为‘ovr’,如果分类问题是二分类问题,那么这两个参数的效果是一样的,主要体现在多分类问题上。
对于多分类问题,"ovr"分类方法是:针对每一类别进行判断时,都会把这个分类问题简化为是/非两类问题;而‘multinomial’是从众多类别中选出两个类别,对这两个类别进行判断,待判断完成后,再从剩下的类别中再选出两类进行判断,直至最后判断完成。
verbose
:英文意思是”冗余“,就是会输出一些模型运算过程中的东西(任务进程),默认是False,也就是不需要输出一些不重要的计算过程。
warm_start
:是否使用上次的模型结果作为初始化,默认是False,表示不使用。
n_jobs
:并行运算数量(核的数量),默认为1,如果设置为-1,则表示将电脑的cpu全部用上。