逻辑回归
逻辑回归,是一种名为“回归”的线性分类器,其本质是由线性回归变化而来的,一种广泛使用于分类问题中的广义回归算法
其中0被称为截距(intercept), 1~n 被称为系数(coefficient)
矩阵表示:
通过函数z,线性回归使用输入的特征矩阵X来输出一组连续型的标签值y_pred,以完成各种预测连续型变量的任务 (比如预测产品销量,预测股价等等)。
标签是离散型变量,如果是满足0-1分布的离散型变量,使用逻辑回归这个回归模型
回归模型可以实现分类效果, 使用sigmod函数
sigmod函数
线性回归方程z变换为g(z),并且将g(z)的值分布在(0,1)之间,且当g(z)接近0时样本的标签为类别0,当g(z)接近1时样本的标签为类别1
e:e是自然对数的底数,是一个无限不循环小数,其值是2.71828...
函数解释: Sigmoid函数是一个S型的函数,当自变量z趋近正无穷时,因变量g(z)趋近于1,而当z趋近负无穷时,g(z)趋近于0,它能够将任何实数(非0和1的标签数据)映射到(0,1)区间,使其可用于将任意值函数转换为更适合二分类的函数
MinMaxScaler与Sigmoid的区别:MinMaxScaler归一化之后,是可以取到0和1的(最大值归一化后就是1,最小值归一化后就是0),但Sigmoid函数只是无限趋近于0和1
#测试,查看sigmod函数是否可以将线性回归返回的任意实数压缩到0-1之间
import numpy as np
num=15
1/(1+(np.e**-num))
逻辑回归和线性回归之间的关联
将 z=Tx 代入
y(x)是逻辑回归返回的标签值 , y(x)的取值都在[0,1]之间 , y(x)和1-y(x)相加必然为1
形似几率:y(x)/1-y(x)
y(x)逻辑回归的形似几率取对数的本质是线性回归z,是在对线性回归模型的预测结果取对数几率来让其的结果无限逼近0和1。因此,逻辑回归又被称为“对数几率回归“(logistic Regression )
逻辑回归的形似几率取对数就是线性回归
-
线性回归解的对数几率就是逻辑回归
因此逻辑回归是由线性回归变化而来的
线性回归的核心任务是通过求解θ构建z这个预测函数,并希望预测函数z能够尽量拟合数据
逻辑回归的核心任务:求解θ来构建一个能够尽量拟合数据的预测函数z,并通过向预测函数中输入特征矩阵来获取相应的标签值y。
逻辑回归的优点
-
逻辑回归是一个受工业商业热爱,使用广泛的模型。
1.逻辑回归对线性关系(特征与标签之间的线性关系极强的数据)的拟合效果好.数据之间的联系是非线性的,不要使用逻辑回归!
2.逻辑回归计算快:对于线性数据,逻辑回归的拟合和计算都非常快,计算效率优于SVM和随机森林
3.逻辑回归返回的分类结果不是固定的0,1,而是以小数形式呈现的类概率数字:我们因此可以把逻辑回归返回的结果当成连续型数据来利用。
-
总结:
- 逻辑回归的本质是一个返回对数几率的在线性数据上表现优异的分类器,它主要被应用在金融领域。注意,虽然我们熟悉的逻辑回归通常被用于处理二分类问题,但逻辑回归也可以做多分类。
逻辑回归的损失函数
-
在逻辑回归分类的时候,不管原始样本中的类别使用怎样的值或者文字表示,逻辑回归统一将其视为0类别和1类别。
- 由于逻辑回归是用于分类的,因此该损失函数和线性回归的损失函数是不一样的,逻辑回归采用的损失函数是:对数似然损失函数
注意:没有求解参数需求的模型是没有损失函数的,比如KNN,决策树。
-
损失函数被写作如下:
-
使用-log函数为损失函数的原因:损失函数的本质就是,预测对则没有损失,反之则损失需要变的很大,而-log函数在[0,1]之间正好符合这一点。
-log(h)表示分类到正例1的损失
-log(1-h)表示分类到反例0的损失
-
损失函数表征预测值与真实值之间的差异程度,如果预测值与真实值越接近则损失函数应该越小
损失函数解释
yilog(h)表示分类到真实标签的正例的损失,根据-log函数得知如果分类正确则损失值小,反之损失大
-(1-yi)log(1-h)表示分类到真实标签反例的损失,根据-log函数得知如果分类正确则损失小,反之损失大
两者相加就获得了逻辑回归模型总分类结果的损失
-
将逻辑回归对应的预测结果带入损失函数:
梯度下降
逻辑回归的数学目的是求解能够让模型最优化,拟合程度最好的参数的值,即求解能够让损失函数J()最小化的值。
梯度下降原理介绍
-
假设现在有一个带两个特征并且没有截距的逻辑回归y(x1,x2),两个特征所对应的参数分别为[1,2]
损失函数 J(1,2)在以1,2和J为坐标轴的三维立体坐标系上的图像:
寻求的是损失函数的最小值,也就是图像的最低点
梯度下降是在众多[1,2]可能的值中遍历,一次次求解坐标点的梯度向量,不断让损失函数的取值J逐渐逼近最小值,再返回这个最小值对应的参数取值[1,2]的过程。
正则化
-
注意:
- 避免出现模型在训练集上表示优秀,却在测试集上表现糟糕,模型就会出现过拟合的问题.因此出现正则化,正则化是用来防止模型过拟合的过程,常用的有L1正则化和L2正则化两种选项,分别通过在损失函数后加上参数向量的L1范式和L2范式的倍数来实现。这个增加的范式,被称为“正则项”,也被称为"惩罚项"。
-
L1范式
-
L1范式表现为参数向量中的每个参数的绝对值之和
-
-
L2范式
- L2范数表现为参数向量中的每个参数的平方和的开方值
J()是损失函数,C是用来控制正则化程度的超参数,n是方程中特征的总数,也是方程中参数的总数,j代表每个参数(w系数)。j>=1,是因为我们的参数向量中,第一个参数是0,是截距它通常是不参与正则化的。
-
总结:
我们知道损失函数的损失值越小(在训练集中预测值和真实值越接近)则逻辑回归模型就越有可能发生过拟合(模型只在训练集中表现的好,在测试集表现的不好)的现象。通过正则化的L1和L2范式可以加入惩罚项C来矫正模型的拟合度。因为C越小则损失函数会越大表示正则化的效力越强,参数会被逐渐压缩的越来越小。
注意:L1正则化会将参数w压缩为0,L2正则化只会让参数尽量小,不会取到0。
-
L1和L2范式的区别
在L1正则化在逐渐加强的过程中,携带信息量小的、对模型贡献不大的特征的参数w,会比携带大量信息的、对模型有巨大贡献的特征的参数更快地变成0,所以L1正则化本质是一个特征选择的过程。L1正则化越强,参数向量中就越多的参数为0,选出来的特征就越少,以此来防止过拟合。因此,如果特征量很大,数据维度很高,我们会倾向于使用L1正则化。
L2正则化在加强的过程中,会尽量让每个特征对模型都有一些小的贡献,但携带信息少,对模型贡献不大的特征的参数w会非常接近于0。通常来说,如果我们的主要目的只是为了防止过拟合,选择L2正则化就足够了。但是如果选择L2正则化后还是过拟合,模型在未知数据集上的效果表现很差,就可以考虑L1正则化。
建立两个逻辑回归,L1正则化和L2正则化的差别:
from sklearn.linear_model import LogisticRegression as LR
from sklearn.datasets import load_breast_cancer
import numpy as np
from sklearn.model_selection import train_test_split
#加载样本数据
data = load_breast_cancer()
X = data.data
y = data.target
#建立两种模型
lrl1 = LR(penalty="l1",C=0.1,solver="liblinear")
lrl2 = LR(penalty="l2",C=0.1)
#逻辑回归的重要属性coef_,查看每个特征所对应的参数
lrl1.fit(X,y)
print('L1范式:',lrl1.coef_)
lrl2 = lrl2.fit(X,y)
print('L2范式:',lrl2.coef_)
L1范式: [[ 0.61541583 0. 0.2536785 -0.00457022 0. 0.
0. 0. 0. 0. 0. 0.
0. -0.0491644 0. 0. 0. 0.
0. 0. 0.4536192 -0.13120128 -0.1414278 -0.02004643
0. 0. 0. 0. 0. 0. ]]
L2范式: [[ 0.57759855 0.1939224 0.32429513 -0.01172603 -0.01976427 -0.0961107
-0.13487158 -0.05670151 -0.02736746 -0.00534154 0.02389697 0.22340603
0.05462525 -0.08773606 -0.00185201 -0.02067312 -0.02868267 -0.00742861
-0.00660566 -0.00186004 0.60918523 -0.28469475 -0.20256723 -0.01543876
-0.03639686 -0.30101307 -0.37373944 -0.10976898 -0.08801033 -0.0282845 ]]
逻辑回归API
from sklearn.linear_model import LogisticRegression
-
超参数介绍:
- penalty:
- 可以输入l1或者l2来指定使用哪一种正则化方式。不填写默认"l2"。 注意,若选择"l1"正则化,参数solver仅能够使用求解方式”liblinear"和"saga“,若使用“l2”正则 化,参数solver中所有的求解方式都可以使用。
- C:
- 惩罚项。必须是一个大于0的浮点数,不填写默认1.0,即默认正则项与损失函数的比值是1:1。C越小,损失函数会越大,模型对损失函数的惩罚越重,正则化的效力越强,参数会逐渐被压缩得越来越小。
- max_iter:
- 梯度下降中能走的最大步数,默认值为100.步数的不同取值可以帮助我们获取不同的损失函数的损失值。计算出最优的max_iter的值,一般是通过绘制学习曲线对其进行取值。
- solver:
- 梯度下降法只是求解逻辑回归参数的一种方法。sklearn为我们提供了多种选择,让我们可以使用不同的求解器来计算逻辑回归。求解器的选择,由参数"solver"控制,共有五种选择。
- liblinear:是二分类专用(梯度下降),也是现在的默认求解器。
-
lbfgs,newton-cg,sag,saga:是多分类专用,几乎不用。
- 梯度下降法只是求解逻辑回归参数的一种方法。sklearn为我们提供了多种选择,让我们可以使用不同的求解器来计算逻辑回归。求解器的选择,由参数"solver"控制,共有五种选择。
- multi_class:
- 输入"ovr", "multinomial", "auto"来告知模型,我们要处理的分类问题的类型。默认是"ovr"。
- 'ovr':表示分类问题是二分类,或让模型使用"一对多"的形式来处理多分类问题。
- 'multinomial':表示处理多分类问题,这种输入在参数solver是'liblinear'时不可用。
- "auto":表示会根据数据的分类情况和其他参数来确定模型要处理的分类问题的类型。比如说,如果数据是二分类,或者solver的取值为"liblinear","auto"会默认选择"ovr"。反之,则会选择"multinomial"。
- class_weight:
- 表示样本不平衡处理的参数。样本不平衡指的是在一组数据中,某一类标签天生占有很大的比例,或误分类的代价很高
- None:
- 因此我们要使用参数class_weight对样本标签进行一定的均衡,给少量的标签更多的权重,让模型更偏向少数类, 向捕获少数类的方向建模。该参数默认None,此模式表示自动给与数据集中的所有标签相同的权重,即自动1: 1。
- balanced:
- 当误分类的代价很高的时候,我们使用”balanced“模式,可以解决样本不均衡问题。
- penalty:
乳腺癌数据集下,max_iter的学习曲线
%matplotlib inline
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
l2 = []
l2_test = []
Xtrain, Xtest, Ytrain, Ytest = train_test_split(X,y,test_size=0.3,random_state=420)
for i in np.arange(1,201,10):
lrl2 = LR(penalty="l2",solver="liblinear",C=0.9,max_iter=i)
lrl2.fit(Xtrain,Ytrain)
#模型在训练集的表现
l2.append(accuracy_score(lrl2.predict(Xtrain),Ytrain))
#模型在测试集上的表现
l2_test.append(accuracy_score(lrl2.predict(Xtest),Ytest))
graph = [l2,l2_test]
color = ["black","red"]
label = ["L2train","L2test"]
plt.figure(figsize=(20,5))
for i in range(len(graph)):
plt.plot(np.arange(1,201,10),graph[i],color[i],label=label[i])
plt.legend(loc=4)
plt.xticks(np.arange(1,201,10))
plt.show()