逻辑回归


文章目录

  • 逻辑回归
  • 一、概念
  • 二、代价函数
  • 2.1 损失函数
  • 2.2 极大似然法
  • 2.3 优化
  • 2.4 逻辑回归中的梯度下降
  • 三、二分类逻辑回归实现
  • 四、多分类逻辑回归
  • 4.1 概念
  • 4.2 实现
  • 4.3 过拟合问题
  • 五、小结


一、概念

  逻辑回归是一种很容易实现的分类模型,但仅在线性可分类上表现不错。是一种应用广泛的 二分类模型,而且可以利用 OVR 技术扩展到多元分类。

  要解释作为概率模型的逻辑回归原理,首先要介绍 让步比,既有利于某一特定事件的概率。让步比可以定义为 python 中向后回归 python如何做回归_python 中向后回归python 中向后回归 python如何做回归_机器学习_02 代表阳性事件的概率。阳性事件是指要预测的事件,例如患新冠肺炎的可能性或彩票中奖的可能性。可以认为阳性事件的分类标签 python 中向后回归 python如何做回归_python_03 。可以进一步定义 logit 函数(让步比的对数形式)。

python 中向后回归 python如何做回归_逻辑回归_04

  python 中向后回归 python如何做回归_python_05 为自然对数,python 中向后回归 python如何做回归_数据挖掘_06 函数输入值的取值范围在 0 到 1 之间,转换或计算的结果值为整个实数范围,此时我们来回顾一下 回归方程

python 中向后回归 python如何做回归_逻辑回归_07

  python 中向后回归 python如何做回归_机器学习_08 的阈值处于 python 中向后回归 python如何做回归_数据挖掘_09 ,此时不能很好的给出某一类的概率,因为概率的取值应在 python 中向后回归 python如何做回归_机器学习_10 之间,并且这个函数能够具有很好的可微分性,因此找到了 python 中向后回归 python如何做回归_数据挖掘_06 函数的逆形式,及 python 中向后回归 python如何做回归_python 中向后回归_12 函数(也叫python 中向后回归 python如何做回归_python_13 函数),有关于 python 中向后回归 python如何做回归_python 中向后回归_12 函数的知识可参考我的另一篇文章:神经网络,此处不再重复解释。python 中向后回归 python如何做回归_python 中向后回归_12 函数的形式为:

python 中向后回归 python如何做回归_python_16

python 中向后回归 python如何做回归_机器学习_17

python 中向后回归 python如何做回归_逻辑回归_18 取向 python 中向后回归 python如何做回归_机器学习_19 时,python 中向后回归 python如何做回归_python_20 的值接近于1,我们以 0.5 为界限,得到逻辑回归的目标函数:
python 中向后回归 python如何做回归_数据挖掘_21
  综合可得
python 中向后回归 python如何做回归_数据挖掘_22

python 中向后回归 python如何做回归_python_23 是因变量,而非 python 中向后回归 python如何做回归_逻辑回归_24,这便引出逻辑回归和线性回归最大的区别,即逻辑回归中的因变量为离散的,而线性回归中的因变量是连续的。并且在自变量 python 中向后回归 python如何做回归_逻辑回归_25 与超参数 python 中向后回归 python如何做回归_机器学习_26 确定的情况下,逻辑回归可以看作 广义线性模型 python 中向后回归 python如何做回归_数据挖掘_27 在因变量 python 中向后回归 python如何做回归_python_23 服从二元分布时的一个特殊情况;而使用最小二乘法求解线性回归时,我们认为因变量 python 中向后回归 python如何做回归_python_23

二、代价函数

2.1 损失函数

python 中向后回归 python如何做回归_python_30python 中向后回归 python如何做回归_机器学习_31 使得 python 中向后回归 python如何做回归_机器学习_32 对 0 类和 1 类的分类结果尽可能取最大值。然而我们定义损失函数时往往是为了最大化的达到我们的目的的同时使所付出的代价最小(损失函数最小)。于是很自然地在目的函数前加一个负号就得到了我们逻辑回归的损失函数:
python 中向后回归 python如何做回归_python_33
  根据损失函数是单个样本的预测值和实际值的误差,而成本函数是全部样本的预测值和实际值之间的误差,于是对所有样本的损失值取平均,得到我们的成本函数:
python 中向后回归 python如何做回归_python 中向后回归_34

2.2 极大似然法

python 中向后回归 python如何做回归_机器学习_35,假设数据集中的样本都是相互独立的个体,极大似然估计逻辑回归中的参数 python 中向后回归 python如何做回归_python_30python 中向后回归 python如何做回归_机器学习_31。利用极大似然法的原则,假设所有样本独立同分布, 则联合概率为所有样本概率的乘积,公式如下:
python 中向后回归 python如何做回归_python_38
  在实践中,最大化该方程的自然对数,也被称为对数自然函数。
python 中向后回归 python如何做回归_逻辑回归_39
  极大似然估计的本质就是选取python 中向后回归 python如何做回归_python 中向后回归_40

2.3 优化

python 中向后回归 python如何做回归_python 中向后回归_41

python 中向后回归 python如何做回归_python 中向后回归_42,用梯度下降方法来最小化代价函数。
python 中向后回归 python如何做回归_python 中向后回归_43
  为了更高的理解公式python 中向后回归 python如何做回归_python_44 ,计算一个样本训练实例的代价:
python 中向后回归 python如何做回归_数据挖掘_45
  可以看到,如果 python 中向后回归 python如何做回归_机器学习_46,第一项为0,如果 python 中向后回归 python如何做回归_逻辑回归_47,第二项为0:
python 中向后回归 python如何做回归_机器学习_48
  通过可视化来说明 python 中向后回归 python如何做回归_python_20

def sigmoid(z):
    return 1.0 / (1.0 + np.exp(-z))

def cost_1(z):
    return -np.log(sigmoid(z))

def cost_0(z):
    return -np.log(1 - sigmoid(z))
z = np.arange(-10, 10, 0.1)
phi_z = sigmoid(z)
c1 = [cost_1(x) for x in z]
c0 = [cost_0(x) for x in z]
plt.plot(phi_z, c1, 'b-', label='$J(w) \; if \; y=1$')
plt.plot(phi_z, c0, 'r--', label='$J(w) \; if \; y=0$')
plt.ylim(0, 5.1)
plt.xlim([0, 1])
plt.xlabel('$\phi(z)$')
plt.ylabel('$J(w)$')
plt.legend(loc='best')

python 中向后回归 python如何做回归_逻辑回归_50

python 中向后回归 python如何做回归_机器学习_46(虚线),那么代价也会接近于0,而如果预测错误,代价就会趋于无穷大。关键在于用越来越大的代价惩罚错误的预测。

2.4 逻辑回归中的梯度下降

  以下梯度下降学习规则是对逻辑回归的梯度下降学习规则背后的数学概念有兴趣的准备的,首先从计算对数似然函数的偏导数开始:
python 中向后回归 python如何做回归_数据挖掘_52
  计算 python 中向后回归 python如何做回归_python 中向后回归_12 函数的偏导数:
python 中向后回归 python如何做回归_数据挖掘_54
  可以在 python 中向后回归 python如何做回归_python_55 中替换 python 中向后回归 python如何做回归_逻辑回归_56
python 中向后回归 python如何做回归_python 中向后回归_57
  目标是找到可以最大化对数似然率的权重,这样就可以更新每个权重,如下:
python 中向后回归 python如何做回归_逻辑回归_58
  因为要更新所有的权重,因此把通用的更新规则表示如下:
python 中向后回归 python如何做回归_python_59
  由于最大化对数似然相当于最小化前面定义的代价函数 python 中向后回归 python如何做回归_python 中向后回归_42,因此,可以得到下述梯度下降更新规则:
python 中向后回归 python如何做回归_数据挖掘_61

三、二分类逻辑回归实现

  以鸢尾花分类为例,由于该模型只适用于二元分类,所以此次仅识别类0和类1:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression

X, y = load_iris(return_X_y=True)
X = X[(y==0) | (y==1)]
y = y[(y==0) | (y==1)]

对数据进行标准化处理

X, y = load_iris(return_X_y=True)
X = X[(y==0) | (y==1)]
y = y[(y==0) | (y==1)]

训练模型

lr = LogisticRegression()
lr.fit(X_train, y_train)
lr.score(X_test, y_test)
1.0

四、多分类逻辑回归

4.1 概念

  使用哪一种方法来处理多分类的问题取决于具体问题的定义。首先,如果一个样本只对应一个标签,我们可以假设每个样本属于不同标签的概率服从几何分布,使用 多项式逻辑回归 python 中向后回归 python如何做回归_逻辑回归_62 来进行分类:
python 中向后回归 python如何做回归_python 中向后回归_63
  其中 python 中向后回归 python如何做回归_逻辑回归_64 为模型的参数,而 python 中向后回归 python如何做回归_逻辑回归_65 可以看作是对概率的归一化。为了方便起见,将参数列的 python 中向后回归 python如何做回归_机器学习_66 个列向量按顺序排列形成 python 中向后回归 python如何做回归_数据挖掘_67 矩阵,写作 python 中向后回归 python如何做回归_python_68,表示整个参数集。一般来说,多项逻辑回归具有参数冗余的特点,即将参数集同时加减一个向量后预测结果不变,特别的,当类别数为2时:
python 中向后回归 python如何做回归_python 中向后回归_69
  利用参数冗余的特点,将所有的参数减去 python 中向后回归 python如何做回归_python 中向后回归_70,式 python 中向后回归 python如何做回归_逻辑回归_71 变为:
python 中向后回归 python如何做回归_机器学习_72
  其中 python 中向后回归 python如何做回归_python 中向后回归_73

python 中向后回归 python如何做回归_机器学习_66 个二分类的逻辑回归分类器,第 python 中向后回归 python如何做回归_逻辑回归_75 个分类器用以区分每个样本是否可以归为第 python 中向后回归 python如何做回归_逻辑回归_75 类,训练该分类器时,需要把标签重新整理为 “第python 中向后回归 python如何做回归_逻辑回归_75 类标签” 与 “非第 python 中向后回归 python如何做回归_逻辑回归_75

4.2 实现

  同样以鸢尾花分类为例,该数据集共有三个类别

X, y = load_iris(return_X_y=True)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

ss = StandardScaler()
ss.fit(X)
X_train, X_test = ss.transform(X_train), ss.transform(X_test)

lr = LogisticRegression()
lr.fit(X_train, y_train)
lr.score(X_test, y_test)
1.0

4.3 过拟合问题

  过拟合 是机器学习中的常见问题,虽然模型在训练数据上表现良好,但无法概括未见过的新数据或测试数据。如果某个模型出现过拟合的问题,会说该模型具有较高的 方差,可能是因为相对于给定的数据,参数太多,模型过于复杂。同样,模型也可能会出现偏差高 欠拟合 的情况,这意味着模型不足以捕捉训练数据中的复杂模式,因此对未见过的数据表现不良。

  方差用来度量模型对样本预测结果的一致性,例如训练集的不同子集,模型是否能保持不变。模型对训练数据的随机性很敏感。相反,针对不同的训练集多次建模,用偏差来度量预测值与真实值之间的差异。偏差度量非随机所带来的系统误差。

  找到好的 偏差-方差 平衡的方法之一是通过正则化来调整模型的复杂性。正则化是处理共线性(特征之间的高相关性),滤除数据中的噪声,并最终避免过拟合的非常有效的方法。正则化的逻辑是引入额外的信息(偏置)来惩罚极端的参数值(权重)。最常见的正则化是 python 中向后回归 python如何做回归_逻辑回归_79
python 中向后回归 python如何做回归_python 中向后回归_80
  python 中向后回归 python如何做回归_数据挖掘_81正则化参数

  逻辑回归的代价函数可以通过增加一个简单的正则项来调整,浙江在模型训练的时候缩小权重:
python 中向后回归 python如何做回归_python 中向后回归_82
  python 中向后回归 python如何做回归_数据挖掘_81 正则化参数可以控制如何在更好的拟合训练数据的同时保持较小的权重,可以通过加大 python 中向后回归 python如何做回归_数据挖掘_81

  sklearn 实现 LogisticRegression 类的参数 C 来自于支持向量机的约定, Cpython 中向后回归 python如何做回归_数据挖掘_81 之间相关联,与正则化参数成反比。因此,降低逆正则化参数C 意味着增加正则化的强度。

五、小结

  逻辑回归是一种最基础的概率分类模型,其具有以下特点:

  • 实现简单,广泛的应用于工业问题上;
  • 分类时计算量非常小,速度很快,存储资源低;
  • 便利的观测样本概率分数;
  • 对逻辑回归而言,多重共线性并不是问题,它可以结合L2正则化来解决该问题。

  然而,也有以下弊端:

  • 当特征空间很大时,逻辑回归的性能不是很好,容易欠拟合,一般准确度不太高;
  • 不能很好地处理大量多类特征或变量;
  • 只能处理线性可分;
  • 对于非线性特征,需要进行转换。
    python 中向后回归 python如何做回归_机器学习_86 之间相关联,与正则化参数成反比。因此,降低逆正则化参数C 意味着增加正则化的强度。