最优化方法Python计算:有约束优化应用——线性Lasso回归分类器

利用线性Lasso模型类LineLassoModel类(见博文《最优化方法Python计算:有约束优化应用——线性Lasso回归预测器》)及分类器类Classification(见博文《最优化方法Python计算:无约束优化应用——线性回归分类器》),下列代码实现线性Lasso分类器。

class LassoClassifier(Classification, LineLassoModel):		#线性Lasso分类器def __init__(self, alpha = 1.0):self.alpha = alphaself.tagVal = np.round

第1~4行用LineLassoModel和Classification类实现线性Lasso分类器类LassoClassifier。第2~4行的构造函数初始化正则化系数alpha,将标签值函数tagVal设置为四舍五入函数numpy.round,以适于分类预测。
综合案例
文件heart_failure_clinical_records_dataset.csv(来自UC Irvine Machine Learning Repository)记录了299例心力衰竭病人的数据。

ageanaemia ⋯ \cdots diabetes$cdots$ ⋯ \cdots plateletssex ⋯ \cdots ⋯ \cdots smokingtimeDEATH_EVENT
750 ⋯ \cdots 0 ⋯ \cdots ⋯ \cdots 2650001.9 ⋯ \cdots ⋯ \cdots 041
⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots
700 ⋯ \cdots 0 ⋯ \cdots ⋯ \cdots 2440001.2 ⋯ \cdots ⋯ \cdots 0661
⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots
601 ⋯ \cdots 0 ⋯ \cdots ⋯ \cdots 2100001.7 ⋯ \cdots ⋯ \cdots 0821
⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots
550 ⋯ \cdots 0 ⋯ \cdots ⋯ \cdots 263358.03 ⋯ \cdots ⋯ \cdots 112411
⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots ⋯ \cdots
500 ⋯ \cdots 0 ⋯ \cdots ⋯ \cdots 3950001.6 ⋯ \cdots ⋯ \cdots 12850

其中,

  • age - 患者的年龄(年)
  • anaemia - 患者是否贫血(布尔值)
  • creatinine phosphokinase(CPK) - 血液中CPK酶的水平(mcg/L)
  • diabetes - 患者是否患有糖尿病(布尔值)
  • ejection fraction - 每次收缩时离开心脏的血液百分比(百分比)
  • high blood pressure - 患者是否患有高血压(布尔值)
  • platelets - 血液中的血小板(kiloplatelets/mL)
  • sex - 性别(二进制)
  • serum creatinine - 血液中的血清肌酐水平(毫克/分升)
  • serum sodium - 血液中的血清钠水平(mEq/L)
  • smoking - 患者是否吸烟(布尔值)
  • time - 随访期(天数)
  • DEATH_EVENT - 患者是否在随访期间死亡(布尔值)
    将表示患者是否死亡的\texttt{DEATH_EVENT}作为标签数据,其余12个数据项作为特征数据,则判断患者是否会在就医时死亡构成一个2-分类问题。下列代码用这一数据集训练测试一个线性分类LinearClassifier(见博文《最优化方法Python计算:无约束优化应用——线性回归分类器》)模型。
import numpy as np										#导入numpy
LassoClassifier,LinearClassifier
np.set_printoptions(precision=4)
data = np.loadtxt('heart_failure_clinical_records_dataset.csv', delimiter=',', dtype=object, skiprows=1)	#读取数据文件
X = np.array(data)										#转换为数组
Y = X[:, 12].astype(int)								#读取标签数据
X = np.delete(X, [12], axis = 1).astype(float)			#特征数据
m, n = X.shape
print('共有%d个数据样本'%m)
a=np.arange(m)											#样本下标集
np.random.seed(1766)									#随机种子
print('随机抽取%d个样本作为训练数据。'%(m // 2))
train = np.random.choice(a, m // 2, replace = False)	#随机取得一半作为训练集下标
test = np.setdiff1d(a, train)							#测试集下标
print('LINE REGRESSION:')
heart_failure = LinearClassifier()						#构造线性回归模型
heart_failure.fit(X[train], Y[train])					#训练模型
coef, inte = heart_failure.coef_inte()					#模型的系数和截距
print('系数:', coef)
print('截距:%.4f'%inte)
acc = heart_failure.score(X[test], Y[test]) * 100		#测试模型
print('对其余%d个样本数据测试,准确率:%.4f'%(m - m // 2, acc) + '%')

程序的第3~8行读取文件数据并将其分离成样本特征数据X和标签数据Y。第11~14行在数据集中随机选取一般作为训练数据,下标为train,另一半作为测试数据,下标为test。第16行用LinearClassifier类创建一个线性分类模型heart_failure。第17行调用heart_failure的fit函数用X[train]和Y[train]训练heart_failure。第18行调用heart_failure的coef_inte函数计算系数和截距。第21行调用heart_failure的score函数用X[test]和Y[test]测试heart_failure。运行程序,输出

共有299个数据样本
随机抽取149个样本作为训练数据。
LINE REGRESSION:
训练中...,稍候
17次迭代后完成训练。
系数: [ 6.1401e-03 -2.1315e-02  4.1355e-05 -1.0871e-02 -9.2742e-03 -2.2379e-02-1.8753e-07  7.4815e-02 -9.0710e-03 -1.5951e-01  3.4964e-02 -2.5166e-03]
截距:1.9301
对其余150个样本数据测试,准确率:90.6667%

即经17次迭代,用X[train]和Y[train]训练了线性分类模型。用X[test]和Y[test]测试该模型得到90.667%的正确率。接下来我们分别用X[train]、Y[train]和X[test]、Y[test]训练和测试一个线性Lasso分类器LassoClassifier模型。前一程序之后添加下列代码

……
print('LASSO REGRESSION:')
heart_failure = LassoClassifier(alpha = 0.5)		#构造Lasso分类模型
heart_failure.fit(X[train], Y[train])				#训练模型
coef, inte = heart_failure.coef_inte()
print('系数:',coef)
print('截距:%.4f'%inte)
acc = heart_failure.score(X[test], Y[test]) * 100	#测试模型
print('对其余%d个样本数据测试,准确率:%.4f'%(m - m // 2, acc) + '%')

程序第1行的省略号表示前一程序的代码。第3行将heart_failure声明为LassoClassifier类对象,传递给构造函数的参数alpha为0.5。第4行用X[train]、Y[train]训练heart_failure。第8行用X[test]、Y[test]测试heart_failure。运行程序,输出

LASSO REGRESSION:
训练中...,稍候
36次迭代后完成训练。
系数: [ 3.3045e-01 -1.5398e-07  5.6651e-02  7.3073e-08 -4.6018e-01 -7.5823e-06-1.1760e-08  4.6328e-01 -9.9697e-02 -1.0726e-01  1.0053e-02 -6.2893e-017.8053e-01]
截距:0.7805
对其余150个样本数据测试,准确率:90.6667%

经36次迭代,用X[train]、Y[train]训练的Lasso分类模型,对X[test]、Y[test]测试的正确率为90.667%{}。观察Lasso分类模型的系数,有一些元素的绝对值小于 1 0 − 4 10^{-4} 104。这意味着这些系数对应的特征数据对标签值的贡献微弱。删掉这些数据项对预测正确率的影响不大,且可提高训练线性模型的效率。下列代码作这样的尝试,追加在前两个程序尾部。

……
a = np.where(np.abs(coef) < 1e - 4)[0]				#LASSO回归绝对值小于1/10000的系数下标
print('LASSO回归绝对值小于1/10000的系数下标:%s'%a)
X = np.delete(X, a, axis=1)							#删掉这些系数对应的特征数据
print('LINE REGRESSION:')
heart_failure = LinearClassifier()					#构造线性回归模型
heart_failure.fit(X[train], Y[train])				#训练模型
coef, inte=heart_failure.coef_inte()
print('系数:', coef)
print('截距:%.4f'%inte)
acc = heart_failure.score(X[test], Y[test]) * 100	#测试模型
print('对其余%d个样本数据测试,准确率:%.4f'%(m - m // 2, acc) + '%')

程序第1行的省略号表示程序8.6、8.7的代码。第2行调用numpy的where函数计算LassoClassifier对象表示的Lasso分类模型的系数coef中绝对值小于 1 0 − 4 10^{-4} 104的下标集a。第4行在X中删除由a指示的数据列。第6行将heart_{}failure声明为线性分类模型。第7行用X[train]、Y[train]训练线性分类模型。第11行对X[test]、Y[test]测试该模型。运行程序,输出

……
LASSO回归绝对值小于1/10000的系数下标:[1 3 5 6]
LINE REGRESSION:
训练中...,稍候
16次迭代后完成训练。
系数: [ 6.1677e-03  4.5319e-05 -9.4294e-03  7.5720e-02 -9.3499e-03 -1.5180e-014.0119e-02 -2.4872e-03]
截距:1.8346
对其余150个样本数据测试,准确率:90.6667%

即特征数据降维后,线性分类模型经16次迭代得到训练,测试知正确率与降维前保持一致。

写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!

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

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

相关文章

Python基础学习-Day20

目录 奇异值分解&#xff08;SVD&#xff09;的输入和输出奇异值的应用实际案例1. 问题分析2. 解决方案&#xff1a;对测试集应用相同的变换3. 为什么不能对测试集单独做 SVD&#xff1f;4. 代码示例&#xff1a;训练集和测试集的 SVD 降维6. 实际操作中的注意事项 奇异值分解&…

2025年 全新 AI 编程工具 Cursor 安装使用教程

一、Cursor 软件下载 首选&#xff0c;登录Cursor官网&#xff0c;进行软件下载&#xff0c;官网下载地址如下&#xff1a; Cursor AI IDE 下载 二、Cursor软件安装配置 此处以Windows10系统安装为例&#xff0c;下载完成之后&#xff0c;右键安装包&#xff0c;以管理员身份…

[vue]error:0308010C:digital envelope routines::unsupported

npm run dev 报错&#xff1a; \node_modules\webpack\hot\dev-server.jsnode:internal/crypto/hash:71 this[kHandle] new _Hash(algorithm, xofLen); Error: error:0308010C:digital envelope routines::unsupported opensslErrorStack: [ error:03000086:digital env…

开放的力量:新零售生态的共赢密码

当某头部生鲜平台向供应商开放销售预测系统后&#xff0c;合作伙伴的库存周转率竟提升12%——这个反常识的案例&#xff0c;正在重塑商业竞争的底层逻辑。 生态共建三板斧 ▌模块化设计&#xff1a;像搭积木一样开放 • 乐高式API架构&#xff1a;30%接口支持自由组合&#xff…

深入理解Spring缓存注解:@Cacheable与@CacheEvict

在现代应用程序开发中&#xff0c;缓存是提升系统性能的重要手段。Spring框架提供了一套简洁而强大的缓存抽象&#xff0c;其中Cacheable和CacheEvict是两个最常用的注解。本文将深入探讨这两个注解的工作原理、使用场景以及最佳实践。 1. Cacheable注解 基本概念 Cacheable…

[python] 函数3-python内置函数

一 内置函数 导入:import builtins 1.1 查看内置函数 大写字母开头的一般是内置变量小写的一般是内置函数 import builtins print(dir(builtins)) 1.2 abs() 求绝对值 print(abs(-10)) 1.3 sum()求和 不能直接用纯数字,因为不是可迭代对象 运算时只要一个是浮点数,结果就…

QT异步线程通信

在使用 QThreadPool 提交任务后&#xff0c;如果你需要知道任务何时完成&#xff0c;并且需要使用任务的执行结果&#xff0c;可以通过以下几种方式来实现&#xff1a; 1. 使用信号和槽 QRunnable 提供了一个 finished() 信号&#xff0c;当任务执行完成后会发出。你可以在任…

利用并行处理提高LabVIEW程序执行速度

在 LabVIEW 编程中&#xff0c;提升程序执行速度是优化系统性能的关键&#xff0c;而并行处理技术则是实现这一目标的有力武器。通过合理运用并行处理&#xff0c;不仅能加快程序运行&#xff0c;还能增强系统的稳定性和响应能力。下面将结合实际案例&#xff0c;深入探讨如何利…

机器学习第三讲:监督学习 → 带答案的学习册,如预测房价时需要历史价格数据

机器学习第三讲&#xff1a;监督学习 → 带答案的学习册&#xff0c;如预测房价时需要历史价格数据 资料取自《零基础学机器学习》。 查看总目录&#xff1a;学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章&#xff1a;DeepSeek R1本地与线上满血版部署&#xff1…

Open CASCADE学习|实现裁剪操作

1. 引言 Open CASCADE (简称OCC) 是一个功能强大的开源几何建模内核&#xff0c;广泛应用于CAD/CAM/CAE领域。裁剪操作作为几何建模中的基础功能&#xff0c;在模型编辑、布尔运算、几何分析等方面有着重要作用。本文将全面探讨Open CASCADE中的裁剪操作实现原理、应用场景及具…

【redis】分片方案

Redis分片&#xff08;Sharding&#xff09;是解决单机性能瓶颈的核心技术&#xff0c;其本质是将数据分散存储到多个Redis节点&#xff08;实例&#xff09;中&#xff0c;每个实例将只是所有键的一个子集&#xff0c;通过水平扩展提升系统容量和性能。 分片的核心价值 性能提…

RGB矩阵照明系统详解及WS2812配置指南

RGB矩阵照明系统详解及WS2812配置指南 一、RGB矩阵照明简介 RGB矩阵照明是一种强大的功能&#xff0c;允许使用外部驱动器驱动的RGB LED矩阵为键盘增添绚丽的灯光效果。该系统与RGBLIGHT功能无缝集成&#xff0c;因此您可以使用与RGBLIGHT相同的键码来控制它&#xff0c;操作…

[250509] x-cmd 发布 v0.5.11 beta:x ping 优化、AI 模型新增支持和语言变量调整

目录 X-CMD 发布 v0.5.11 beta&#x1f4c3;Changelog&#x1f9e9; ping&#x1f9e9; openai&#x1f9e9; gemini&#x1f9e9; asdf&#x1f9e9; mac✅ 升级指南 X-CMD 发布 v0.5.11 beta &#x1f4c3;Changelog &#x1f9e9; ping 调整 x ping 默认参数为 bing.com&a…

嵌入式开发学习日志Day17

第十一章 结构体与共用体 一、结构体 1、结构体 一般形式 【struct 标识符】 结构体中的标识符一般首字母大写&#xff1b; 【.】结构体成员运算符&#xff1b; 优先级 1 级 结合方向&#xff1a;从左至右&#xff1b; 【->】:指向结构体成员运算符&#x…

发那科机器人5(异常事件和程序备份加载+ROBOGUIDE离线仿真)

发那科机器人5(异常事件和程序备份加载+ROBOGUIDE离线仿真) 一,异常事件和程序备份加载1,常见异常事件2,零点复归介绍3,程序备份-加载(未整理)二,`ROBOGUIDE`离线仿真1,仿真软件简介及安装步骤(未整理)2,机器人==导入与工具==与==工件添加==2.1,机器人导入(未整…

青少年编程与数学 02-019 Rust 编程基础 01课题、环境准备

青少年编程与数学 02-019 Rust 编程基础 01课题、环境准备 一、Rust核心特性应用场景开发工具社区与生态 二、Rust 和 Python 比较1. **内存安全与并发编程**2. **性能**3. **零成本抽象**4. **跨平台支持**5. **社区与生态系统**6. **错误处理**7. **安全性**适用场景总结 三、…

Java反射 八股版

目录 一、核心概念阐释 1. Class类 2. Constructor类 3. Method类 4. Field类 二、典型应用场景 1. 框架开发 2. 单元测试 3. JSON序列化/反序列化 三、性能考量 四、安全与访问控制 1. 安全管理器限制 2. 打破封装性 3. 安全风险 五、版本兼容性问题 六、最佳…

操作系统的初步了解

目录 引言&#xff1a;什么是操作系统&#xff1f; 一、设计操作系统的目的 二、操作系统是做什么的&#xff1a; 操作系统主要有四大核心任务&#xff1a; 1. 管理硬件 2. 运行软件 3. 存储数据 4. 提供用户界面 如何理解操作系统的管理呢&#xff1f; 1. 什么是操作…

Mkdocs页面如何嵌入PDF

嵌入PDF 嵌入PDF代码 &#xff0c;注意PDF的相对地址 <iframe src"../个人简历.pdf (相对地址)" width"100%" height"800px" style"border: 1px solid #ccc; overflow: auto;"></iframe>我的完整代码&#xff1a; <d…

链表结构深度解析:从单向无头到双向循环的实现全指南

上篇博客实现动态顺序表时&#xff0c;我们会发现它存在许多弊端&#xff0c;如&#xff1a; • 中间/头部的插⼊删除&#xff0c;时间复杂度为O(N) • 增容需要申请新空间&#xff0c;拷⻉数据&#xff0c;释放旧空间。会有不⼩的消耗。 • 增容⼀般是呈2倍的增⻓&#xff0c;…