文章机器学习 | 逻辑回归算法(一)理论中详细介绍了逻辑回归理论知识。
逻辑回归是一种广义线性回归模型,是Sigmoid
函数归一化后的线性回归模型,常用来解决二元分类问题,可解释性强。它假设数据服从伯努利分布,通过梯度下降法对其损失函数(极大似然函数)求解,以达到数据二分类的目的。
逻辑回归不要求自变量和因变量是线性关系。它可以处理各种类型的关系,因为它对预测的相对风险指数或使用了一个非线性的转换。它广泛的用于分类问题。
基本原理是其函数表达式为对数几率函数,通过Sigmoid
函数将线性回归方程转化,将任何实数映射到(0,1)之间
优化目标是通过观测样本的极大似然估计值来选择参数。
损失函数表征模型预测值与真实值的不一致程度。LR损失函数为负的对数损失函数。逻辑回归,假设样本服从伯努利分布(0-1分布),然后求得满足该分布的似然函数,接着取对数求极值最小化负的似然函数。应用极大似然估计法估计模型参数,从而得到逻辑回归模型。逻辑回归的损失函数求最小值,就是根据最大似然估计的方法来的。并使用梯度下降法求解损失函数。
sklearn中逻辑回归
Sklearn中逻辑回归相关的类 | 说明 |
---|---|
linear_model.LogisticRegression | 逻辑回归分类器(又叫logit回归,最大熵分类器) |
linear_model.LogisticRegressionCV | 带交叉验证的逻辑回归分类器 |
linear_model.logistic_regression_path | 计算Logistic回归模型以获得正则化参数的列表 |
linear_model.SGDClassifier | 利用梯度下降求解的线性分类器(SVM,逻辑回归等等) |
linear_model.SGDRegressor | 利用梯度下降最小化正则化后的损失函数的线性回归模型 |
metrics.log_loss | 对数损失,又称逻辑损失或交叉熵损失 |
sklearn.linear_model.LogisticRegression (penalty=’l2’, dual=False, tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1, class_weight=None, random_state=None, solver=’warn’, max_iter=100, multi_class=’warn’, verbose=0, warm_start=False, n_jobs=None)
逻辑回归的损失函数
正则化参数penalty & C
penalty: {‘l1’, ‘l2’, ‘elasticnet’, ‘none’}, default=’l2’
可以输入
"l1"
或"l2"
来指定使用哪一种正则化方式,不填写默认"l2"
。注意,若选择"l1"
正则化,参数solver
仅能够使用求解方式"liblinear"
和"saga"
,若使用"l2"
正则 化,参数solver
中所有的求解方式都可以使用。
C: float, default=1.0
C
正则化强度的倒数,必须是一个大于0的浮点数,不填写默认1.0,即默认正则项与损失函数的比值是1:1。C
越小,损失函数会越小,模型对损失函数的惩罚越重,正则化的效力越强,参数 会逐渐被压缩得越来越小。
正则化是用来防止模型过拟合的过程,常用的有L1正则化
和L2正则化
两种选项,分别通过在损失函数后加上参数向量 的L1范式和L2范式的倍数来实现。
sklearn 中的带L1正则化
的损失函数
L2正则化
其中 是损失函数,C
是用来控制正则化程度的超参数,n
是方程中特征的总数,也是方程中参数的总数,i
代表每个参数,且 是因为我们的参数向量中,第一个参数是 ,为截距,它通常是不参与正则化的。
L1正则化
和L2正则化
虽然都可以控制过拟合,但它们的效果并不相同。当正则化强度逐渐增大(即C逐渐变小), 参数 的取值会逐渐变小,但L1正则化
会将参数压缩为0,L2正则
化只会让参数尽量小,不会取到0。
>>> 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