头歌——机器学习——逻辑回归如何实现分类

第1关:逻辑回归如何实现分类

任务描述

本关任务:编写一个使用逻辑回归实现分类的程序

相关知识

为了完成本关任务,你需要掌握:1.逻辑回归基本原理。2.适用sklearn进行逻辑回归分类。

逻辑回归算法

一般来说逻辑回归用于处理二元分类问题,即 y⊂0,1

当样本中有多个类别时 y⊂0,1,2,...,n

Logistic Regression和Linear Regression的原理是相似的,可以简单的描述为这样的过程:

1,找一个合适的预测函数,一般表示为h函数,该函数就是我们需要找的分类函数,它用来预测输入数据的判断结果。 这个过程时非常关键的,需要对数据有一定的了解或分析,知道或者猜测预测函数的“大概”形式,比如是线性函数还是非线性函数。

2,构造一个Cost函数(损失函数),该函数表示预测的输出(h)与训练数据类别(y)之间的偏差,可以是二者之间的差(h-y)或者是其他的形式。 综合考虑所有训练数据的“损失”,将Cost求和或者求平均,记为J(θ)函数,表示所有训练数据预测值与实际类别的偏差。

3,显然,J(θ)函数的值越小表示预测函数越准确(即h函数越准确),所以这一步需要做的是找到J(θ)函数的最小值。 找函数的最小值有不同的方法,Logistic Regression实现时有的是梯度下降法(Gradient Descent)。

逻辑回归模型

预测函数 Logistic Regression虽然名字里带“回归”,但是它实际上是一种分类方法,用于两分类问题(即输出只有两种)。根据上述步骤的说明,需要先找到一个预测函数(h),显然,该函数的输出必须是两个值(分别代表两个类别),所以利用了Logistic函数(或称为Sigmoid函数),函数形式为

h(x)=1+e−θTx1​

hθ(x)函数的值有特殊的含义,他表示结果取1的概率,听此对于输入x分类结果类别为1和类别0的概率分布为

P(y=1∣x;θ)=hθ​(x) P(y=0∣x;θ)=1−hθ​(x)

代价函数

J=−m1​i=1∑m​y(i)log(h(xi))+(1−y(i))log(1−h(x(i)))

这里的J(θ)是基于最大似然估计推导得到的

P(y∣x;θ)=(hθ​(x))y(1−ht​heta(x))1−y

取似然函数为

L(θ)=i=1∏m​P(y(i)∣x(i);θ)=i=1∏m​(hθ​(x(i)))y(i)(1−hθ​(x(i)))1−y(i)

对数似然函数为

l(θ)=logL(θ)=i=1∑m​(y(i)loghθ​(x(i))+(1−y(i)log(1−hθ​(x(i))))

最大似然估计就是要求使J(θ)取最大值时的θ,其实这里可以使用梯度上升法求解,求得的θ就是要求你的最佳参数。

J(θ)=−m1​l(θ)

因为乘了个负的系数m1​,所以J(θ)取最小值时的θ为要求的最佳参数。

梯度下降

求J(θ)的最小值可以使用梯度下降法,根据梯度下降法可得θ的更新过程:

θj​:=θj​−α∗m1​∗i=1∑m​(h(x)−y)xj(i)​ 其中α为学习率

逻辑回归在形式上更新参数与线性回归相同,实则不同。 在线性回归中,h(x)是一个线性函数,而在逻辑回归中,h(x)是一个sigmoid函数

sklearn库的使用
  • # 使用sklearn中的make_classification函数构建二分类的数据
  • # 其中n_samples=100是样本的数量,n_classes是样本的种类
  • x, y = make_classification(n_samples=100, n_classes=2)
  • # 从sklearn中导入逻辑回归分类器
  • from sklearn.linear_model import LogisticRegressionCV
  • # 实例化一个逻辑回归分类器,使用默认参数
  • logistic = LogisticRegressionCV()
  • # 传入数据进行模型训练
  • logistic.fit(x, y)
  • # 传入数据进行模型评估
  • logistic.score(x, y)

编程要求

根据提示,在右侧编辑器补充代码,完善代码,

测试说明

平台会对你编写的代码进行测试:

预期输出: 0.9

第1关任务——代码题

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
import numpy as npnp.random.seed(10)if __name__ == '__main__':# ********** Begin ********** ## 使用sklearn中的make_classification函数构建二分类的数据,样本数量为100X, y = make_classification(n_samples=100, n_features=20, n_informative=2, n_redundant=10, random_state=42, flip_y=0.1)# 将数据集拆分成测试集与训练集,训练集占所有数据的80%X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 进行模型训练并评估模型model = LogisticRegression(max_iter=1000, random_state=42)model.fit(X_train, y_train)# 预测测试集结果y_pred = model.predict(X_test)# 评估模型的准确率accuracy = accuracy_score(y_test, y_pred)print(round(accuracy, 1))# ********** End ********** #

第2关:超参数

任务描述

本关任务:编写一个使用网格搜索进行最佳参数寻找的程序

相关知识

为了完成本关任务,你需要掌握:1.模型欠拟合和过拟合的解决方案。2.使用网格搜索进行寻找最佳超参数

模型参数与超参数

模型参数 简单来说,模型参数就是模型内部可以通过计算的到的,例如线性回归中的的系数

通常,我们要获取最好的模型参数是由一些优化算法来获取的

模型超参数 而模型超参数是模型外部就已经确定了值,在模型内部无法进行修改的,例如线性回归中梯度下降中使用的学习速率

对于指定的问题,一般我们是无法知道最好的模型超参数的,只能由平常设置参数的经验或者反复去实验寻找超参数

过拟合和欠拟合

欠拟合 对于给定的数据集,欠拟合的成因大多是模型不够复杂、拟合函数能力不够,为此,可以增加迭代次数继续训练、尝试更换其他算法、增加模型的参数数量和复杂程度,或者采用集成方法

过拟合 过拟合成因是给定的数据集相对过于简单,使得模型在拟合函数时过分的考虑了噪声等不必要的数据间的关联。或者说相对于给定数据集,模型过于复杂、拟合能力过强

解决方案:

提前停止训练:

减少训练的迭代次数,理论上来说,可以找到一个训练程度,使得验证集误差率最低,视为拟合效果最好的点

正则化:

L0正则化

损失函数后面加入L0范数λ||w||0,也就是权向量中非零参数的个数 他的特点是可以实现参数的稀疏性,是尽可能多的参数值为0,这与稀疏编码的思想温和,但是缺点在于优化比较困难,因此实际更常用的是L1范数

L1正则化

损失函数L0后面加上参数(权向量w)的L1范数项:λ||w||1=λ∑ni=1||wi||1,其中 n 是权向量 w 的长度(参数数量),λ 是正则化参数,用来调和L0 与正则项 L1正则项等价于先验概率服从拉普拉斯分布;L1范数是L0范数的最优凸近似,比L0范数容易优化,而且也可以很好地实现参数稀疏性,常别称作“稀疏规则算子”,因此相对L0正则化更常用。同时L1和L0因为具有使参数稀疏的特点,常用于特征选择。

L2正则化

损失函数L0后面加上参数L2范数的平方项:λ2n||w||22=λ2n∑ni=1w2i  ,其大小由参数weight-decay(权值衰减)调节 其中分母有无n均可,L2正则项等价于先验概率服从高斯分布;与L0,L1不同的是,L2很难使某些参数达到0,它只能使参数接近0。如今在许多问题中,更常用L2正则是因为:一方面我们通常想考虑更多的参数对问题的影响(因此不能让参数稀疏),另一方面在优化时,L2范数有利于解决condition number: k(A)=||A||||A−1||  太大(远大于1)的情况下(此时存在某些参数,对结果有过大的影响)矩阵求逆很困难的问题,这使得优化求解变得更快更稳定。

上述解决模型过拟合和欠拟合问题的方式中,涉及到一些超参数 在sklearn中,可以使用网格搜索的方式寻找最佳的参数

逻辑回归网格搜索

在sklearn中,GridSearchCv 用来生成超参数的组合,自动选择效果最好的参数。 sklearn.linear_model.LogisticRegressionCV(*, Cs=10, fit_intercept=True,penalty='l2', tol=0.0001, max_iter=100)

cs:cs中的每个值都描述了正则强度的倒数,较小的值指定更强的正则化 fit_intercept:指定是否将常量添加到决策函数 penalty:使用的正则化规范,默认值为"l2" tol:停止训练的标准 max_iter:优化算法最大迭代次数

  • from sklearn.linear_model import LogisticRegressionCV
  • logistic = LogisticRegressionCV()
  • from sklearn.model_selection import GridSearchCV
  • # param说明
  • # {参数名1:[参数值1, 参数值2],...}
  • param = {
  • 'penalty':["l1", "l2"],
  • 'c':[1, 10]
  • }
  • # 参数说明:
  • # logistic 逻辑回归分类器
  • # param_dict 超参字典
  • model = GridSearchCV(logistic, param_dict=param)
  • # 使用网格搜索进行模型训练找出最佳参数
  • model.fit(x, y)

编程要求

根据提示,在右侧编辑器补充代码,完善代码,使得代码能够通过测试

测试说明

平台会对你编写的代码进行测试:

预期输出: 测试通过

第2关任务——代码题

from sklearn.linear_model import LogisticRegressionCV
from sklearn.model_selection import GridSearchCV,train_test_split
from sklearn.datasets import load_irisdef model_train(x_train, x_test, y_train, y_test):# ********** Begin ********** ## 设置param进行网格搜索参数设置param_dict = {'Cs': [0.1, 1, 10], 'penalty': ['l1', 'l2']}# {参数名1:[参数值1, 参数值2],...}# 参数说明:# logistic 逻辑回归分类器logistic = LogisticRegressionCV(cv=5)# param_dict 超参字典# 使用网格搜索进行模型训练找出最佳参数grid_search = GridSearchCV(logistic, param_grid=param_dict, cv=5)grid_search.fit(x_train, y_train)# 计算模型在测试集上的准确率score = grid_search.score(x_test, y_test)# ********* End ********** #return scoreif __name__ == '__main__':iris = load_iris()x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2)score = model_train(x_train, x_test, y_train, y_test)if score >= 0.8:print("测试通过")else:print("测试失败")

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

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

相关文章

低空经济再获新动能!沃飞长空完成新一轮数亿元融资

当下,作为中国"新质生产力"代表的低空经济正在成为新的发展“风口”,全国各地开足马力加速入场。 低空经济有多“火”?政策方面,据不完全统计,已有26个省份的政府工作报告对发展低空经济作出部署&#xff1…

如何做好新闻软文宣发媒体资源筛选?

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 媒体宣传加速季,100万补贴享不停,一手媒体资源,全国100城线下落地执行。详情请联系胡老师。 新闻软文宣发是指企业通过创造或利用新闻事件&#xff0c…

重生之我要学后端10--Web服务器类型及基础知识(持续更新)

Web服务器类型及其基础知识 一、简介二、Apache HTTP Server三、Nginx四、处理客户端请求的过程五、web服务器和应用服务器5.1Web服务器5.2应用服务器5.3它们之间的区别5.4实际使用5.5他们和我们的后端应用是什么关系 一、简介 不同类型的服务器软件有各自的特点和优势&#x…

使用k8s变更线上版本号

第一步,在镜像仓库中找到历史版本号 第二步,在rancher中在工作负载里 第三步,在rancher找到这个版本号,可以更改之前的版本号 这样就可以很方便的退回到之前的版本了

Django安装与启动

1、Django是什么? 基于python的Web开发框架,支持用户快速开发安全、可维护的网站 2、怎么安装? pip install Django4.2 3、如何启动? 不写ip和端口时候,默认启动http://127.0.0.1:8000/ python .\manage.py runse…

AI时代的量化金融:ChatGPT在交易中的应用与前景

文章目录 📑前言一、智能量化:开启金融新世界二、作者简介三、本书特色四、适读人群 在数字化、智能化的时代浪潮中,金融领域正经历着一场前所未有的变革。传统的金融分析方法逐渐被高效、精准的量化金融与算法交易所替代,而人工智…

【知识】详细介绍 CUDA Samples 示例工程

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 内容较多,可通过 左侧或右侧 的 目录 进行跳转。 CUDA 是“Compute Unified Device Architecture (计算统一设备架构)”的首字母缩写。CUDA…

面试专区|【68道JQuery高频题整理(附答案背诵版)】

1.Ajax是同步还是异步,简述Ajax的流程? Ajax(Asynchronous JavaScript and XML)是异步的。它允许在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页内容。Ajax 的流程通常如下: 创建 XMLHttpR…

x264 码率控制 MBtree 原理:i_propagate_cost计算过程

x264 码率控制 MBtree 原理 关于x264 码率控制中 MBtree 算法的原理具体可以参考:x264 码率控制MBtree原理。 i_propagate_cost介绍 该值在 frame.h 中 x264_frame_t结构体中声明。该值是一个 uint16_t型指针变量,在 MBtree 算法中用来存储每个宏块的传播代价。在*frame_ne…

应用案例 | Panorama SCADA:开创性的铁路电气控制系统

案例概况 客户:英国铁路网运营商Network Rail 合作伙伴:Telent Technology Services Ltd 应用:实现对铁路牵引电网的高效管理与精准控制 应用产品:宏集Panorama E2 SCADA系统 一、应用背景 英国铁路网运营商Network Rail计划…

IDEA版本推荐

推荐版本: IDEA 2024.1.4 下载链接:IDEA下载 (下载时可以往下拖,选到自己想要的版本哦) 本人由于项目开发需要,陆续用过几个版本的IDEA,包括: IDEA 2020.2.4 。这是在看韩顺平老师…

创意学生木工工具——木工锯床

开展创意木工课程丰富了学校的课程多样性,强化了实践教育,并实现了跨学科的融合,在教育理念方面,创意木工课程强调了学生的主体地位,注重了学生的全面发展,并倡导了实践育人的理念,培养学生的综…

python-18-零基础自学python 类和子类的基础练习

学习内容:《python编程:从入门到实践》第二版 知识点: 类,父类与子类的继承,调用函数方法等。 练习内容: 练习9-7:管理员 管理员是一种特殊的用户。编写一个名为Admin的类,让它继…

游泳耳机入耳式好还是骨传导好?游泳教练力荐实力卓绝的四大热款

作为一名长期致力于游泳爱好者健康与运动体验提升的专业教练,我深知在水中听音乐的魅力,同时也深知选择正确的耳机对于水上运动的重要性。近年来,市场上的游泳耳机类型日益丰富,其中入耳式和骨传导两大主流各有千秋。今天&#xf…

springcloud第4季 分布式事务seata作用服务搭建1

一 seata作用 1.1 seata简介 1.seata是一款解决分布式事务的解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。 1.2 seata的术语 一个中心:全局事务id,xid,在调用服务链路的上下文中进行传播。TC(Transa…

界面控件Telerik UI for Winforms 2024 Q2新版亮点 - 发布全新的AI相关组件

Telerik UI for WinForms拥有适用Windows Forms的110多个令人惊叹的UI控件,所有的UI for WinForms控件都具有完整的主题支持,可以轻松地帮助开发人员在桌面和平板电脑应用程序提供一致美观的下一代用户体验。 本文将介绍界面组件Telerik UI for Winform…

高效导航:Symfony路由组件的高级应用揭秘

🌐 高效导航:Symfony路由组件的高级应用揭秘 🚀 在Symfony框架中,路由是应用程序的神经系统,负责将用户的请求导向正确的控制器。Symfony的路由组件不仅功能强大,而且提供了许多高级用法,以满足…

golang项目基于gorm框架从postgre数据库迁移到达梦数据库的实践

一、安装达梦数据库 1、登录达梦数据库官网,下载对应系统版本的安装包。 2、下载地址为:https://www.dameng.com/list_103.html 3、达梦数据库对大小写敏感,在安装初始化数据库实例时建议忽略大小写;具体安装教程可参考以下博客: …

php中闭包(Closure)的bindTo函数用法

Closure::bindTo 是 PHP 中的一个方法,用于改变闭包(Closure)内部的 $this 上下文以及其静态范围。这意味着你可以将一个闭包从一个对象或类绑定到另一个对象或类上,使其在调用时使用新的上下文。这对于在不同的对象实例间复用闭包…

C++02 变量和基本类型

基本类型 字、字节、bit、Byte之间的关系 字 word 字节 Byte 位 bit 1字 2字节 <---> 1word 2Byte 1字节 8位 <---> 1Byte 8bit 1Byte 8bits 1KB 1024Bytes 1MB 1024KB 1GB 1024MB #include <iostream> using namespace std; int main() {/*字符…