【菜菜的sklearn课堂笔记】逻辑回归与评分卡-重要参数penalty C

news2025/7/18 8:14:10

视频作者:菜菜TsaiTsai
链接:【技术干货】菜菜的机器学习sklearn【全85集】Python进阶_哔哩哔哩_bilibili

正则化是用来防止模型过拟合的过程,常用的有L1正则化和L2正则化两种选项。这个增加的范式,被称为“正则项”,也被称为"惩罚项"。损失函数改变,基于损失函数的最优化来求解的参数取值必然改变,我们以此来调节模型拟合的程度。
其中L1范式表现为参数向量中的每个参数的绝对值之和,L2范数表现为参数向量中的每个参数的平方和的开方值。
J ( θ ) L 1 = C ⋅ J ( θ ) + ∑ j = 1 p ∣ θ j ∣ ( j ≥ 1 ) J ( θ ) L 2 = C ⋅ J ( θ ) + ∑ j = 1 p ( θ j ) 2 ( j ≥ 1 ) \begin{aligned} J(\theta)_{L1}&=C \cdot J(\theta)+\sum\limits_{j=1}^{p}|\theta_{j}|\quad (j \geq 1)\\ J(\theta)_{L2}&=C \cdot J(\theta)+\sqrt{\sum\limits_{j=1}^{p}(\theta_{j})^{2}}\quad (j \geq 1) \end{aligned} J(θ)L1J(θ)L2=CJ(θ)+j=1pθj(j1)=CJ(θ)+j=1p(θj)2 (j1)
其中 J ( θ ) J(\theta) J(θ)是损失函数, C C C是用来控制正则化程度的超参数, p p p是方程中特征的总数, θ j \theta_{j} θj代表每一个参数,在这里 j j j要大于等于1,因为我们参数向量 θ \theta θ中的一个参数是 θ 0 \theta_{0} θ0,而截距通常是不参与正则化的
sklearn当中,常数项C是在损失函数的前面,通过调控损失函数本身的大小,来调节对模型的惩罚

在许多书籍和博客中,大家可能也会见到如下的写法:
J ( θ ) L 1 = J ( θ ) + 1 2 b 2 ∑ j ∣ θ j ∣ J ( θ ) L 2 = J ( θ ) + θ T θ 2 σ 2 \begin{aligned} J(\theta)_{L1}&=J(\theta)+ \frac{1}{2b^{2}}\sum\limits_{j}^{}|\theta_{j}|\\ J(\theta)_{L2}&=J(\theta)+ \frac{\theta^{T}\theta}{2\sigma^{2}} \end{aligned} J(θ)L1J(θ)L2=J(θ)+2b21jθj=J(θ)+2σ2θTθ
其实和上面我们展示的式子的本质是一模一样的。在大多数教材和博客中,常数项是乘以正则项,通过调控正则项来调节对模型的惩罚。

L1正则化和L2正则化虽然都可以控制过拟合,但它们的效果并不相同。当正则化强度逐渐增大(即C逐渐变小),参数 θ \theta θ的取值会逐渐变小,但L1正则化会将参数压缩为0,L2正则化只会让参数尽量小,不会取到0,也就是所说的L1正则化会产生稀疏解

部分的正则化方法是在经验风险或者经验损失 L e m p L_{emp} Lemp(emprirical loss)上加上一个结构化风险,结构化风险用参数范数惩罚 Ω ( θ ) \Omega(\theta) Ω(θ),用来限制模型的学习能力、通过防止过拟合来提高泛化能力。
所以总的损失函数(也叫目标函数)为:
J ( θ ; X , y ) = L e m p ( θ ; X , y ) + α Ω ( θ ) J(\theta; X, y) = L_{emp}(\theta; X, y) + \alpha\Omega(\theta) J(θ;X,y)=Lemp(θ;X,y)+αΩ(θ)
其中 X X X是输入数据, y y y是标签, θ \theta θ是参数, α ∈ [ 0 , + ∞ ] \alpha \in [0,+∞] α[0,+]是用来调整参数范数惩罚与经验损失的相对贡献的超参数,当 α = 0 α=0 α=0时表示没有正则化, α α α越大对应该的正则化惩罚就越大。对于L1正则化(其中 ω \omega ω是模型的参数) 有:
Ω ( θ ) = ∣ ∣ ω ∣ ∣ 1 \Omega(\theta) = ||\omega||_{1} Ω(θ)=ω1
![[附件/Pasted image 20221102173854.png|400]]
面中的蓝色轮廓线是没有正则化损失函数的等高线,中心的蓝色点为最优解,左图、右图分别为L2、L1正则化给出的限制。
可以看到在正则化的限制之下,L2正则化给出的最优解 ω ∗ \omega∗ ω是使解更加靠近原点,也就是说L2正则化能降低参数范数的总和。L1正则化给出的最优解 ω ∗ \omega∗ ω是使解更加靠近某些轴,而其它的轴则为0,所以L1正则化能使得到的参数稀疏化

作者:自由星人布丁
链接:机器学习-L1正则化为什么会产生稀疏解 - 知乎 (zhihu.com)

文章还有更详细的数学上的推导关于L1范数约束会得到稀疏的解

在L1正则化在逐渐加强的过程中,携带信息量小的、对模型贡献不大的特征的参数,会比携带大量信息的、对模型有巨大贡献的特征的参数更快地变成0,所以L1正则化本质是一个特征选择的过程,掌管了参数的“稀疏性”。因此,如果特征量很大,数据维度很高,我们会倾向于使用L1正则化。由于L1正则化的这个性质,逻辑回归的特征选择可以由Embedded嵌入法来完成。
相对的,L2正则化在加强的过程中,会尽量让每个特征对模型都有一些小的贡献,但携带信息少,对模型贡献不大的特征的参数会非常接近于0。
通常来说,如果我们的主要目的只是为了防止过拟合,选择L2正则化就足够了。但是如果选择L2正则化后还是过拟合,模型在未知数据集上的效果表现很差,就可以考虑L1正则化
而两种正则化下C的取值,都可以通过学习曲线来进行调整。

LogisticRegression(
    ["penalty='l2'", 'dual=False', 'tol=0.0001', 'C=1.0', 'fit_intercept=True', 'intercept_scaling=1', 'class_weight=None', 'random_state=None', "solver='warn'", 'max_iter=100', "multi_class='warn'", 'verbose=0', 'warm_start=False', 'n_jobs=None'],
)
# penalty:可以输入"l1"或"l2"来指定使用哪一种正则化方式,不填写默认"l2"。 
# 注意,若选择"l1"正则化,参数solver仅能够使用求解方式”liblinear"和"saga“;若使用“l2”正则化,参数solver中所有的求解方式都可以使用。
# C:C正则化强度的倒数,必须是一个大于0的浮点数,不填写默认1.0,即默认损失函数与正则项的比值是1:1。C越小,损失函数会越小,模型对损失函数的惩罚越重,正则化的效力越强,参数θ会逐渐被压缩得越来越小。
from sklearn.linear_model import LogisticRegression as LR
from sklearn.datasets import load_breast_cancer
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

data = load_breast_cancer()
X = data.data
y = data.target

X.shape
---
(569, 30)

lrl1 = LR(penalty="l1",solver="liblinear",C=0.5,max_iter=1000)
lrl2 = LR(penalty="l2",solver="liblinear",C=0.5,max_iter=1000)

lrl1 = lrl1.fit(X,y)
lrl1.coef_ # 各个特征所对应的参数
# 注意返回的是二维array
---
array([[ 3.98754228,  0.03153078, -0.13532423, -0.01620142,  0.        ,
         0.        ,  0.        ,  0.        ,  0.        ,  0.        ,
         0.        ,  0.50383838,  0.        , -0.07126945,  0.        ,
         0.        ,  0.        ,  0.        ,  0.        ,  0.        ,
         0.        , -0.24537614, -0.12838236, -0.01442535,  0.        ,
         0.        , -2.0550076 ,  0.        ,  0.        ,  0.        ]])

(lrl1.coef_ != 0).sum() # l1正则化可能会把部分特征系数压缩成0
---
10

lrl2 = lrl2.fit(X,y)
lrl2.coef_
---
array([[ 1.60607308e+00,  9.80640554e-02,  5.51538489e-02,
        -4.80814634e-03, -9.75651764e-02, -2.97883054e-01,
        -4.58633029e-01, -2.27937385e-01, -1.40149921e-01,
        ……
        -4.37780410e-01, -4.31445382e-01, -8.46315361e-02]])

(lrl2.coef_ != 0).sum()
---
30

可以看见,当我们选择L1正则化的时候,许多特征的参数都被设置为了0,这些特征在真正建模的时候,就不会出现在我们的模型当中了,而L2正则化则是对所有的特征都给出了参数。

究竟哪个正则化的效果更好呢

l1 = []
l2 = []
l1test = []
l2test = []

Xtrain,Xtest,Ytrain,Ytest = train_test_split(X,y,test_size=0.3,random_state=420)
for i in np.linspace(0.05,2,19):
    lrl1 = LR(penalty="l1",solver="liblinear",C=i,max_iter=1000) # 也有random_state
    lrl2 = LR(penalty="l2",solver="liblinear",C=i,max_iter=1000)
    
    lrl1 = lrl1.fit(Xtrain,Ytrain)
    l1.append(accuracy_score(lrl1.predict(Xtrain),Ytrain))
    l1test.append(accuracy_score(lrl1.predict(Xtest),Ytest))
    
    lrl2 = lrl2.fit(Xtrain,Ytrain)
    l2.append(accuracy_score(lrl2.predict(Xtrain),Ytrain))
    l2test.append(accuracy_score(lrl2.predict(Xtest),Ytest))

graph = [l1,l2,l1test,l2test]
color = ['green','k','lightgreen','gray']
label = ['L1','L2','L1test','L2test']

plt.figure(figsize=(6,6))
for i in range(len(graph)):
    plt.plot(np.linspace(0.05,2,19),graph[i],color[i],label=label[i])

plt.legend(loc='lower right') # 也可以写plt.legend(loc=4)
plt.xlabel('Parameter C')
plt.show()

![[附件/Pasted image 20221102211238.png|400]]

可见,至少在乳腺癌数据集下,两种正则化的结果区别不大。但随着C的逐渐变大,正则化的强度越来越小,模型在训练集和测试集上的表现都呈上升趋势,直到C=0.8左右,训练集上的表现依然在走高,但模型在未知数据集上的表现开始下跌,这时候就是出现了过拟合。我们可以认为,C设定为0.8会比较好
在实际使用时,基本就默认使用l2正则化,如果感觉到模型的效果不好,那就换L1试试看

这里说一下matplotlib相关的

# 在我们show之前,所有画图都在同一个画布上
# 当我们show之后,再进行画图,不会再之前的画布上
# 如果在show之后有创建新画布则用创建的画布
# 如果没有,默认创建画布(这么做不规范,画布没有任何设置,主要不好理解)
plt.figure(figsize=(3,2)) # 就像本例,我们设置画布figsize=(3,2)
for i in range(2):
    plt.plot(np.linspace(0.05,1,19),graph[i],color[i],label=label[i])
    plt.legend(loc='lower right') # 也可以写plt.legend(loc=4)
    plt.show() # 第一次show的时候figsize=(3,2)被用掉了,新的画图就要默认用创建画布

![[附件/Pasted image 20221102211435.png]]
![[附件/Pasted image 20221102211443.png]]

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

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

相关文章

11个开源测试自动化框架,如何选?

以下为作者观点: 如果你正在考虑建立你自己的测试自动化框架,请再想一想。在大多数情况下,你最好可以考虑一个或多个可用的开源选项。 这是因为,一般来说,框架是一套可以跨团队使用的最佳实践、假设、通用工具和库。…

操作符详解(C语言)

算术操作符(运算符): - * / % 在算术运算符中, - * 跟我们数学中的运算是一样的 在这里主要说一下 / 跟 % 这两个操作符 1、/ (除法) 在除法运算中,若除号两边的操作数都为整型,则结果…

布隆过滤器(Bloom Filter)

[TOC](布隆过滤器(Bloom Filter)) (1)什么是布隆过滤器 (1)布隆过滤器的简单介绍 布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以…

Python中的print()

本专栏为学习B站杨淑娟老师视频所记,仅做个人笔记使用😋😋😋 👉杨淑娟老师视频课👈 Python 职位方向 一、chapter1 1.使用print函数进行简单的输出 a100 # 变量a,值为100 b50 # 变量b,值为50print(90) …

【Linux实验】软中断通信

实验目的: 1.了解什么是信号,熟练掌握signal(),wait(),exit(),kill()函数。 2.熟悉并掌握Linux系统…

Learning to Enhance Low-Light Image via Zero-Reference Deep Curve Estimation

学习目标: Learning to Enhance Low-Light Image via Zero-Reference Deep Curve Estimation(零参考深度曲线估计) 个人体会: 本文的特色就是使用了PA和CA,对不同通道和不同像素做不同处理,虽然本文的实现过程懂了,但是实现去雾…

缝纫机牙架的数控工艺工装设计与编程

目 录 绪 论 1 2.差动牙架的工艺设计 3 2.1 机械加工工艺规程概述 3 2.2.1 零件的技术条件 4 2.2.2 加工表面及其要求 5 2.2.3零件的材料 6 2.3毛坯的选择 6 2.3.1毛坯的种类 6 2.4 基准的选择 8 2.5 机械加工工艺路线的拟订 10 3 差动牙架的工装设计 17 3.1 夹具概述 17 3.2 …

牛客CM11 - 链表分割【环形链表雏形】

看来真的不能乱割呀~一、题目描述二、思路分析三、代码详解【保姆级教学】四、环形链表的疑难解惑五、整体代码展示六、总结与提炼一、题目描述 描述 现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前&am…

数据库-范式

目录 完全函数依赖部分函数依赖传递函数依赖码主属性非主属性第一范式(1NF)第二范式(2NF)第三范式(3NF)例题完全函数依赖 每一个属性都有用,缺一个都不能决定。 部分函数依赖 部分属性用不到,也可以决定 传递函数依赖

抽象类和(上)

大家好,又见面了,今天和大家浅谈一下抽象类 抽象类存在的意义就是被继承 抽象类 🐷1.抽象类的定义 🐱‍🚀2.抽象类的语法 💚3.抽象类的概念 🚀4.抽象类的作用 1.抽象类的概念 什么是 好…

[附源码]java毕业设计基于个性化的汽车购买推荐系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

如何在Ubuntu 22.04上安装Linux 内核 6.0?

内核是任何基于 Linux 的操作系统的核心部分,它充当计算机系统软件和硬件之间的桥梁,还提供用户和应用程序与计算机交互所需的接口。内核提供了许多功能,包括进程调度、资源分配、设备管理、中断处理、内存管理和进程。 在撰写本文时&#x…

轻松学会jQuery选择器的用法

文章目录⛳️ 选择器✨ 属性选择器✨ 包含选择器✨ 位置选择器✨ 过滤选择器✨ 反向选择器⛳️ 快速投票⛳️ 选择器 本篇重点讲解jQuery中丰富的选择器,以及他们的基本用法。CSS的选择器均可以用jQuery的$进行选择,部分浏览器对CSS3的选择器支持不全&am…

大道至简,凯里亚德酒店成为酒店投资圈万众瞩目的“新”星

作为近年酒店市场的热门领域,中端酒店行业的发展一直颇受关注。随之而来的就是中端酒店品牌的不断增加,以及中端商旅、度假型酒店规模的不断扩大,经行业资深人士分析,未来中端酒店将成为酒店市场的主力产品。鉴于市场的发展趋势&a…

Netty中的缓存Bytebuf

首先我们来明确一下Buffer(缓存) JavaNIO中的Buffer、Netty中的Buffer、Netty中的Bytebuf这是3个不同的类,但实现的内容和完成的功能几乎一致,最原始的是JavaNIO中的Buffer实现,最先进的是Netty中Bytebuf的实现&#x…

10 分钟, 带你彻底掌握 SQL 多表查询

1.前言 多表查询,也称为多表连接查询;作为关系型数据库最主要的查询方式,在日常工作中被广泛使用 常见的多表查询操作包含:子查询、内连接、左外连接、右外连接、完全连接、交叉连接 本篇文章将利用一个实例逐一介绍这些操作 …

【华为OD机试真题 python】 太阳能板最大面积【2022 Q4 | 100分】

■ 题目描述 给航天器一侧加装长方形或正方形的太阳能板(图中的红色斜线区域),需要先安装两个支柱(图中的黑色竖条),再在支柱的中间部分固定太阳能板。 但航天器不同位置的支柱长度不同,太阳能…

做一名既有宽度也有深度的测试!

一名好的测试人员,在工作中,不仅要做到有宽度更要有深度! 何为宽度?测试用例的覆盖面更广更全。 测试人员设计测试用例的时候可以分为这几种类型: 一:将prd的需求描述copy到测试用例。 二:细…

Java线程安全与对象头结构信息

文章目录一 线程安全问题1.1 什么是线程安全问题?1.2 自增运算真的线程安全吗?1.3 Synchronized锁表现三种形势?1.3.1 synchronized同步方法1.3.2 synchronized同步代码块1.3.3 synchronized静态方法1.3.4 总结二 Java对象结构与内置锁2.1 Ja…

浏览器自动化利器Selenium IDE使用指南

文章目录前言一、安装及界面1.1 安装1.2 界面二、常用命令2.1 通用2.2 表单2.3 流程控制三、常用操作3.1 命令操作3.2 js脚本3.3 录制3.4 导出四、实际操作例子4.1 红黑树插入可视化4.2 github下载参考前言 Selenium 是一个浏览器自动化框架,专门为 W3C WebDriver …