【机器学习与实现】逻辑回归分析


一、相关概念

(一)回归与分类的区别

回归:因变量取连续值。例如一台4核CPU,3G内存的手机,跑分估计会是多少?
分类:因变量取离散值。例如这台手机的性能应分为哪一类 (高性能还是低性能) ?

手机性能与硬件配置表
核心数内存跑分
185020
86200000
84130000
83105000
10230000

用回归的方法做分类,可以考虑以下步骤:

  1. 求出回归方程的参数
  2. 计算手机的跑分值
  3. 设置一个阈值,比较跑分值和阈值的大小

关键:阈值取多少合适?

(二)跃阶函数和激活函数

在这里插入图片描述

阶跃函数和激活函数对比图

1、Sigmoid函数的数学表达式: g ( z ) = 1 1 + e − z g(z)=\frac{1}{1+e^{-z}} g(z)=1+ez1

  • z = 0 z=0 z=0 时, g ( z ) = 0.5 g(z) = 0.5 g(z)=0.5
  • 随着 z z z的增大,对应的 g ( z ) g(z) g(z)值逐渐逼近于1
  • 随着 z z z的减小,对应的 g ( z ) g(z) g(z)值逐渐逼近于0

2、两个基本性质: g ( − z ) = 1 − g ( z ) g(-z)=1-g(z) g(z)=1g(z) d g ( z ) d x = g ( z ) [ 1 − g ( z ) ] \frac{\mathrm{d}g(z)}{\mathrm{d}x}=g(z)[1-g(z)] dxdg(z)=g(z)[1g(z)]

  • 相同点:都可以实现对连续值的离散化
  • 不同点:跃阶函数存在瞬间跳变,数学上具有不连续性,不好处理;而Sigmoid激活函数是连续函数,具有良好的数学性质: g ( z ) g(z) g(z)不仅处处光滑可导,而且是任意阶可导的凸函数。

二、逻辑回归 (logistic Regression)

(一)逻辑回归的基本概念

1、思想:基于回归模型做分类

  • 线性回归模型 f ( X ) = w T X f(X)=\mathbf{w}^TX f(X)=wTX

  • 待分类样本 X = ( x 1 , x 2 , . . . , X m ) T X=(x_1,x_2,...,X_m)^T X=(x1,x2,...,Xm)T (此处的 X 表 X表 X示单个样本)

  • 分类的目标:将样本 X X X划分为正例或返利

  • 关键要点:激活函数 g ( f ( X ) ) g(f(X)) g(f(X)) 的设计

Sigmoid函数 g ( z ) = 1 1 + e − z \begin{aligned}g(z)=\frac{1}{1+e^{-z}}\end{aligned} g(z)=1+ez1 如果阈值取0.5,可以用于分类。

在这里插入图片描述
2、二值分类的基本流程

在这里插入图片描述

(二)逻辑回归的分类思想

把一个样本 X i X_i Xi 逻辑回归的函数值 g ( X i ) g(X_i) g(Xi) 看成是该样本属于正例 y i = 1 y_i=1 yi=1 的概率值:

  • 如果该值大于0.5,就可以判定该样本属于正例
  • 如果该值小于0.5,则可判定该样本属于反例
    p ( y i = 1 ∣ X i ) = g ( X i ) = 1 1 + e − θ T X i = e θ T X i 1 + e θ T X i p(y_i=1|X_i)=g(X_i)=\frac{1}{1+e^{-\theta^TX_i}}=\frac{e^{\theta^TX_i}}{1+e^{\theta^TX_i}} p(yi=1∣Xi)=g(Xi)=1+eθTXi1=1+eθTXieθTXi p ( y i = 0 ∣ X i ) = 1 − g ( X i ) = 1 − e θ T X i 1 + e θ T X i = 1 1 + e θ T X i p(y_i=0|X_i)=1-g(X_i)=1-\frac{e^{\theta^TX_i}}{1+e^{\theta^TX_i}}=\frac{1}{1+e^{\theta^TX_i}} p(yi=0∣Xi)=1g(Xi)=11+eθTXieθTXi=1+eθTXi1

(三)逻辑回归与对数几率的关系

一个事件的几率 (odds) 是指该事件发生的概率与该事件不发生概率的比值,即:如果事件发生概率为 p p p,那么该事件的几率等于 p 1 − p \frac{p}{1-p} 1pp。该事件的对数几率 (log odds) 或者 logit (对它取log,即 log it) 函数是: l o g i t ( p ) = log ⁡ p 1 − p logit(p)=\log\frac{p}{1-p} logit(p)=log1pp 如果求逻辑回归中正例样本的对数几率,则有: log ⁡ p ( y i = 1 ∣ X i ) p ( y i = 0 ∣ X i ) = log ⁡ g ( X i ) 1 − g ( X i ) = log ⁡ e θ T X i 1 + e θ T X i 1 1 + e θ T X i = θ T X i \begin{aligned}\log\frac{p(y_i=1|X_i)}{p(y_i=0|X_i)}=\log\frac{g(X_i)}{1-g(X_i)}=\log\frac{\frac{e^{\theta^TX_i}}{1+e^{\theta^TX_i}}}{\frac{1}{1+e^{\theta^TX_i}}}\end{aligned}=\theta^TX_i logp(yi=0∣Xi)p(yi=1∣Xi)=log1g(Xi)g(Xi)=log1+eθTXi11+eθTXieθTXi=θTXi 即:逻辑回归中输出 y i = 1 y_i=1 yi=1 (正例样本) 的对数几率是输入 X i X_i Xi 的线性函数 (逻辑回归也称为对数几率回归)。

注意另外一个事实:因为非线性函数 (此处是 g ( X ) g(X) g(X)) 经过一定的变换可以变成线性函数,所以可以把一个非线性问题转化成一个线性问题来处理!

(四)逻辑回归的损失函数

1、最大似然估计 (MLE)

为了下面分析过程的符号统一,把样本分类成正例的概率预测值记为 y ^ i \hat{y}_i y^i,则有: y ^ i = p ( y i = 1 ∣ X i ) = g ( θ T X i ) \hat{y}_i=p(y_i=1|X_i)=g(\theta^TX_i) y^i=p(yi=1∣Xi)=g(θTXi) 如果已知样本 X i X_i Xi 为正例,即真实的分类标签 y i = 1 y_i=1 yi=1,则希望分类的概率预测值 y ^ i \hat{y}_i y^i 越大越好;反之如果 X i X_i Xi 为反例,即真实的标签 y i = 0 y_i=0 yi=0,则希望 1 − y ^ i 1 −\hat{y}_i 1y^i 越大越好,此时可以将正反例的概率分布统一写成: p ( y i ∣ θ , X i ) = y ^ i y i ( 1 − y ^ i ) 1 − y i p(y_i|\theta,X_i)=\hat{y}_i^{y_i}(1-\hat{y}_i)^{1-y_i} p(yiθ,Xi)=y^iyi(1y^i)1yi 其中, y i = 1 y_i=1 yi=1 0 0 0

学习的目标是要求上式中的系数向量 θ \theta θ,可以通过最大似然估计来求解。 m m m 个样本的最大似然估计 (Maximum Likelihood Estimation) 就是是它们的联合概率分布最大化,即使得右式最大化的系数 θ \theta θ 就是学习目标: θ = arg max ⁡ θ ∏ i = 1 m y ^ i y i ( 1 − y ^ i ) 1 − y i (公式1) \theta=\argmax_\theta\prod_{i=1}^m\hat{y}_i^{y_i}(1-\hat{y}_i)^{1-y_i}\tag{公式1} θ=θargmaxi=1my^iyi(1y^i)1yi(公式1)

2、逻辑回归的损失函数

求解公式1等价于求解使对数似然函数最大化的参数向量 θ \theta θ θ = arg max ⁡ θ ∑ i = 1 m y i ln ⁡ y ^ i + ( 1 − y i ) ln ⁡ ( 1 − y ^ i ) \theta=\argmax_\theta\sum_{i=1}^my_i\ln\hat{y}_i+(1-y_i)\ln(1-\hat{y}_i) θ=θargmaxi=1myilny^i+(1yi)ln(1y^i) 其中, y i = 1 y_i=1 yi=1 0 0 0

上式也等价于求解使负对数似然函数最小化的参数向量 θ \theta θ
θ = arg min ⁡ θ [ − ∑ i = 1 m y i ln ⁡ y ^ i + ( 1 − y i ) ln ⁡ ( 1 − y ^ i ) ] (公式2) \theta=\argmin_\theta\left[-\sum_{i=1}^my_i\ln\hat{y}_i+(1-y_i)\ln(1-\hat{y}_i)\right]\tag{公式2} θ=θargmin[i=1myilny^i+(1yi)ln(1y^i)](公式2)

如果令 L ( θ ) = − ∑ i = 1 m y i ln ⁡ y ^ i + ( 1 − y i ) ln ⁡ ( 1 − y ^ i ) (公式3) L(\theta)=-\sum_{i=1}^my_i\ln\hat{y}_i+(1-y_i)\ln(1-\hat{y}_i)\tag{公式3} L(θ)=i=1myilny^i+(1yi)ln(1y^i)(公式3),则 L ( θ ) L(\theta) L(θ) 就是逻辑回归的损失函数,而使 L ( θ ) L(\theta) L(θ) 最小化的参数向量 θ \theta θ 即学习目标。

在这里插入图片描述

L ( θ ) = − ∑ i = 1 m y i ln ⁡ y ^ i + ( 1 − y i ) ln ⁡ ( 1 − y ^ i ) L(\theta)=-\sum_{i=1}^my_i\ln\hat{y}_i+(1-y_i)\ln(1-\hat{y}_i) L(θ)=i=1myilny^i+(1yi)ln(1y^i)

逻辑回归的损失函数使用了负似然对数函数,而非均方误差函数,原因在于前者是凸函数,存在全局最优解;而后者非凸,可能陷入局部极少值点。

逻辑回归的损失函数 L ( θ ) L(\theta) L(θ) 也称为交叉熵损失函数,交叉熵能够衡量两个数据分布的异同程度,在机器学习中就表示为真实概率分布与预测概率分布之间的差异。交叉熵的值越小,模型预测效果就越好。

3、熵增定律及其启示

熵增定律,又称热力学第二定律,指出在一个孤立系统中,如果没有外力做功,熵(代表混乱程度的物理量)总是趋于增加,即系统总是从有序向无序发展。

如果物理学只能留一条定律,我会留熵增定律。——吴国盛 (清华大学的科学史系主任)

如果地球毁灭了,我们怎么能够在一张名片上写下地球文明的全部精髓,让其他文明知道我们曾有过这个文明呢?

吴军老师给出的答案是三个公式:

  • 1 + 1 = 2 1+1=2 1+1=2 :代表了数学文明
  • E = m c E=mc E=mc :爱因斯坦的质能方程
  • S = − ∑ P ln ⁡ P S=-\sum P\ln P S=PlnP :熵的定义

生命就是对抗负熵的过程。

物质总是向着熵增演化,屋子不收拾会变乱,手机会越来越卡,耳机线会凌乱,热水会慢慢变凉,太阳会不断燃烧衰变……直到宇宙的尽头——热寂。因为事物总是向着熵增的方向发展,所以一切符合熵增的,都非常的容易和舒适,比如懒散。因为所有事物都向着无规律、无序和混乱发展,如果你要变得自律,你就得逆着熵增做功,这个过程会非常痛苦。生命本身就是自律的过程,即熵减的过程。

(五)逻辑回归的参数求解

因为 y ^ i = p ( y i ∣ X i ) = g ( θ T X i ) \hat{y}_i=p(y_i|X_i)=g(\theta^TX_i) y^i=p(yiXi)=g(θTXi) 是参数向量 θ \theta θ 的非线性函数,导致求解公式2没有解析解,而 g ( θ T X i ) g(\theta^TX_i) g(θTXi) 对于 θ \theta θ 又是高阶可导的凸函数,所以可以通过梯度下降法、牛顿法等数值优化的方法求出 θ \theta θ 的最优解:
∇ L ( θ ) = − ∑ i = 1 m y i ∂ ln ⁡ y ^ i ∂ θ + ( 1 − y i ) ∂ ln ⁡ ( 1 − y ^ i ) ∂ θ = − ∑ i = 1 m y i y ^ i ∂ ln ⁡ g ( θ T X i ) ∂ θ + ( 1 − y i ) ( 1 − y ^ i ) ∂ ln ⁡ g ( θ T X i ) ∂ θ = − ∑ i = 1 m y i y ^ i y ^ i ( 1 − y ^ i ) X i + ( 1 − y i ) ( 1 − y ^ i ) y ^ i ( 1 − y ^ i ) X i = ∑ i = 1 m ( y ^ i − y i ) X i \begin{aligned} \nabla L(\theta)&=-\sum_{i=1}^my_i\frac{\partial\ln\hat{y}_i}{\partial\theta}+(1-y_i)\frac{\partial\ln(1-\hat{y}_i)}{\partial\theta}\\ &=-\sum_{i=1}^m\frac{y_i}{\hat{y}_i}\frac{\partial\ln g(\theta^TX_i)}{\partial\theta}+\frac{(1-y_i)}{(1-\hat{y}_i)}\frac{\partial\ln g(\theta^TX_i)}{\partial\theta}\\ &=-\sum_{i=1}^m\frac{y_i}{\hat{y}_i}\hat{y}_i(1-\hat{y}_i)X_i+\frac{(1-y_i)}{(1-\hat{y}_i)}\hat{y}_i(1-\hat{y}_i)X_i\\ &=\sum_{i=1}^m(\hat{y}_i-y_i)X_i \end{aligned} L(θ)=i=1myiθlny^i+(1yi)θln(1y^i)=i=1my^iyiθlng(θTXi)+(1y^i)(1yi)θlng(θTXi)=i=1my^iyiy^i(1y^i)Xi+(1y^i)(1yi)y^i(1y^i)Xi=i=1m(y^iyi)Xi

梯度下降法迭代求解: θ k + 1 = θ k − γ ∇ L ( θ k ) \theta^{k+1}=\theta^k-\gamma\nabla L(\theta^k) θk+1=θkγL(θk)

(六)正则化逻辑回归

θ = arg min ⁡ θ ( [ − ∑ i = 1 m y i ln ⁡ y ^ i + ( 1 − y i ) ln ⁡ ( 1 − y ^ i ) ] + λ 2 ∑ j = 1 n θ j 2 ) \theta=\argmin_\theta\left(\left[-\sum_{i=1}^my_i\ln\hat{y}_i+(1-y_i)\ln(1-\hat{y}_i)\right]+\frac{\lambda}{2}\sum_{j=1}^n\theta_j^2\right) θ=θargmin([i=1myilny^i+(1yi)ln(1y^i)]+2λj=1nθj2) 其中, λ 2 ∑ j = 1 n θ j 2 \begin{aligned}\frac{\lambda}{2}\sum_{j=1}^n\theta_j^2\end{aligned} 2λj=1nθj2 l 2 l_2 l2 正则项。

正则项系数 λ \lambda λ 是一个超参数,表示对于系数向量的惩罚程度。

三、Scikit-learn的LogisticRegression类

sklearnlinear_model模块提供LogisticRegression类用于构建Logistic回归模型。LogisticRegression类的基本语法格式如下:

class 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='liblinear', max_iter=100, multi_class='ovr', 
verbose=0, warm_start=False, n_jobs=1)

1、Logistic回归模型的参数

在这里插入图片描述
上面的参数C是正则化系数 λ \lambda λ 的倒数,C值越小正则化越强 (对应 λ \lambda λ值越大),分类边界越光滑,泛化性能越好 (但训练误差可能变大)。

2、Logistic回归模型的属性和方法

在这里插入图片描述

在这里插入图片描述

四、逻辑回归简单示例

以下两个示例代码中用到的数据集下载地址:
链接:https://pan.quark.cn/s/fbc5e2bb995d
提取码:fUvF

示例1

import pandas as pd
data = pd.read_excel('credit.xlsx')
x = data.iloc[:600,:14].as_matrix()
y = data.iloc[:600,14].as_matrix()
x1= data.iloc[600:,:14].as_matrix()
y1= data.iloc[600:,14].as_matrix()
from sklearn.linear_model import LogisticRegression as LR
lr = LR()   #创建逻辑回归模型类
lr.fit(x, y) #训练数据
r=lr.score(x, y); # 模型准确率(针对训练数据)
R=lr.predict(x1)
Z=R-y1
Rs=len(Z[Z==0])/len(Z)
print('预测结果为:',R)
print('预测准确率为:',Rs)

在这里插入图片描述

示例2

import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report

data = pd.read_csv('LogisticRegression.csv')
data_tr, data_te, label_tr, label_te = train_test_split(data.iloc[:, 1:], data['admit'], test_size=0.2)
clf = LogisticRegression()
clf.fit(data_tr, label_tr)
pre = clf.predict(data_te)
res = classification_report(label_te, pre)
print(res)

在这里插入图片描述

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Francek Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值