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

目录


一、相关概念

(一)回归与分类的区别

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

核心数 内存 跑分
1 8 5020
8 6 200000
8 4 130000
8 3 105000
10 2 30000

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

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

关键:阈值取多少合适?

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


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

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

  • 当 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)=1−g(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)[1−g(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+e−z1 如果阈值取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)=1−g(Xi)=1−1+eθTXieθTXi=1+eθTXi1

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

一个事件的几率 (odds) 是指该事件发生的概率与该事件不发生概率的比值,即:如果事件发生概率为 p p p,那么该事件的几率等于 p 1 − p \frac{p}{1-p} 1−pp。该事件的对数几率 (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)=log1−pp 如果求逻辑回归中正例样本的对数几率,则有: 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)=log1−g(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 1−y^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(1−y^i)1−yi 其中, 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=1∏my^iyi(1−y^i)1−yi(公式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=1∑myilny^i+(1−yi)ln(1−y^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=1∑myilny^i+(1−yi)ln(1−y^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=1∑myilny^i+(1−yi)ln(1−y^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=1∑myilny^i+(1−yi)ln(1−y^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(yi∣Xi)=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=1∑myi∂θ∂lny^i+(1−yi)∂θ∂ln(1−y^i)=−i=1∑my^iyi∂θ∂lng(θTXi)+(1−y^i)(1−yi)∂θ∂lng(θTXi)=−i=1∑my^iyiy^i(1−y^i)Xi+(1−y^i)(1−yi)y^i(1−y^i)Xi=i=1∑m(y^i−yi)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=1∑myilny^i+(1−yi)ln(1−y^i)]+2λj=1∑nθj2) 其中, λ 2 ∑ j = 1 n θ j 2 \begin{aligned}\frac{\lambda}{2}\sum{j=1}^n\theta_j^2\end{aligned} 2λj=1∑nθj2 为 l 2 l_2 l2 正则项。

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

三、Scikit-learn的LogisticRegression类

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

python 复制代码
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

python 复制代码
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

python 复制代码
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)
相关推荐
newroad-for-myself1 分钟前
英文版本-带EXCEL函数的数据分析
数据挖掘·数据分析·excel
小白的程序空间2 分钟前
人工智能之机器学习5-回归算法1【培训机构学习笔记】
人工智能·机器学习·回归
chenchihwen4 分钟前
《生成式 AI》课程 作业6 大语言模型(LLM)的训练微调 Fine Tuning -- part1
人工智能
澜舟孟子开源社区18 分钟前
“AI玩手机”原理揭秘:大模型驱动的移动端GUI智能体
人工智能·科技·agi
Mr.鱼26 分钟前
opencv undefined reference to `cv::noarray()‘ 。window系统配置opencv,找到opencv库,但连接不了
人工智能·opencv·计算机视觉
ATpiu29 分钟前
免费微调自己的大模型(llama-factory微调llama3.1-8b)
人工智能·机器学习·llama
凌虚(失业了求个工作)33 分钟前
RAG 示例:使用 langchain、Redis、llama.cpp 构建一个 kubernetes 知识库问答
人工智能·redis·python·langchain·llama
逝去的紫枫1 小时前
Python PIL:探索图像处理的无限可能
图像处理·人工智能·python
rubyw1 小时前
如何选择聚类算法、回归算法、分类算法?
算法·机器学习·分类·数据挖掘·回归·聚类
sp_fyf_20242 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-05
人工智能·深度学习·神经网络·算法·机器学习·语言模型·数据挖掘