【Python机器学习】线性模型——用于二分类的线性模型

线性模型也广泛用于分类问题,对于二分类问题,可以用以下公式进行预测:

y=w[0]*x[0]+w[1]*x[1]+…………+w[p]*x[p]+b>0

公式与现行回归的公式非常类似,但没有返回特征的加权求和,而是为预测设置了阈值。如果函数值小于0,就预测类别-1,否则预测类别+1。

对于用于回归的线性模型,输出y是特征的线性函数,是直线、平面或者超平面。对于用于分类的线性模型,决策边界是输入的线性函数。

学习线性模型有很多算法,主要区别在于:

1、系数与截距的特定组合对训练数据拟合好坏的度量方法

2、是否使用正则化,以及使用哪种正则化。

最常见的线性分类算法是Logistic回归和线性支持向量机(线性SVM),用到的类分别是linear_model.LogisticRegression、svm.LinearSVC。

对两种分类算法的模型用在forge数据集上,并对决策边界可视化:

import mglearn.datasets
from sklearn.linear_model import Ridge,LinearRegression,Lasso,LogisticRegression
from sklearn.svm import LinearSVC
import matplotlib.pyplot as plt


plt.rcParams['font.sans-serif']=['SimHei']

X,y=mglearn.datasets.make_forge()

fig,axes=plt.subplots(1,2,figsize=(10,3))
for model,ax in zip([LinearSVC(),LogisticRegression()],axes):
    clf=model.fit(X,y)
    mglearn.plots.plot_2d_separator(clf,X,fill=False,eps=0.5,ax=ax,alpha=.7)
    mglearn.discrete_scatter(X[:,0],X[:,1],y,ax=ax)
    ax.set_title('{}'.format(clf.__class__.__name__))
    ax.set_xlabel('0')
    ax.set_ylabel('1')
axes[0].legend()
plt.show()

图中黑线上方的数据点会被划分为类别1,下方的数据点会被划分为类别0。

两种模型默认使用L2正则化,就像岭回归。 

对于LogisticRegression和LinearSVC,决定正则化强度的权衡参数为C,C越大,正则化越弱,也就是C越小,训练集拟合越好,C越大,系数向量越接近于0。

对于多维数据集,用于分类的线性模型会非常强大,考虑更多特征时,避免过拟合就更重要。


from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Ridge,LinearRegression,Lasso,LogisticRegression


cancer=load_breast_cancer()
X_train,X_test,y_train,y_test=train_test_split(
    cancer.data,cancer.target,stratify=cancer.target,random_state=42
)
logreg=LogisticRegression().fit(X_train,y_train)
print('C=1的训练集score:{:.3f}'.format(logreg.score(X_train,y_train)))
print('C=1的测试集score:{:.3f}'.format(logreg.score(X_test,y_test)))


logreg_100=LogisticRegression(C=100).fit(X_train,y_train)
print('C=100的训练集score:{:.3f}'.format(logreg_100.score(X_train,y_train)))
print('C=100的测试集score:{:.3f}'.format(logreg_100.score(X_test,y_test)))


logreg_001=LogisticRegression(C=0.01).fit(X_train,y_train)
print('C=0.01的训练集score:{:.3f}'.format(logreg_001.score(X_train,y_train)))
print('C=0.01的测试集score:{:.3f}'.format(logreg_001.score(X_test,y_test)))

结果输出:

C=1的训练集score:0.944
C=1的测试集score:0.965
C=100的训练集score:0.955
C=100的测试集score:0.958
C=0.01的训练集score:0.934
C=0.01的测试集score:0.930

 可以看到,C=1(默认值)时,性能就比较好了,训练集和测试集的精度在95%左右,但非常相近,所以模型很可能是欠拟合的,C=100时,得到了更高的训练集精度,C=0.01时精度下降,有可能存在过拟合。

对于系数的影响,可视化可以看到:


from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Ridge,LinearRegression,Lasso,LogisticRegression
import matplotlib.pyplot as plt


plt.rcParams['font.sans-serif']=['SimHei']
cancer=load_breast_cancer()
X_train,X_test,y_train,y_test=train_test_split(
    cancer.data,cancer.target,stratify=cancer.target,random_state=42
)
logreg=LogisticRegression().fit(X_train,y_train)
logreg_100=LogisticRegression(C=100).fit(X_train,y_train)
logreg_001=LogisticRegression(C=0.01).fit(X_train,y_train)
#,penalty ='l1',solver='liblinear'
plt.plot(logreg.coef_.T,'s',label='logreg C=1')
plt.plot(logreg_100.coef_.T,'^',label='logreg C=100')
plt.plot(logreg_001.coef_.T,'v',label='logreg C=0.01')
plt.xticks(range(cancer.data.shape[1]),cancer.feature_names,rotation=90)
plt.hlines(0,0,cancer.data.shape[1])
plt.ylim(-5,5)
plt.xlabel('index')
plt.ylabel('系数大小')
plt.legend()
plt.show()

 

可以看到,更强的正则化使得系数更倾向于0,但不正好等于0,如果用L1正则化,约束模型就只使用少数几个特征, 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity 欧盟UMP用户隐私协议Android接入指南

Unity 欧盟UMP用户协议Android接入指南 官方文档链接开始接入mainTemplate.gradle 中引入CustomUnityPlayerActivity 导入UMP相关的包java类中新增字段初始化UMPSDK方法调用![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/d882171b068c46a1b956e80425f3a9cf.png)测…

Linux操作系统基础(06):Linux的文件类型和颜色

1.Linux文件类型 在Linux系统中,文件类型是指文件的种类或类型,它决定了系统对文件的处理方式,文件类型的作用在于告诉系统如何处理文件,不同类型的文件会有不同的默认行为和处理方式,Linux系统中常见的文件类型包括 …

轻松玩转书生·浦语大模型趣味Demo

轻松玩转书生浦语大模型趣味 Demo 轻松玩转书生浦语大模型趣味 Demo 1 大模型及 InternLM 模型简介 1.1 什么是大模型?1.2 InternLM 模型全链条开源 2 InternLM-Chat-7B 智能对话 Demo 2.1 环境准备2.2 模型下载2.3 代码准备2.4 终端运行2.5 web demo 运行 3 Lagen…

大数据 Hive - 实现SQL执行

文章目录 MapReduce实现SQL的原理Hive的架构Hive如何实现join操作小结 MapReduce的出现大大简化了大数据编程的难度,使得大数据计算不再是高不可攀的技术圣殿,普通工程师也能使用MapReduce开发大数据程序。 但是对于经常需要进行大数据计算的人&#xff…

QT5.14 实现ModbusTCP客户端 Demo

本文在QT5.14平台,基于QModbusClientTcp类,实现了客户端对单个寄存器的读写,用ModbusSlave做服务器做测试。 1.界面 (1)更改读按钮的名称为bt_Read (2)更改写按钮的名称为bt_Write 2.修改pro文件的第三行 greaterThan(QT_MAJOR_VERSION, 4)…

快速幂算法总结

知识概览 快速幂可以在O(logk)的时间复杂度之内求出来的结果。 例题展示 快速幂 题目链接 活动 - AcWing 系统讲解常用算法与数据结构,给出相应代码模板,并会布置、讲解相应的基础算法题目。https://www.acwing.com/problem/content/877/ 代码 #inc…

Rapberry Pi 4 安装VxWorks笔记

Rapberry Pi 4 安装VxWorks笔记 本文章发表与我的github page: Rapberry Pi 4 安装VxWorks笔记 | Hi, I am watershade. Welcome to my pages. 在github page会有更好体验和更多文章。 一、概述 ROS2推荐的操作系统是ubuntu,众所周知,linux并不是实时…

基于php应用的文件管理器eXtplorer部署网站并内网穿透远程访问

文章目录 1. 前言2. eXtplorer网站搭建2.1 eXtplorer下载和安装2.2 eXtplorer网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1. 前言 通过互联网传输文件,是互联网最重要的应用之一,无论是…

7 种常见的前端安全攻击

文章目录 七种常见的前端攻击1.跨站脚本(XSS)2.依赖性风险3.跨站请求伪造(CSRF)4.点击劫持5.CDN篡改6. HTTPS 降级7.中间人攻击 随着 Web 应用程序对业务运营变得越来越重要,它们也成为更有吸引力的网络攻击目标。但不…

test mutation-02-变异测试 mutate-test-kata入门介绍

拓展阅读 开源 Auto generate mock data for java test.(便于 Java 测试自动生成对象信息) 开源 Junit performance rely on junit5 and jdk8.(java 性能测试框架。性能测试。压测。测试报告生成。) test 系统学习-04-test converate 测试覆盖率 jacoco 原理介绍 mutate-te…

SkyWalking介绍和Docker环境下部署

一、Skywalking概述 1、Skywalking介绍 Skywalking是分布式系统的应用程序性能监视工具,专为微服务,云原生架构和基于容器(Docker,K8S,Mesos)架构而设计,它是一款优秀的APM(Application Perfo…

RocketMQ5-02快速部署RocketMQ5.x(手动和容器部署)

RocketMQ5快速入门指南(含部署实践) 部署环境本机单机可执行包部署、Docker部署 Mac部署:下载源文件可执行包部署 NameServer 问题1:资源不足补充: 关于日志的输出 可执行包部署 Broker 对于Local模式对于Cluster模式 对于 ProxyDocker部署 NameServerD…

蒙特卡洛算法

通过随机数获得结果的算法。 当一个问题无法通过数学推导,计算机无法在有限时间求解时候。 就需要考虑蒙特卡洛方法了。 当无法求得精确解时候,进行随机抽样,根据统计试验求近似解。 可行域过大,没有通用方法求出精确解。 主…

OpenHarmony基于HDF简单驱动开发实例

背景 OpenHarmony-3.0-LTSqemu_small_system_demoliteos_aqemu 添加配置 device/qemu/arm_virt/liteos_a/hdf_config/device_info/device_info.hcs device_info 新增: sample_host :: host {hostName "sample_host";sample_device :: device {devic…

腾讯云免费服务器申请1个月攻略,亲测可行教程

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM,轻量配置可选2核2G3M、2核8G7M和4核8G12M,CVM云服务器可选2核2G3M和2核4G3M配置,腾讯云服务器网txyfwq.com分享2024年最新腾讯云免费…

Python 常用数据类型

Python 常用数据类型有以下这些: 数据类型中文解析例子int整数,表示整数值1、2float浮点数,表示带有小数点的数值3.14、2.718complex复数,表示实部和虚部组成的复数12j、3-4jstr字符串,表示文本数据,用引号…

arm64架构编译electron长征路

1. gn工具生成 在arm64下需要构建对应架构的gn文件。 源代码下载,并且切换到对应的版本。 git clone https://gn.googlesource.com/gn cd gn git checkout 5a004f9427a0将gn源码放在src/tools/gn目录下,内容如下图 1.1 问题,找不到last_commit_position.h文件 问题描述如…

http 客户端 Feign【微服务】

文章目录 1. 基于 Feign 的远程调用2. Feign 自定义配置3. Feign 性能优化4. Feign 的最佳实践4.1 继承4.2 抽取 1. 基于 Feign 的远程调用 Feign 是一个声明式的 http 客户端,它可以帮助我们优雅地发送 http 请求。 在学习 Feign 之前先来看一下我们以前利用 Res…

SpringBoot3多数据源动态切换

demo使用的时SpringBoot3.x、JDK17、MybatisPlus3.5.x、MySQL8 从数据中加载数据源 定义接口,指定数据源,从不同数据库获取数据 创建数据源表,用于指定不同数据源,程序自动动态获取 项目版本依赖关系 demo中所用到的工具以及…

学习笔记16——操作系统

学习笔记系列开头惯例发布一些寻亲消息,感谢关注! 链接:https://www.mca.gov.cn/lljz/indexdetail.html?idd0afa7f6f36946319a206d61937f9b63&type0&t10.11199120579373845 八股——操作系统一些基础知识整理 一个java程序对应一个…