逻辑回归(logistic regression)
名为"回归"的线性分类器,由线性回归变化而来,一种广泛使用于分类问题中的广义回归算法。
线性回归
- 方程表示
线性回归的任务,就是构造预测函数z来映射特征矩阵x和标签y的线性关系。
对于0-1分布的离散变量
引入联系函数(link function),将线性回归方程z转为g(z)。
- 对于逻辑回归来说,此联系函数就是sigmoid函数
二元逻辑回归
一般形式:
因此,其对应的模型被称为“对数几率回归”(logistic regression),也就是我们的逻辑回归。
逻辑回归返回的数字y(x),即使本质上不是概率,却也有着概率的各种性质,可以被当成概率来看待和使用。
为什么需要逻辑回归
线性回归对数据的要求很严格,比如:
- 标签必须满足正态分布
- 特征间的多重共线性需要消除
- 其他
导致线性回归在现实场景中应用有限。
逻辑回归的优点:
- 对线性关系的拟合效果极好
- 计算速度快,优于SVM和随机森林
- 逻辑回归返回的结果是类概率数字,可以把其当成连续型来使用
- 抗噪能力强
逻辑回归的本质:返回一个对数几率的,在线性数据上表现优异的分类器。逻辑回归通常被用来处理二分类问题,但也可以做多分类。
sklearn中的逻辑回归
- linear_model.LogisticRegression,逻辑回归分类器,又叫logit回归/最大熵分类器
- linear_model.LogisticRegressionCV,带交叉验证的逻辑回归分类器
- linear_model.logistic_regression_path,计算logistic回归模型以获得正则化参数的列表
- linear_model.SGDclassifier,利用梯度下降求解的线性分类器(SVM,逻辑回归等)
- linear_model.SGDRegressor,利用梯度下降最小化正则化后的损失函数的线性回归模型
- metric.log_loss,对数损失,又称逻辑损失或交叉熵损失;逻辑回归专用的损失
- metrics.confusion_matrix,混淆矩阵,模型评估指标之一
- metrics.roc_auc_score,ROC曲线,模型评估指标之一
- metrics.accuracy_score,精确性,模型评估指标之一
linear_model.LogisticRegression
- 损失函数
- 衡量参数的优劣的评估指标,用来求解最优参数的工具
- 没有求解参数需求的模型没有损失函数,比如KNN,决策树
- 逻辑回归的损失函数由极大似然估计推导而来:
其中,yi是真实标签,yθ(xi)是逻辑回归返回值 - 对逻辑回归过拟合的控制,通过正则化来实现
- 参数说明
- penalty,可以输入l1或l2来指定使用哪一种正则化方式
- C,正则化强度的倒数,默认1.0;C越小,模型对损失函数的惩罚越重,正则化效力越强。
- max_iter,是梯度下降求解的重要参数,是梯度下降的迭代次数(步数)
- multi_class: ovr表示问题是二分类问题,或者使用ovr(one vs rest, 一对多)的形式来处理多分类问题;multinomial表示处理多分类问题;auto表示会根据数据的分类情况及其他参数来确定模型要处理的分类问题的类型;
- solver:求解器的选择,共有5种选择。liblinear,坐标下降法;libfgs,拟牛顿法的一种,利用损失函数二阶导数矩阵来迭代优化损失函数;newton-cg,牛顿法的一种,利用损失函数二阶导数矩阵来迭代优化损失函数;sag, 随机平均梯度下降,与普通梯度下降的区别就是每次迭代仅使用一部分的样本来计算梯度;saga,随机平均梯度下降法的进化,稀疏多项逻辑回归的首选。
- 样本不平衡与参数class_weight, 此参数对样本标签进行一定的均衡,给少量的标签更多的权重,让模型偏向少数类,像捕获少数类的方向建模
正则化
正则化是防止模型过拟合的过程,常用的有L1正则化和L2正则化,分别在损失函数后加上参数的L1范式和L2范式的倍数来实现。这个增加的范式,被称为“正则项”,也被成为“惩罚项”。
- 正则化强度逐渐增大,L1正则会会将参数压缩为0,L2正则化只会让参数尽量小,不会取到0
- L1范式
- L2范式
代码示例
from sklearn.linear_model import LogisticRegression as LR
from sklearn.datasets import load_breast_cancer
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
data = load_breast_cancer()
x = data.data
y = data.target
lrl1 = LR(penalty='l1',solver='liblinear',C=0.5,max_iter=1000)
lrl2 = LR(penalty='l2',solver='liblinear',C=0.5,max_iter=1000)
lrl1 = lrl1.fit(x,y)
lrl2 = lrl2.fit(x,y)
逻辑回归中的特征工程
当特征数量很多的时候,希望对逻辑回归进行特征选择
- 先验知识,选取特征
- 降维,一般不用PCA和SVD,因为会消除特征的可解释性
- 统计方法可以用,但不是非常必要;如可以使用方差,卡方,互信息等方法来做特征选择。也可以选择差异显著的特征。
- 高效的嵌入法embedded; L1正则化可以用来做特征选择,结合嵌入法的模块SelectFromModel,可以选择让模型非常高效的特征
from sklearn.linear_model import LogisticRegression as LR
from sklearn.datasets import load_breast_cancer
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import cross_val_score
from sklearn.feature_selection import SelectFromModel
data = load_breast_cancer()
LR_ = LR(solver='liblinear',C=0.9,random_state=2023)
cross_val_score(LR_,data.data,data.target,cv=10).mean()
X_embedded = SelectFromModel(LR_,norm_order=1).fit_transform(data.data,data.target) # L1范式的选择
cross_val_score(LR_,X_embedded,data.target,cv=10).mean()
参考
[1] B占主播菜菜TsaiTsai