机器学习——logit正则化

news2024/11/27 3:41:06

机器学习——logit正则化

文章目录

1 logit模型正则化

logit模型能实现分类,识别研究事物的属性特征。如果影响研究对象的属性类别的特征变量较多时,需要考虑对logit模型的参数施加惩罚,即对损失函数进行正则化。正则化包括 ℓ 1 \ell_1 1正则化(L1范数)和 ℓ 2 \ell_2 2正则化(L2范数),进而识别和筛选出那些具有稳健性的特征变量。

为估计logit模型,给定参数 ( w , w 0 ) (w,w_0) (w,w0),最小化成本损失函数
min ⁡ w C ∑ i = 1 n ( − y i log ⁡ ( p ^ ( X i ) ) − ( 1 − y i ) log ⁡ ( 1 − p ^ ( X i ) ) ) + r ( w ) \min _w C \sum_{i=1}^n\left(-y_i \log \left(\hat{p}\left(X_i\right)\right)-\left(1-y_i\right) \log \left(1-\hat{p}\left(X_i\right)\right)\right)+r(w) wminCi=1n(yilog(p^(Xi))(1yi)log(1p^(Xi)))+r(w)
其中 p ^ ( X i ) = 1 1 + exp ⁡ ( − X i w − w 0 ) \hat{p}\left(X_i\right)=\dfrac{1}{1+\exp \left(-X_i w-w_0\right)} p^(Xi)=1+exp(Xiww0)1 r ( w ) r(w) r(w)为正则化(或惩罚)项,包括以下四种类型

正则化类型 r ( w ) r(w) r(w)
None0
ℓ 1 \ell_1 1—L1范数 ∣ w 1 ∣ \lvert w_1\rvert w1
ℓ 2 \ell_2 2—L2范数 1 2 ∣ w ∣ 2 2 = 1 2 w T w \dfrac{1}{2}\lvert w\rvert_2^2 = \dfrac{1}{2}w^Tw 21w22=21wTw
Elasitic-Net 1 − ρ 2 w T w + ρ ∣ w 1 ∣ \dfrac{1-\rho}{2} w^T w+\rho\lvert w_1\rvert 21ρwTw+ρw1

2 logit回归求解器

Python中,基于sklearn的LogisticRegression求解器包括: “liblinear”, “newton-cg”, “lbfgs”, “sag” and “saga”。

liblinear:使用作标下降法,不能实现多分类任务,取而代之的是将1对多任务进行分解,转化二类任务问题。lbfgs, sag和 newton-cg只支持 ℓ 2 \ell_2 2正则化或者无正则化,适合多分类任务,高维数据收敛速度更快。sag使用随机平均梯度下降;lbfgs属于拟牛顿的方法,建议用于小数据集, 大型数据集表现不佳。saga支持非光滑 ℓ 1 \ell_1 1正则化,也是唯一 一个支持弹性网正则化的优化方案。

2.1 ℓ 1 \ell_1 1 ℓ 2 \ell_2 2正则化

首先生成虚拟数据

from sklearn.linear_model import LogisticRegression
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
import pandas as pd
from sklearn.model_selection import train_test_split

# DGP
np.random.seed(123456)
n = 100000
x = norm.rvs(loc=0, scale=1, size=n).reshape(10000, 10)
x = pd.DataFrame(x)
x.columns = ['x1', 'x2', 'x3','x4', 'x5', 'x6', 'x7', 'x8', 'x9', 'x10']
# 误差项
u = pd.DataFrame(norm.rvs(loc=0, scale=10, size=10000).reshape(10000, 1))
y = x['x1'] - x['x2'] + x['x3'] - 5*x['x4'] +3*x['x5']+u.iloc[0:9999,0]
y = np.float32(y > 0)
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=1)

使用liblinear求解器进行参数估计

# C正则化强度的倒数
lr_l1 = LogisticRegression(penalty="l1", C=0.01, solver="liblinear")
lr_l2 = LogisticRegression(penalty="l2", C=0.01, solver="liblinear")
lr_l1.fit(X_train, y_train)
lr_l2.fit(X_train, y_train)
print(f'使用l1正则化参数估计为\n{lr_l1.coef_}\n')
print(f'使用l2正则化参数估计为\n{lr_l2.coef_}\n')

# 使用l1正则化参数估计为
# [[ 0.06384757 -0.08083441  0.10173666 -0.72628788  0.37431005  0.
#    0.          0.          0.          0.        ]]
# 使用l2正则化参数估计为
# [[ 0.12446733 -0.14140626  0.16069834 -0.75861182  0.42387989 -0.0039323
#   -0.02225432 -0.03519713 -0.03028171  0.02025389]]

使用 ℓ 1 \ell_1 1具有变量筛选功能,某些变量系数为0,而 ℓ 2 \ell_2 2所有回归系数不为0(从结果看)。接下来绘制两种正则化系数搜索路径

clf = LogisticRegression(
    penalty="l2",
    solver="saga",
    tol=1e-6,
    max_iter=int(1e6),
    warm_start=True,
    intercept_scaling=1.0,
)
coefs1 = []
coefs2 = []
for i in np.linspace(0.0001, 100, 1000):
    l1 = LogisticRegression(penalty="l1", solver="liblinear", C=i, max_iter=1000)
    l2 = LogisticRegression(penalty="l2", solver="liblinear", C=i,  max_iter=1000)
    lrl1 = l1.fit(X_train, y_train)
    lrl2 = l2.fit(X_train, y_train)
    coefs1.append(lrl1.coef_.ravel().copy())
    coefs2.append(lrl2.coef_.ravel().copy())
    print(i)
coefs1 = np.array(coefs1)
coefs2 = np.array(coefs2)
plt.subplot(121)
plt.plot(np.log10(np.linspace(0.0001, 100, 1000)), coefs1,label = x.columns)
ymin, ymax = plt.ylim()
plt.xlabel("$log(C)$")
plt.ylabel("Coefficients")
plt.title("Logistic Regression $\ell_1$ Path")
plt.axis("tight")
plt.grid()
plt.legend()
plt.show()

plt.subplot(122)
plt.plot(np.log10(np.linspace(0.0001, 100, 1000)), coefs2,label = x.columns)
plt.xlabel("$log(C)$")
plt.ylabel("Coefficients")
plt.title("Logistic Regression $\ell_2$ Path")
plt.axis("tight")
plt.grid()
plt.legend()
plt.show()

2.2 e l a s t i c − n e t elastic-net elasticnet正则化

接下来使用弹性网正则化进行估计,为减少估计时间,指定 ρ = 0.5 \rho = 0.5 ρ=0.5

coefs = []
for i in np.linspace(0.0001, 100, 1000):
    el = LogisticRegression(penalty="elasticnet", solver="saga", C=i, l1_ratio=0.5, max_iter=1000)
    result = el.fit(X_train, y_train)
    coefs.append(result.coef_.ravel().copy())
    print(i)
coefs = np.array(coefs)
# 可视化
plt.plot(np.log10(np.linspace(0.0001, 100, 1000)), coefs, label=x.columns)
ymin, ymax = plt.ylim()
plt.xlabel("$log(C)$")
plt.ylabel("Coefficients")
plt.title("Logistic Regression elastic net Path,$\lambda = 0.5$")
plt.axis("tight")
plt.grid()
plt.legend()
plt.show()


-END-

[1] https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression<\br>

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

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

相关文章

励志长篇小说《周兴和》书连载之四 屋漏偏遇连天雨

屋漏偏遇连天雨 周兴和的母亲就死于那个寒冷的冬天。 她死时是1969年农历正月十八的早晨。 这时&#xff0c;周兴和的大女儿刚出生40多天。 母亲的病其实已经拖了好长时间了。刚开始她还能起床给一家人做饭&#xff0c;干点轻微的家务事。渐渐地&#xff0c;她开始不能吞食东…

如何成为年薪70万的全栈开发和测试人员?必备技能一网打尽

目录 引言 什么是全栈开发人员&#xff1f; 为什么需要全栈开发人员&#xff1f; 成为Full Stack Developer所需的技能组合 什么是软件栈&#xff1f; LAMP栈 MERN是基于JavaScript的技术的集合&#xff1a; Full Stack Developer的职责 技术的准备 一、测试基础 二…

面试官常问的音视频技术点!

一、前言&#xff1a; 今天继续给大家分享最近星球上的星友音视频面试题目&#xff0c;希望对大家有用&#xff01; 下面是具体面试问的问题&#xff1a; 二、面试题目&#xff1a; 1、请说下H264的两种形态&#xff1a; Annex B格式&#xff1a;这种格式常用于网络流媒体传输…

yum源下载,及安装本地rpm包

yum源下载&#xff1a; yumdownloader rpm包名 如 &#xff1a;要下载 关于 pcre2-devel的包&#xff0c; 发现需要 依赖&#xff1a; Downloading packages: (1/4): pcre2-10.23-2.el7.x86_64.rpm | 20…

架构师备战(一)-软考如何备考

我要备战的是系统架构设计师&#xff0c;那么软考有哪些可供我们选择的考试呢。 1、软考能考哪些 我们知道&#xff0c;软考的体系结构有很多&#xff0c;比如初级的程序员&#xff0c;中级的软件设计师&#xff0c;高级的系统架构师等。具体有哪些&#xff0c;大概有如下这些…

华硕ROG STRIX B760-G GAMING WIFI小吹雪D5评测:最能超的小主板 轻松提升14%

一、前言&#xff1a;华硕推出新版B760-G小吹雪主板 加入DDR5内存支持 和以往的每一代规格一样&#xff0c;DDR5内存上市初期的表现并不如人意&#xff0c;频率是高了&#xff0c;但延迟也高了&#xff0c;导致性能提升一般般。 经过一两年的演进&#xff0c;DDR5内存的时序延迟…

港联证券|熊市牛市出现的原因?出现时应该怎么办?

熊市和牛市是股市专业术语&#xff0c;都指的是股市的一种形式。那么熊市牛市出现的原因&#xff1f;出现时应该怎么办&#xff1f;下面就由港联证券为大家进行分析&#xff1a; 熊市牛市出现的原因&#xff1f; 熊市出现原因&#xff1a; 1、市场利空消息出现 比如公司业绩…

【Spring框架全系列】SpringBoot配置日志文件

&#x1f367;&#x1f367;哈喽&#xff0c;大家好&#xff0c;我是小浪。那么上篇博客我们学习了SpringBoot配置文件的相关操作&#xff0c;本篇博客我们将学习一个新的知识点&#xff0c;SpringBoot日志文件。&#x1f5a5;&#x1f5a5; &#x1f4f2;目录 一、日志是什么…

Git概念介绍,常用命令与工作流程整理 配图

首先附一张Git的cheat sheet 作为开始&#xff0c;方便查阅&#xff1a;https://education.github.com/git-cheat-sheet-education.pdf Git简介 Git大家肯定都不陌生了&#xff0c;象征性地再介绍一下&#xff1a;Git是一个版本控制系统&#xff0c;换句话说&#xff0c;它可…

TypeError: makedirs() got an unexpected keyword argument ‘exist_ok‘

背景&#xff1a; 自己在使用pyinstaller打包一个基于pyqt5的gan网络手写数字生成的项目的时候&#xff0c;打包过程中出现这个错误导致打包失败。 图示&#xff1a; 问题分析&#xff1a; 复制这个错误在百度上搜看到很多答案说是python版本的原因。2.7版本的python不支持…

Redis如何存储一个Java对象【内涵案例】

目录 Java原生序列化示例 GSON示例 使用fastjson存储Java对象到Redis时 Redis并不能直接存储Java对象&#xff0c;需要进行序列化或者转换成字符串等格式才可以进行存储。以下介绍两种常见的将Java对象存储到Redis的方案。 对象序列化&#xff0c;存储二进制数据 将对象进…

使用Chatglm-6b微调催收问答对的尝试

1.工作目录&#xff0c;如&#xff1a;mnt/d/work&#xff0c;下载源代码&#xff0c;并安装依赖 git clone https://github.com/THUDM/ChatGLM-6B cd ChatGLM-6B pip install -r requirement.txt 2. 从拥抱脸下载chatglm-6b-int4-qe到本地&#xff08;GPU环境搭建参考浪潮服…

线性结构-栈

栈是Stack一个后进先出Last In First Out,LIFO的线性表&#xff0c;他要求只在表尾对数据执行删除和插入等操作。 栈就是一个线性表&#xff0c;可以是数组、也可以是链表。但它的操作有别于一般的线性表。栈的元素必须先进后出&#xff0c;也就是先进入栈的元素必须后出栈。而…

金三银四好像消失了,IT行业何时复苏

疫情时候不敢离职&#xff0c;以为熬过来疫情了&#xff0c;行情会好一些&#xff0c;可是疫情结束了&#xff0c;反而行情更差了&#xff0c; 这是要哪样 我心中不由一万个 草泥&#x1f434; 路过 我心中不惊有了很多疑惑和感叹 接着上一篇 一个28岁程序员入行自述和感受 自…

3年外包测试走进字节,真的泪目了.....

一提及外包测试&#xff0c;大部分人的第一印象就是&#xff1a;工作强度大&#xff0c;技术含量低&#xff0c;没有归属感&#xff01;外包工作三年总体感受就是这份工作缺乏归属感&#xff0c;心里总有一种落差&#xff0c;进步空间不大&#xff0c;接触不到核心技术&#xf…

零基础如何学习项目管理?

零基础如何学习项目管理&#xff1f;我们可以从项目管理的思维、能力、工具、书籍阅读四个方面入手—— 1.项目管理的思维 &#xff08;1&#xff09;系统思考 项目管理需要从一个系统的角度来看待问题&#xff0c;将复杂的项目分解为小的部分进行管理&#xff0c;从而达到更…

Power BI 数据模型设计及搭建——星型模型雪花模型

前言 之前的笔记提到了《Power BI 数据模型的核心概念》&#xff0c;本文继续深入讨论数据模型的设计架构&#xff0c;同时介绍两种常用的数据模型&#xff1a;星型模型和雪花模型 BI 的数据模型和数仓模型有什么不同&#xff1f; 数据仓库和Power BI中使用的数据架构模型有一…

seaborn load_dataset报错的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

6000+字讲透ElasticSearch 索引设计

ElasticSearch 索引设计 在MySQL中数据库设计非常重要&#xff0c;同样在ES中数据库设计也是非常重要的 概述 我们创建索引就像创建表结构一样&#xff0c;必须非常慎重的&#xff0c;索引如果创建不好后面会出现各种各样的问题 索引设计的重要性 索引创建后&#xff0c;索引的…

Mac使用svn全教程(安装+命令操作项目)

Mac使用svn&#xff0c;包括安装以及命令检出项目提交项目&#xff0c;下面直接进入正题&#xff1a; 1.安装svn 首先Mac需要安装brew #安装brew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"图1: 图2: 图3: 如…