目录
更详细:LR
Logistic回归
- 多元线性方程:
- sigmoid非线性激活函数:
- 假设函数:
,这里假设
表示预测为正例的概率
,则
w为预测为负例的概率
。则最后整合表示为
,表示预测为真实值的概率。值越大越好。
- 损失函数:似然函数为
,
对数似然函数:,概率越大越好,变换为损失函数为越小越好,
即:
- 反向梯度传播:损失函数对于参数的偏导数为
,设学习率为
,则更新公式为
性质
- 另一种形式:
,转换过来同上一样,故叫logist回归,引入对数几率(非线性映射函数),本质还是回归方程
- 特征多重共线性影响及处理:(离散化处理、正则化,使参数稀疏为0)
多重共线性是使用线性回归算法时经常要面对的一个问题。在其他算法中,例如决策树或者朴素贝叶斯,前者的建模过程时逐渐递进,决策树每次都只有一个变量参与,这种机制含有抗多重共线性干扰的功能;朴素贝叶斯后者假设变量之间是相互独立的。但对于回归算法来说,都要同时考虑多个预测因子,因此多重共线性不可避免。指的是特征之间存在线性关系。
影响:LR模型中特征的共线性不会影响模型理论上的最优解,但是会使得系数不稳定,从而解释性变差。删除共线性特征可以使模型的解释能力变强、训练速度加快、模型更稳定。严重的共线性影响模型的稳定性,即系数参数成比例改变,使参数预测区间变大,失去模型的预测功能。(本质上使因为使用矩阵求解时,求偏导等于0,存在X矩阵求逆,若X非满秩矩阵,则求解W有无数个)
逻辑回归要去除特征之间共线性度高的特征(或者离散化),而决策树、贝叶斯等则不用。逻辑回归一般要进行特征归一化,保持在一个量纲上,而决策树等不用。(量纲)
逻辑回归多使用离散值作为输入,即特征处理,将连续值映射在离散空间上。决策树(xgboost、GBDT)等(擅长)处理连续值。(离散化-解决共线性问题)
逻辑回归里散化的好处,为什么善于处理离散值:
- 稀疏向量内积乘法运算速度快,计算结果方便存储,容易scalable(扩展)。
- 离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则0。如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰。
- 逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合。
- 离散化后可以进行特征交叉,由M+N个变量变为M*N个变量,进一步引入非线性,提升表达能力。
- 特征离散化后,模型会更稳定,比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。当然处于区间相邻处的样本会刚好相反,所以怎么划分区间是门学问。
总结:1)计算简单;2)简化模型;3)增强模型的泛化能力,不易受噪声的影响。
为什么用sigmoid激活函数
- sigmoid函数本身的性质:中心对称(0.5),值在[0,1]之间。连续函数、单调递增,求导易于计算
- 逻辑回归认为函数预测概率服从伯努利分布,从伯努利假设给出逻辑回归的损失函数,能够推导出激活函数的的形式为Sigmoid的形式。
- https://blog.youkuaiyun.com/qq_19645269/article/details/79551576?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
损失函数
经过使用最大似然函数求解,得到的损失函数为交叉熵损失函数的二元形式。为什么使用交叉熵,是因为均方差(MSE)是万能的损失函数,但是在本问题中,激活函数为Sigmoid,使用MSE会导致求导后有Sigmoid导数(g(x)(1-g(x))),必有一个接近于0,有梯度消失问题存在,但是使用交叉熵,因为含有log函数,就不会存在这种情况。
两种多分类解决办法:
OvR的思想很简单,无论你是多少元逻辑回归,我们都可以看做二元逻辑回归。具体做法是,对于第K类的分类决策,我们把所有第K类的样本作为正例,除了第K类样本以外的所有样本都作为负例,然后在上面做二元逻辑回归,得到第K类的分类模型。其他类的分类模型获得以此类推。
MvM顾名思义,就是对所有类别每两个训练一个分类器,那么要训练的分类器就有n*(n-1)/2 个,预测的时候就是投票法,每个分类器预测得到某个类别,看哪个类别最终得票最多就是结果。
这样做的优点就是可以规避上一种方法训练数据不平衡的问题,性能相对稳定;还有就是训练模型虽然多,但是相对简单,训练效率会有提升。
缺点就是要训练的分类器太多了,随着分类的增多,要训练的分类器个数呈平方级别的增长。
优化方法
网格搜索+交叉验证以及参数详解:
# -*- coding: utf-8 -*-
"""
Created on Wed Feb 26 10:31:11 2020
@author: dabing
"""
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
from sklearn.model_selection import GridSearchCV
#加载数据集,x为矩阵float64,y为标签int32(未经过one-hot编码)
X, y = load_iris(return_X_y=True)
#分类器是一个python对象,它实现了 fit(X, y) 和 predict(T) 等方法,视为黑箱,并设置模型的参数
clf = LogisticRegression(random_state=10,multi_class='multinomial',solver='sag')
#分类器学习的时候,通过fit(X,y)方法实现
clf.fit(X,y)
#分类器学习完成后,就可以进行预测新的值,
#计算训练的准确率
acuracy = clf.score(X, y)
#计算某个实例的预测的类别
a = clf.predict(X[:2, :])
#计算某个实例的预测概率
b = clf.predict_proba(X[:2, :])
#--------------------网格搜索+交叉验证
''' https://blog.youkuaiyun.com/weixin_41712499/article/details/82526483
C:为正则化系数λ的倒数,通常默认为1
penalty:正则化选择参数 ‘l1’or ‘l2’, default: ‘l2’penalty参数的选择会影响我们损失函数优化算法的选择。
即参数solver的选择,如果是L2正则化,那么4种可选的算法{‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’}都可以选择。
但是如果penalty是L1正则化的话,就只能选择‘liblinear’了。这是因为L1正则化的损失函数不是连续可导的,
而{‘newton-cg’, ‘lbfgs’,‘sag’}这三种优化算法时都需要损失函数的一阶或者二阶连续导数。而‘liblinear’并没有这个依赖。
tol:迭代终止判据的误差范围
solver:优化方法{‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’}, default: ‘liblinear
a) liblinear:使用了开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数。
liblinear适用于小数据集;如果选择L2正则化发现还是过拟合,即预测效果差的时候,就可以考虑L1正则化;如果模型的特征非常多,
希望一些不重要的特征系数归零,从而让模型系数稀疏化的话,也可以使用L1正则化。
b) lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
c) newton-cg:也是牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
较大数据集,支持one-vs-rest(OvR)和many-vs-many(MvM)两种多元逻辑回归。
d) sag:即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候。
如果样本量非常大,比如大于10万,sag是第一选择;但不能用于L1正则化
'''
param_grid ={
'C': [0.0001,0.001,0.01,0.1,1,10],
'penalty': ['l2'],
'tol': [1e-4,1e-5,1e-6]
}
garid_search = GridSearchCV(LogisticRegression(random_state=10, solver='liblinear',multi_class ), param_grid, scoring='accuracy', cv = 5)
garid_search.fit(X,y)
print(garid_search.cv_results_['mean_test_score'])
print(garid_search.best_params_)
print(garid_search.best_score_)
与svm、决策树等方法的区别
两者的共同点:
- LR和SVM都是分类算法
- 如果不考虑核函数,LR和SVM都是线性分类算法,即分类决策面都是线性的
- LR和SVM都是有监督学习算法
- LR和SVM都是判别模型
两者的不同点:
- 损失函数的不同,逻辑回归采用的是log loss(对数损失函数),svm采用的是hinge loss(合页损失函数)
- 分类原理的不同,LR基于概率理论,通过极大似然估计的方法估计出参数的值,而SVM基于几何间隔最大化原理,认为存在最大几何间隔的分类面为最优分类面,从最大间隔出发,转化为求对变量w和b的凸二次规划问题
- 由于分类原理的不同,也导致了LR是所有样本都有影响,而SVM只是少量样本有影响的(支持向量),在支持向量外添加样本点是没有影响的
- 正因为LR受数据影响较大,所以在数据不同类别时,要先对数据做balancing
- 同样的,由于SVM依赖数据表达的距离测度,所以要先对数据做normalization标准化
- 对于线性不可分的情况,SVM的核函数可以帮助将低维不可分的数据转换到高维,变成线性可分的,而LR很少用到核函数(并不是没有。。)假设我们在LR里也运用核函数的原理,那么每个样本点都必须参与核计算,这带来的计算复杂度是相当高的。所以,在具体应用时,LR很少运用核函数机制。
- SVM的损失函数就自带正则(损失函数中的1/2||w||^2项),这就是为什么SVM是结构风险最小化算法的原因,而LR必须另外在损失函数上添加正则化
关于LR和SVM的选择:
如果Feature的数量很大,跟样本数量差不多(样本数>>特征数),这时候选用LR或者是Linear Kernel的SVM
如果Feature的数量比较小,样本数量一般,不算大也不算小,选用SVM+Gaussian Kernel
如果Feature的数量比较小,而样本数量很多,需要手工添加一些feature变成第一种情况