使用numpy构建逻辑回归模型及训练流程

逻辑回归模型构建及训练流程

关于逻辑回归的数据,有很多学习⽤的⽰例样本。这⾥我们使⽤scikit learn提供的数据集⽣成函数来创建
具体参数可参照官网

Scikit-learn 是⽤ Python 开发的开源机器学习库,⼴泛⽤于数据挖掘和数据分析。

  • 特点:易⽤、⾼效,具有丰富的⼯具,涵盖分类、回归、聚类等多种机器学习算法。
  • 功能:提供数据预处理、模型选择、评估等功能,便于构建完整的机器学习⼯作流。
  • 优势:有详细⽂档和⽰例,社区活跃,能降低开发成本、提⾼效率。
#生成分类数据
from sklearn.datasets  import make_classification  #生成的是numpy.ndarray数组(随机生成)
from sklearn.model_selection import train_test_split #划分数据集 
import numpy as np
demo_X,demo_y = make_classification() #默认生成100个样本,20个特征,2个类别
print(demo_X) #特征
print(demo_y) #标签
print(demo_X.shape)
print(demo_y.shape)
[[ 0.96837399  0.69991556 -0.80719258 ...  1.07349589  0.600931011.25834368][ 1.54064333 -0.72874526  0.05101656 ...  1.69469224  0.68078434-0.22108232][ 1.3130273   0.13845124 -0.17878829 ... -2.51988675  0.73565307-0.61197128]...[-0.96507974  0.62850721  0.25545924 ... -1.03533221 -0.02341121.86283345][-1.09606837 -0.92451774 -0.59875319 ... -0.19421878  0.62418285-0.26886614][-0.18375534  0.12046227  0.52649374 ...  0.93921941  0.896507111.14815417]]
[0 0 1 1 1 0 1 1 0 1 1 1 1 1 0 0 0 1 1 1 1 1 0 0 1 1 1 1 1 0 0 0 1 0 0 1 00 0 1 0 1 0 1 1 0 0 1 0 1 1 0 0 0 1 0 0 1 1 0 1 0 1 0 0 1 0 1 1 1 0 0 0 00 0 0 1 1 1 1 0 0 1 1 0 1 0 0 1 1 1 0 0 1 0 0 1 1 0]
(100, 20)
(100,)

查看生成结果发现,这是一个元组,里面包含两组值,默认生成100个样本,20个特征,2个类别

demo_X[1]
array([ 1.54064333, -0.72874526,  0.05101656,  2.66218782,  1.94089634,-0.10555552,  0.12877297, -0.47275342, -0.23722334, -0.24897953,0.29021104, -1.03756101, -0.6875083 , -1.57963226,  1.81221622,-0.04901801, -0.91022508,  1.69469224,  0.68078434, -0.22108232])
demo_y[1]
0

步骤

  1. 数据准备,参数初始化
  2. 模型计算函数
  3. 计算损失函数
  4. 计算梯度
  5. 模型训练

模型训练的数据,通常还需要拆分为训练集和测试集。⽬的是为了防⽌数据泄露

**数据泄露(Data Leakage)**指的是训练数据中包含了不应该有的信息,这些信息会使模型在评估时表现得⽐在真实应⽤场景中更好,导致对模型性能的⾼估,使得模型的泛化能⼒被错误判断。

#1.数据准备,参数初始化
#生成150个样本,10个特征,2个类别的训练数据
X,y = make_classification(n_samples=150,n_features=10) #shape(150,10)#数据拆分
#局部样本训练模型(过拟合模型)测试预测不好(泛化能力差)
#全局样本训练模型(泛化能力好)测试预测好(泛化能力好)
#新样本数据模型表现不好(泛化能力差)
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3) #30%作为测试集
#X_train, X_test表示一部分用作训练,一部分用作测试,避免过拟合
print(X_train.shape) 
print(X_test.shape)
(105, 10)
(45, 10)
#权重参数
theta = np.random.randn(1,10) #10个特征 1个权重 #shape(1,10) #随机生成一个权重参数
#偏置参数
bias = 0 
#超参数
lr = 0.01 #学习率
epochs = 3000 #迭代次数,训练次数
#假设 X 是shape(3,3)
#[[x1,x2,x3],
# [x4x5,x6],
# [x7,x8,x9]]
#X.T 是shape(3,3)
#[[x1,x4,x7],
# [x2,x5,x8],
# [x3,x6,x9]]
# 
#假设theta 模型参数shape(1,3)
#[[w1,w2,w3]]
#theta * X.T = shape(1,3) * shape(3,3) = shape(1,3)
#y1 = w1*x1 + w2*x2 + w3*x3
#y2 = w1*x4 + w2*x5 + w3*x6
#y3 = w1*x7 + w2*x8 + w3*x9
#y = [[y1,y2,y3]]
##2. 模型计算函数
def forward(X,theta,bias):#线性运算z = np.dot(theta,X.T) + bias #shape(105,10)#sigmod 是为了将线性运算的结果映射到0-1之间y_hat = 1/(1+np.exp(-z)) #shape(105,10)return y_hat        #3. 计算损失函数
def loss(y,y_hat):#损失函数e = 1e-8 #防止除0错误return - y*np.log(y_hat +e ) - (1-y)*np.log(1-y_hat + e)#4. 计算梯度
def calc_gradient(x,y,y_hat):m = x.shape[-1] #样本数delta_theta = np.dot(y_hat-y,x)/m #shape(1,10) #梯度delta_bias = np.mean(y_hat-y) #shape(1,) #偏置的梯度return delta_theta,delta_bias#5. 模型训练
for i in range(epochs): #epochs是训练次数#前向传播y_hat = forward(X_train,theta,bias)#计算损失loss_value = loss(y_train,y_hat)#计算梯度delta_theta,delta_bias = calc_gradient(X_train,y_train,y_hat)#更新参数theta = theta - lr * delta_thetabias = bias - lr * delta_biasif i % 100 == 0:print(f"epoch:{i},loss:{np.mean(loss_value)}")#计算准确率acc = np.mean(np.round(y_hat) == y_train) #[Fales,True,True,False,True] --> [0,1,1,0,1] --> 0.6 print(f"epoch:{i},loss:{np.mean(loss_value)},acc:{acc}")
epoch:0,loss:0.9826484121456485
epoch:0,loss:0.9826484121456485,acc:0.6
epoch:100,loss:0.28410629245685803
epoch:100,loss:0.28410629245685803,acc:0.8857142857142857
epoch:200,loss:0.24510667568678654
epoch:200,loss:0.24510667568678654,acc:0.8666666666666667
epoch:300,loss:0.23505007869724906
epoch:300,loss:0.23505007869724906,acc:0.8571428571428571
epoch:400,loss:0.23103972248220034
epoch:400,loss:0.23103972248220034,acc:0.8666666666666667
epoch:500,loss:0.22908011250548505
epoch:500,loss:0.22908011250548505,acc:0.8761904761904762
epoch:600,loss:0.2280154352157034
epoch:600,loss:0.2280154352157034,acc:0.8761904761904762
epoch:700,loss:0.22739935077291418
epoch:700,loss:0.22739935077291418,acc:0.8761904761904762
epoch:800,loss:0.2270275272465418
epoch:800,loss:0.2270275272465418,acc:0.8761904761904762
epoch:900,loss:0.22679615751708468
epoch:900,loss:0.22679615751708468,acc:0.8761904761904762
epoch:1000,loss:0.2266487526019183
epoch:1000,loss:0.2266487526019183,acc:0.8761904761904762
epoch:1100,loss:0.22655303465776838
epoch:1100,loss:0.22655303465776838,acc:0.8761904761904762
epoch:1200,loss:0.22648987077080793
epoch:1200,loss:0.22648987077080793,acc:0.8761904761904762
epoch:1300,loss:0.22644759054763966
epoch:1300,loss:0.22644759054763966,acc:0.8761904761904762
epoch:1400,loss:0.2264189111347839
epoch:1400,loss:0.2264189111347839,acc:0.8666666666666667
epoch:1500,loss:0.22639920302759006
epoch:1500,loss:0.22639920302759006,acc:0.8666666666666667
epoch:1600,loss:0.22638547862134517
epoch:1600,loss:0.22638547862134517,acc:0.8666666666666667
epoch:1700,loss:0.22637578566413857
epoch:1700,loss:0.22637578566413857,acc:0.8666666666666667
epoch:1800,loss:0.22636883499686028
epoch:1800,loss:0.22636883499686028,acc:0.8666666666666667
epoch:1900,loss:0.2263637676238141
epoch:1900,loss:0.2263637676238141,acc:0.8666666666666667
epoch:2000,loss:0.2263600065967938
epoch:2000,loss:0.2263600065967938,acc:0.8666666666666667
epoch:2100,loss:0.22635716155827576
epoch:2100,loss:0.22635716155827576,acc:0.8666666666666667
epoch:2200,loss:0.2263549665310887
epoch:2200,loss:0.2263549665310887,acc:0.8666666666666667
epoch:2300,loss:0.2263532389959844
epoch:2300,loss:0.2263532389959844,acc:0.8666666666666667
epoch:2400,loss:0.2263518527619451
epoch:2400,loss:0.2263518527619451,acc:0.8666666666666667
epoch:2500,loss:0.22635071986180172
epoch:2500,loss:0.22635071986180172,acc:0.8666666666666667
epoch:2600,loss:0.22634977840264098
epoch:2600,loss:0.22634977840264098,acc:0.8666666666666667
epoch:2700,loss:0.22634898437242262
epoch:2700,loss:0.22634898437242262,acc:0.8666666666666667
epoch:2800,loss:0.2263483060903649
epoch:2800,loss:0.2263483060903649,acc:0.8666666666666667
epoch:2900,loss:0.2263477204327887
epoch:2900,loss:0.2263477204327887,acc:0.8666666666666667
#模型推理
idx = np.random.randint(len(X_test)) #随机生成一个索引作为测试样本
x = X_test[idx] #shape(10,)
y = y_test[idx] #shape(1,)
#模型预测
predict = np.round(forward(x,theta,bias)) 
print(f"y:{y},predict:{predict}")
y:1,predict:[1.]

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

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

相关文章

python的多线程和多进程程序编程

CPU密集型使用多进程,IO密集型使用多线程 查看进程ID和线程ID的命令分别是os.getpid()和threading.current_thread() 多进程使用multiprocessing就可以了,通常使用进程池来完成操作,阻塞主进程使用join方法 多线程使用threading模块&#…

代码随想录算法训练营第十五天

LeetCode题目: 654. 最大二叉树617. 合并二叉树700. 二叉搜索树中的搜索98. 验证二叉搜索树2843. 统计对称整数的数目 其他: 今日总结 往期打卡 654. 最大二叉树 跳转: 654. 最大二叉树 学习: 代码随想录公开讲解 问题: 给定一个不重复的整数数组 nums 。 最大二叉树 可以用…

[GN] Uart协议解码器源码各个方法

系列文章目录 sigrokdecode 模块学习指南 — 准备阶段 通讯协议 - Uart sigrokdecode 模块 UART协议解码器源码解析 Uart协议解码器源码各个方法 文章目录 系列文章目录引入库parity_ok注解类型枚举options参数annotations 注解annotation_rows 注解分组接收(RX&a…

技术分享|iTOP-RK3588开发板Ubuntu20系统旋转屏幕方案

iTOP-3588开发板采用瑞芯微RK3588处理器,是全新一代AloT高端应用芯片,采用8nmLP制程,搭载八核64位CPU,四核Cortex-A76和四核Cortex-A55架构,主频高达2.4GHz。是一款可用于互联网设备和其它数字多媒体的高性能产品。 在…

Unity IL2CPP内存泄漏追踪方案(基于Memory Profiler)技术详解

一、IL2CPP内存管理特性与泄漏根源 1. IL2CPP内存架构特点 内存区域管理方式常见泄漏类型托管堆(Managed)GC自动回收静态引用/事件订阅未取消原生堆(Native)手动管理非托管资源未释放桥接层GCHandle/PInvoke跨语言引用未正确释放 对惹,这里有一个游戏开发交流小组…

消融实验_草稿

五列数据 \begin{table}[htbp]\caption{Performance Comparison of Standalone KD Variants vs MIRKD-enhanced Variants on ACNE04 Dataset\label{AblationKD}}\centering\renewcommand{\arraystretch}{1.2}\scriptsize\begin{tabularx}{\linewidth}{{}l *{3}{>{\centering…

面向对象高级(1)

文章目录 final认识final关键字修饰类:修饰方法:修饰变量final修饰变量的注意事项 常量 单例类什么是设计模式?单例怎么写?饿汉式单例的特点是什么?单例有啥应用场景,有啥好处?懒汉式单例类。 枚举类认识枚…

不用额外下载jar包,idea快速查看使用的组件源码

以nacos为例子,在idea中引入了nacos依赖,就可以查看源码了。 2. idea选择open(不关闭项目直接选择file-open也可以), 在maven的仓库里找到对应的包,打开 2.idea中选择 jar包,选择 add as library 3.这样j…

小白学习java第12天:IO流之缓冲流

1.IO缓冲流: 之前我们学习的都是原始流(FileInputStream字节输入流、FileOutputStream字节输出流、FIleReader字符输入流、FIleWriter字符输出流)其实我们可以知道对于这些其实性能都不是很好,要么太慢一个一个,要么就…

高速电路设计概述

1.1 低速设计和高速设计的例子 本节通过一个简单的例子,探讨高速电路设计相对于低速电路设计需要考虑哪些不同的问题。希望读者通过本例,对高速电路设计建立一个表象的认识。至于高速电路设计中各方面的设计要点,将在后续章节展开详细的讨论…

MySQL8.0.31安装教程,附pdf资料和压缩包文件

参考资料:黑马程序员 一、下载 点开下面的链接:https://dev.mysql.com/downloads/mysql/ 点击Download 就可以下载对应的安装包了, 安装包如下: 我用夸克网盘分享了「mysql」,链接:https://pan.quark.cn/s/ab7b7acd572b 二、解…

在Java项目中,引入【全局异常处理器】

目录 一.为什么引入全局异常处理器(目前项目碰到了什么问题)? 1.问题描述 2.与预期的差别 3.解决方案 二.解决上述问题 1.定义【业务异常类】 2.在serviceImpl层,手动抛出【违反唯一性约束】这个异常 3.定义【全局异常处理…

newspaper公共库获取每个 URL 对应的新闻内容,并将提取的新闻正文保存到一个文件中

示例代码: from newspaper import Article from newspaper import Config import json from tqdm import tqdm import os import requestswith open(datasource/api/news_api.json, r) as file:data json.load(file)print(len(data)) save_path datasource/sourc…

前端核心知识:Vue 3 编程的 10 个实用技巧

文章目录 1. **使用 ref 和 reactive 管理响应式数据**原理解析代码示例注意事项 2. **组合式 API(Composition API)**原理解析代码示例优势 3. **使用 watch 和 watchEffect 监听数据变化**原理解析代码示例注意事项 4. **使用 provide 和 inject 实现跨…

【Web API系列】XMLHttpRequest API和Fetch API深入理解与应用指南

前言 在现代Web开发中,客户端与服务器之间的异步通信是构建动态应用的核心能力。无论是传统的AJAX技术(基于XMLHttpRequest)还是现代的Fetch API,它们都为实现这一目标提供了关键支持。本文将从底层原理、核心功能、代码实践到实…

[特殊字符] Spring Boot 日志系统入门博客大纲(适合初学者)

一、前言 📌 为什么日志在项目中如此重要? 在开发和维护一个后端系统时,日志就像程序运行时的“黑匣子”,帮我们记录系统的各种行为和异常。一份良好的日志,不仅能帮助我们快速定位问题,还能在以下场景中…

IP协议之IP,ICMP协议

1.因特网中的主要协议是TCP/IP,Interneet协议也叫TCP/IP协议簇 2.ip地址用点分十进制表示,由32位的二进制表示,两部分组成:网络标识主机标识 3.IP地址分类; A:0.0.0.0-127.255.255.255 B:128.0.0.0-191.255.255.25…

GPIO_ReadInputData和GPIO_ReadInputDataBit区别

目录 1、GPIO_ReadInputData: 2、GPIO_ReadInputDataBit: 总结 GPIO_ReadInputData 和 GPIO_ReadInputDataBit 是两个函数,通常用于读取微控制器GPIO(通用输入输出)引脚的输入状态,特别是在STM32系列微控制器中。它们之间的主要…

洛古B4158 [BCSP-X 2024 12 月小学高年级组] 质数补全(线性筛/dfs)

B4158 [BCSP-X 2024 12 月小学高年级组] 质数补全 - 洛谷 思路1:线性筛,字符串匹配,枚举 质数筛选 要解决这个问题,首先得找出指定范围内(这里是 1 到 10000000)的所有质数。常用的质数筛选算法有埃拉托斯特尼筛法(埃氏筛&#…

一周学会Pandas2 Python数据处理与分析-Pandas2读取Excel

锋哥原创的Pandas2 Python数据处理与分析 视频教程: 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili Excel格式文件是办公使用和处理最多的文件格式之一,相比CSV文件,Excel是有样式的。Pandas2提…