2.系统学习-逻辑回归

逻辑回归

  • 前言
  • 最大似然估计
    • 概率
    • 似然函数(likelihood function)
    • 最大似然估计
  • 逻辑回归
    • 逻辑回归的似然函数与梯度
  • 分类问题常用评价指标
  • 项目案例
  • 拓展内容
  • 作业

前言

逻辑回归与线性回归均属于广义线性模型,区别在于线性回归用于解决回归问题,例如身高、销量等连续变量预测,逻辑回归用于二分类问题,例如判断是否为垃圾邮件,客户是否会点击广告。本章我们将首先了解最大似然估计,一步步推导出逻辑回归模型,最大似然估计广泛用于各类机器学习、深度学习,需要认真理解。接着会以实际案例,讲解非结构化数据处理的基础方法,分类问题建模流程。
学习目标:

  • List item
  • 最大似然估计
  • 逻辑回归模型
  • 常用的分类问题评价指标
  • 基础数据处理&分类问题建模
  • 独自完成Kaggle Titanic竞赛首次提交,得分需要高于0.75链接: Titanic Machine Learning from Disaster

最大似然估计

概率

硬币有正反两面,如果硬币正反两面是均匀的,即每次抛掷后硬币为正的概率是0.5。使用这个硬币,很可能抛10次,有5次是正面。但是假如有人对硬币做了手脚,比如提前对硬币做了修改,硬币正面朝上概率大幅度提升了,你拿到硬币在尝试抛了10次,结果8次都是正面,如何估算下次硬币为正的概率呢?
P ( 8 正 2 反 ∣ θ ) = C 10 2 ( 1 − θ ) 2 ⋅ θ 8 P(8正2反|\theta) = C_{10}^2(1 - \theta)^2 \cdot \theta^8 P(82θ)=C102(1θ)2θ8

import numpy as np 
print(f"theta = 0.6,  概率为{10*9/2 * np.power(10.6, 2) * np.power(0.6, 8):.3}") 
print(f"theta = 0.7,  概率为{10*9/2 * np.power(10.7, 2) * np.power(0.7, 8):.3}") 
print(f"theta = 0.8,  概率为{10*9/2 * np.power(10.8, 2) * np.power(0.8, 8):.3}") 

theta = 0.6, 概率为0.121
theta = 0.7, 概率为0.233
theta = 0.8, 概率为0.302
可以看出,我们假设硬币朝正面参数为0.8的时候,出现8正2反情况的概率最大。我们有理由相信,0.8是候选的3个参数中的最接近真实概率的选项。

似然函数(likelihood function)

在上面的尝试中,0.8似乎是一个不错的猜测没,,但是否可能是0.81或者0.79呢,我们当然可以按照上面的方法再次计算概率,但是问题是我们无法遍历整个空间。因此我们需要定义一个函数来表示不同的参数 下,表示多个独立事件θ (x1, x2,…,xn)发生的整体概率,这个函数我们叫它似然函数( likelihood function, 通常用L表),其中组合数部分是常数,我们可以直接忽略。 L ( x 1 , x 2 , … , x n ∣ θ ) = ∏ i = 1 n p ( x i ∣ θ ) L(x_1, x_2, \dots, x_n|\theta) = \prod_{i=1}^{n} p(x_i|\theta) L(x1,x2,,xnθ)=i=1np(xiθ)
似然函数通常用L表示,观察到抛硬币“8正2反”的事实,硬币参数 取不同值时,似然函数表示为: L ( 8 正 2 反 ∣ θ ) = ( 1 − θ ) 2 ⋅ θ 8 L(8正2反|\theta) = (1 - \theta)^2 \cdot \theta^8 L(82θ)=(1θ)2θ8

通过似然函数,我们只要能找到使得似然函数最大(多个独立事件发生的整体概率最大化),就可以完成对硬币参数的估计了,这就是最大似然估计:
θ ^ = arg ⁡ max ⁡ θ ∏ i = 1 n p ( x i ∣ θ ) \hat{\theta} = \arg\max_{\theta} \prod_{i=1}^{n} p(x_i|\theta) θ^=argθmaxi=1np(xiθ)

最大似然估计

通常,由于似然函数为连乘,会造成小数位过高,无法有效表示,我们采用对数似然函数进行表示,把连乘转化为累加形式: l ( x 1 , x 2 , … , x n ∣ θ ) = ∑ i = 1 n log ⁡ p ( x i ∣ θ ) l(x_1, x_2, \dots, x_n|\theta) = \sum_{i=1}^{n} \log p(x_i|\theta) l(x1,x2,,xnθ)=i=1nlogp(xiθ)
θ ^ = arg ⁡ max ⁡ θ ∑ i = 1 n log ⁡ p ( x i ∣ θ ) \hat{\theta} = \arg\max_{\theta} \sum_{i=1}^{n} \log p(x_i|\theta) θ^=argθmaxi=1nlogp(xiθ)

逻辑回归

逻辑回归是线性分类模型,说线性是因为其决策边界是线性的(平面或超平面),模型输出值域为(0,1),通常我们将输出结果视为属于正样(y = 1)的概率。我们先来看一下逻辑回归模型的数学表示: P ( x ) = σ ( w T x ) = 1 1 + exp ⁡ − w T x P(x) = \sigma(w^T x) = \frac{1}{1 + \exp^{-w^T x}} P(x)=σ(wTx)=1+expwTx1
在这里插入图片描述

import numpy as np 
import matplotlib.pyplot as plt 
%matplotlib inline 
def sigmoid(x): return 1 / (1 + np.exp(-x)) 
data = np.arange(-10, 10, 0.1) 
plt.plot(data, sigmoid(data)) 

在这里插入图片描述

逻辑回归的似然函数与梯度

tips: 本段包含了不少公式计算,但公式本身的推导细节并不是最重要的,最重要的是通过引入似然函数,我们构造了逻辑回归的损失函数,且该损失函数可以利用梯度下降进行优化。
在这里插入图片描述
p ( y = y i ∣ x i ) = p ( x i ) y i ( 1 − p ( x i ) ) 1 − y i p(y = y^i | x^i) = p(x^i)^{y^i}(1 - p(x^i))^{1-y^i} p(y=yixi)=p(xi)yi(1p(xi))1yi
在这里插入图片描述
Likelihood = ∏ i p ( y = y i ∣ x i ) = ∏ i p ( x i ) y i ( 1 − p ( x i ) ) 1 − y i \text{Likelihood} = \prod_i p(y = y^i | x^i) = \prod_i p(x^i)^{y^i} (1 - p(x^i))^{1-y^i} Likelihood=ip(y=yixi)=ip(xi)yi(1p(xi))1yi
两边同时取对数,对数似然函数为:
loglikelihood = ∑ i [ y i log ⁡ p ( x i ) + ( 1 − y i ) log ⁡ ( 1 − p ( x i ) ) ] \text{loglikelihood} = \sum_i \left[y^i \log p(x^i) + (1 - y^i) \log (1 - p(x^i))\right] loglikelihood=i[yilogp(xi)+(1yi)log(1p(xi))]
loglikelihood = ∑ i [ y i log ⁡ p ( x i ) 1 − p ( x i ) + log ⁡ ( 1 − p ( x i ) ) ] \text{loglikelihood} = \sum_i \left[y^i \log \frac{p(x^i)}{1 - p(x^i)} + \log (1 - p(x^i))\right] loglikelihood=i[yilog1p(xi)p(xi)+log(1p(xi))]
那么这个对数似然函数就是我们需要优化的目标的,其值越大越好,越大说明模型预测概率和真实发生概率一致性越高。由于梯度下降法是验证最小化损失函数目标进行的,因此我们对对数似然函数乘以‑1。
J ( w ) = − ∑ i [ y i log ⁡ p ( x i ) 1 − p ( x i ) + log ⁡ ( 1 − p ( x i ) ) ] J(w) = -\sum_i \left[y^i \log \frac{p(x^i)}{1 - p(x^i)} + \log (1 - p(x^i))\right] J(w)=i[yilog1p(xi)p(xi)+log(1p(xi))]
求关于参数的梯度,根据求导法则可得:
g = ∂ J ∂ w = ∑ i ( p ( x i ) − y i ) ⋅ x i g = \frac{\partial J}{\partial w} = \sum_i \left(p(x^i) - y^i\right) \cdot x^i g=wJ=i(p(xi)yi)xi

有了梯度,根据上节课我们学习的梯度下降,就可以根据学习率α逐步迭代更新模型参数 w = w − α ⋅ g w = w - \alpha \cdot g w=wαg

分类问题常用评价指标

在二分类场景,模型所有的预测结果可以分为四类:

  1. TP(True positive),意思是模型预测为正样本(Positive),预测是正确的(True)
  2. FP(False positive),意思是模型预测为正样本(Positive),预测是错误的(False)
  3. TN(True negtive),意思是模型预测为负样本(negtive),预测是正确的(True)
  4. FN(False negtive),意思是模型预测为负样本(negtive),预测是错误的(False)
    基于以上四类预测结果,我们可以定义指标:
指标公式含义
准确率 Accuracy = # T P + # T N # A L L \text{Accuracy} = \frac{\#TP + \#TN}{\#ALL} Accuracy=#ALL#TP+#TN所有预测结果中,预测正确的比例,值越大说明模型表现越好。
精准率 Precision = # T P # T P + # F P \text{Precision} = \frac{\#TP}{\#TP + \#FP} Precision=#TP+#FP#TP所有预测的正样本中,正确的比例,值越大说明模型表现越好。
召回率 Recall = # T P # T P + # F N \text{Recall} = \frac{\#TP}{\#TP + \#FN} Recall=#TP+#FN#TP所有正样本被正确预测的比例,值越大说明模型表现越好。
from sklearn.metrics import accuracy_score, precision_score, recall_score 
y_true = [1, 1, 0, 1, 0] 
y_pred = [0, 1, 0, 1, 0]
accuracy_score(y_true, y_pred)#0.8
precision_score(y_true, y_pred)#1.0
recall_score(y_true, y_pred)#0.6666666666666666

在一些极端场景下,准确率会失效,比如正负样本及其不均匀的情况:

y_true = [1, 1, 1, 1, 1, 0] 
y_pred = [1, 1, 1, 1, 1, 1] 
accuracy_score(y_true, y_pred) #0.8333333333333334

不过什么输入,模型都预测为正样本,导致模型本质上没有预测能力,但是依然能够取得很高的Accuracy。为了避免评估指标失效,我们可以同时查看precision 和 recall指标

precision_score(y_true, y_pred) #0.8333333333333334
recall_score(y_true, y_pred) # 1.0

也可以应用一个由recall,precision 一起组成的复合指标 f1‑score,该值越大,说明模型表现越好:
f 1 = 2 ⋅ recall ⋅ precision recall + precision f1 = \frac{2 \cdot \text{recall} \cdot \text{precision}}{\text{recall} + \text{precision}} f1=recall+precision2recallprecision

 from sklearn.metrics import f1_scoref1_score(y_true, y_pred) # 0.9090909090909091
p = precision_score(y_true, y_pred) 
r = recall_score(y_true, y_pred) 2 * p * r / (p + r) #0.9090909090909091

项目案例

链接: Titanic Machine Learning from Disaster

# 导入所需的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import re 
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler, PolynomialFeatures, OneHotEncoder
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
%matplotlib inline # 读取 Titanic 数据集
train = pd.read_csv("./titanic/train.csv")  # 训练数据
test = pd.read_csv("./titanic/test.csv")    # 测试数据
submission = pd.read_csv("./titanic/gender_submission.csv")  # 示例提交文件# 数据概览
print(train.head())  # 查看训练数据的前几行
print(test.head())   # 查看测试数据的前几行
print(train.isnull().sum())  # 检查训练数据的缺失值# 填充缺失值
# 用中位数填充缺失的年龄数据
train['Age'] = train['Age'].fillna(train['Age'].median())
test['Age'] = test['Age'].fillna(test['Age'].median())# 用众数填充缺失的登船港口数据
train['Embarked'] = train['Embarked'].fillna('S')
test['Embarked'] = test['Embarked'].fillna('S')# 用票价的中位数填充缺失的票价数据
test['Fare'] = test['Fare'].fillna(test['Fare'].median())# 数据预处理
# 将性别和登船港口转换为数值类型
train = pd.get_dummies(train, columns=['Sex', 'Embarked'], drop_first=True)
test = pd.get_dummies(test, columns=['Sex', 'Embarked'], drop_first=True)# 删除不需要的列
train.drop(['Name', 'Ticket', 'Cabin'], axis=1, inplace=True)
test.drop(['Name', 'Ticket', 'Cabin'], axis=1, inplace=True)# 提取目标变量和特征
train_target = train['Survived']  # 目标变量
train_features = train.drop(['Survived', 'PassengerId'], axis=1)  # 特征
test_features = test.drop(['PassengerId'], axis=1)  # 测试集特征# 标准化特征
scaler = StandardScaler()
train_features = scaler.fit_transform(train_features)
test_features = scaler.transform(test_features)# 逻辑回归模型
model = LogisticRegression()  # 创建逻辑回归模型
model.fit(train_features, train_target)  # 训练模型# 模型评估
predictions = model.predict(train_features)  # 在训练集上预测
print("Accuracy:", accuracy_score(train_target, predictions))  # 准确率
print("Precision:", precision_score(train_target, predictions))  # 精准率
print("Recall:", recall_score(train_target, predictions))  # 召回率
print("F1 Score:", f1_score(train_target, predictions))  # F1 分数# 在测试集上进行预测
test_predictions = model.predict(test_features)# 生成提交文件
submission['Survived'] = test_predictions
submission.to_csv("./submission.csv", index=False)  # 保存结果到 CSV 文件print("结果已保存至 submission.csv")

拓展内容

需要注意的是,逻辑回归虽然存在sigmoid函数将输出结果映射到0~1区间,但本质依然是一个线性模型,因为模型的分类决策边界是一个平面,而不是曲面或其他,以下图为例,中间的蓝色直线就是我们的分类(超)平面,位于平面上方的点为正样本,下方的点为负样本,这个分类(超)平面可以用一个线性方程表示出来。
在这里插入图片描述

作业

  1. 分类问题中,在正负样本不均衡的情况下,我们如何评价模型?
  2. 在Titanic Machine Learning from Disaster比赛提交逻辑回归建模预测结果,需要得分高于0.75

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/65304.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录一次电脑被入侵用来挖矿的过程(Trojan、Miner、Hack、turminoob)

文章目录 0、总结1、背景2、端倪3、有个微软的系统更新,就想着更新看看(能否冲掉问题)4、更新没成功,自动重启电脑5、风险文件(好家伙命名还挺规范,一看名字就知道出问题了)6、开机有一些注册表…

阿里云 人工智能与机器学习

阿里云的 人工智能(AI)与机器学习(ML) 服务为企业提供了全面的AI解决方案,帮助用户在多个行业实现数据智能化,提升决策效率,推动业务创新。阿里云通过先进的技术和丰富的工具,支持用…

Structured-Streaming集成Kafka

一、上下文 《Structured-Streaming初识》博客中已经初步认识了Structured-Streaming,Kafka作为目前最流行的一个分布式的实时流消息系统,是众多实时流处理框架的最优数据源之一。下面我们就跟着官方例子来看看Structured-Streaming是如何集成Kafka的&a…

生物医学信号处理--绪论

前言 参考书籍:刘海龙,生物医学信号处理,化学工业出版社 生物医学信号分类 1、由生理过程自发或者诱发产生的电生理信号和非电生理信号 • 电生理信号:ECG/心电、EEG/脑电、EMG/肌电、 EGG/胃电、 EOG/眼电 • 非电生理信号&am…

unity 播放 序列帧图片 动画

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、方法一:代码控制播放序列帧1、设置图片属性2、创建Image组件3、简单的代码控制4、挂载代码并赋值 二、方法二:直接使用1.Image上添加…

小程序与物联网(IoT)融合:开启智能生活新篇章

一、引言 随着移动互联网技术的飞速发展,小程序作为一种轻量级的应用形式,凭借其无需下载安装、即用即走的特点,迅速渗透到人们生活的各个领域。与此同时,物联网(IoT)技术也在不断进步,将各种物…

如何很快将文件转换成另外一种编码格式?编码?按指定编码格式编译?如何检测文件编码格式?Java .class文件编码和JVM运行期内存编码?

如何很快将文件转换成另外一种编码格式? 利用VS Code右下角的"选择编码"功能,选择"通过编码保存"可以很方便将文件转换成另外一种编码格式。尤其,在测试w/ BOM或w/o BOM, 或者ANSI编码和UTF编码转换,特别方便。VS文件另…

PCL点云库入门——PCL库点云特征之PFH点特征直方图(Point Feature Histograms -PHF)

1、算法原理 PFH点(Point Feature Histogram)特征直方图的原理涉及利用参数化查询点与邻域点之间的空间差异,并构建一个多维直方图以捕捉点的k邻域几何属性。这个高维超空间为特征表示提供了一个可度量的信息空间,对于点云对应曲面…

5. CSS引入方式

5.1 CSS的三种样式 按照 CSS 样式书写的位置(或者引入的方式),CSS样式表可以分为三大类: 1.行内样式表(行内式) 2.内部样式表(嵌入式) 3. 外部样式表(链接式) 5.2 内部样式表 …

为什么ip属地一会河南一会江苏

在使用互联网的过程中,许多用户可能会遇到这样一个问题:自己的IP属地一会儿显示为河南,一会儿又变成了江苏。这种现象可能会让人感到困惑,甚至产生疑虑,担心自己的网络活动是否受到了某种影响。为了解答这一疑问&#…

jmeter性能测试例子

目录 一、介绍 二、操作例子 设置线程数 添加同步定时器 添加聚合报告 一、介绍 在软件测试中,一般用jmeter来对接口做性能测试,对对接口进行一个压力的测试。 简述: 在接口的线程中设置线程的数量和时间,添加一个定时器…

PDFelement 特别版

Wondershare PDFelement Pro 是一款非常强大的PDF编辑软件,它允许用户轻松地编辑、转换、创建和管理PDF文件。这个中文特别版的软件具有许多令人印象深刻的功能,PDFelement Pro 提供了丰富的编辑功能,可以帮助用户直接在PDF文件中添加、删除、…

【OpenCV】使用Python和OpenCV实现火焰检测

1、 项目源码和结构(转) https://github.com/mushfiq1998/fire-detection-python-opencv 2、 运行环境 # 安装playsound:用于播放报警声音 pip install playsound # 安装opencv-python:cv2用于图像和视频处理,特别是…

深入理解Mybatis原理》MyBatis的sqlSessi

sqlSessionFactory 与 SqlSession 正如其名,Sqlsession对应着一次数据库会话。由于数据库会话不是永久的,因此Sqlsession的生命周期也不应该是永久的,相反,在你每次访问数据库时都需要创建它(当然并不是说在Sqlsession…

《HarmonyOS第一课》焕新升级,赋能开发者快速掌握鸿蒙应用开发

随着HarmonyOS NEXT发布,鸿蒙生态日益壮大,广大开发者对于系统化学习平台和课程的需求愈发强烈。近日,华为精心打造的《HarmonyOS第一课》全新上线,集“学、练、考”于一体,凭借多维融合的教学模式与系统课程设置&…

springboot集成整合工作流,activiti审批流,整合实际案例,流程图设计,流程自定义,表单配置自定义,代码demo流程

前言 activiti工作流引擎项目,企业erp、oa、hr、crm等企事业办公系统轻松落地,一套完整并且实际运用在多套项目中的案例,满足日常业务流程审批需求。 一、项目形式 springbootvueactiviti集成了activiti在线编辑器,流行的前后端…

《探秘计算机视觉与深度学习:开启智能视觉新时代》

《探秘计算机视觉与深度学习:开启智能视觉新时代》 一、追溯起源:从萌芽到崭露头角二、核心技术:解锁智能视觉的密码(一)卷积神经网络(CNN):图像识别的利器(二&#xff0…

Vmware安装centos

用来记录自己安装的过程 一、创建虚拟机安装centos镜像 点击完成后,等待一会会进入centos的系统初始化界面 二、centos初始化配置 三、配置网络 1、虚拟网络编辑器,开启VMnet1、VMnet8的DHCP vmware左上角工具栏,点击【编辑】->【虚拟网…

Unity-Mirror网络框架-从入门到精通之Chat示例

文章目录 前言Chat聊天室Authentication授权ChatAuthenticatorChat示例中的授权流程聊天Chat最后 前言 在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。Mirror是一个用于Unity的开源网络框架,专为多人游戏开发设计。它使得开发者能够轻…