ML模型2:逻辑回归
逻辑回归(Logistic回归)
一些回归算法可以用来处理分类问题,以及一些分类算法可以进行回归预测,逻辑回归就属于前者。逻辑回归一般通过估计一个概率值,来表示一个样本属于某一类的概率。假如一个样本属于某一类的概率大于50%,那么就判该样本属于这一类。
优点:计算代价不高,易于理解和实现。
缺点:容易欠拟合,分类精度可能不高。
1. 实现分类
逻辑回归对样本概率的估计类似线性回归,也是计算出样本的一系列权重,然后将该权重线性加和之后输入到sigmoid函数中,进而计算出一个概率值。
其中 即为权重, 即为sigmoid函数,如下:
sigmoid函数图象:
sigmoid函数将 的值域从 映射到 (0, 1),从而表示发生事件的概率值,所以我们可以根据计算出来的概率值来进行对样本进行分类:
2. 损失函数
我们既然是通过sigmoid函数的值来进行概率预测的,那么我们的目标就应该是找出一组权重参数θ,能够对于正样本使得sigmoid函数有一个高的输出值,而对于负样本有一个低的输出。
我们可以通过计算损失函数来逐步达到这一的目标。对于单个样本来说,损失函数如下公式。与线性回归的平方误差不同,此处使用的是对数损失(Q1. 为什么?):
对整个数据集损失函数如下:
对以上损失函数并不像最小二乘法般有封闭解,但由于函数是凸函数,可以使用梯度下降的方法寻找最优值。
3. 极大似然估计
概率公式 上面已经给出,对任意一个样本有
对以上公式整合得:
对所有样本,发生的概率为
对数似然
引入 作为损失函数,与上面得到的损失函数一致。
下面使用梯度下降求解。
4. 梯度下降求解
虽然损失函数看起来复杂,但得益于sigmoid函数,是其梯度计算后结果十分简单。
不难证明,对sigmoid函数求导得:
对 求梯度,得:
参数更新:
向量化表示:
5. 多分类问题softmax
softmax其实是Logistic的推广到多类别分类应用中,不需建立多个二分类分类器来实现多类别分类。softmax分类器的思想很简单,对于一个新的样本,softmax回归模型对于每一类都先计算出一个分数,然后通过softmax函数得出一个概率值,根据最终的概率值来确定属于哪一类。
通过下公式来计算并归一化之后就是输出的概率值:
计算出每一个分类的概率值后,从得到的各个概率值中选择最大的一个概率类别,即为预测类别
类似逻辑回归,我们可以通过损失函数求得最优解:
该损失函数又称为交叉熵,交叉熵常在机器学习中作为损失函数,比方说p表示真实类别的分布,q则为训练后的模型的预测类别分布,交叉熵损失函数可以衡量p与q的相似性。与逻辑回归类似,依然可以用梯度下降法求解。
6. Sklearn示例
from sklearn import linear_model
clf = linear_model.LogisticRegression(C=1.0, penalty='l1', tol=1e-6)
参数列表
参数 | 解释 | 数值类型(默认值) | 选项 |
penalty | 惩罚项,用于指定惩罚中使用的范式 | str,默认l2 | l1/l2 |
dual | 用于指定使用对偶形式还是原形式;对偶形式只有在liblinear solver使用l2范式时设定;当样本数>特征数时,通常dual=False | bool,默认False | True/False |
tol | 停止标准的容忍度 | float,默认1e-4 | |
C | 正则化强度的倒数;必须是一个正浮点数; | float(1.0) | |
fit_intercept | 指定是否应该在决策函数中添加一个常数(也称为偏差或截距) | bool(True) | True/False |
intercept_scaling | 只有当’liblinear’被用,并且self.fit_intercept也设置为True时,该参数有效 | float(1) | |
class_weight | 与类别标签相关的权重,如果没有给出,所有类的权重都为1;'balanced’根据y的值自动调节与类频率成反比的权重 | 默认(None) | dict/balanced |
random_state | 对数据洗牌的时候伪随机数生成器的种子; | 可选参数,default(None) | int/Random State instance/None |
solver | 指定用于优化问题的算法 ;[取值说明待定] | str(‘liblinear’) | newton-cg/lbfgs/liblinear/sag/saga |
max_iter | 仅当newton-cg/sag/lbfgs使用的时候有效;最大的迭代次数 | int(100) | |
multi_class | 分类方式的选择 | str(ovr) | ovr/multinomial/auto |
verbose | solver是liblinear或者lbfgs时,设置此参数为任意的正数来应对冗长问题 | int(0) | |
warm_start | 当设置为True时,重复使用上次的解决方案以适应初始化,否则只需要擦除上次的解决方案;除非是solver是‘liblinear’ | bool(False) | True/False |
n_jobs | 可选参数,当multi_class=‘ovr’,并行化处理时使用的CPU核数 | default(None) | int/None |
属性:
属性 | 解释 |
coef_ | array,shape(1,n_features)/(n_classes,n_features) ,输入模型的系数(权重) |
intercept_ | array,shape(1,)/(n_classes,) 截距 |
n_iter_ | array,shape(n_classes,)/(1,) ,所有类的实际迭代次数。如果二进制或多项式,它只返回1个元素。对于liblinear求解器,只给出了所有类中迭代的最大数量。 |
Q&A
Q1. 为什么使用对数损失函数?
损失函数:平方损失函数 / 对数损失函数 / HingeLoss(0-1损失函数) / 绝对值损失函数
- 因为sigmoid函数非凸,使用平方损失得出的损失函数也是非凸,梯度下降后不一定能获取最小值。但是使用对数损失后,损失函数为凸函数,必定能找到最小值。
- 使用对数函数后,与极大对数似然的式子几乎一致,从概率理论上有理论证明。
Q2. 逻辑回归和线性回归有什么区别?(面试题)
预测结果 - 线性回归的预测结果是连续的,逻辑回归的结果是离散的;
假设函数 - 逻辑回归在线性回归的实数范围输出上施加了sigmoid函数,将值收敛在0-1之间;
损失函数 - 线性回归是均方误差(平方损失),逻辑回归是对数似然函数(对数损失)。
参考: