LR模型常见问题小议

article/2025/9/2 16:16:14

LR模型常见问题小议
标签: LR机器学习
671人阅读 评论(0) 收藏 举报
本文章已收录于:
分类:
作者同类文章 X

    目录(?)[+]

    1. 数据归一化
    2. 特征离散化组合
      1. 离散化
      2. 特征组合
      3. 小结
    3. 高纬度01特征
    4. 正负样本不均衡问题

    // 毕竟不是什么大牛,只是总结一下自己的一些认识和想法,如果有不正确的,还请大牛们斧正。

    经常说的2/8原则,LR肯定就是能解决80%问题中那20%的工具。所以LR还是值得好好研究的。发现以前对LR重视不够,总想着赶紧把其他算法也学了,才能拉小跟同事之间机器学习的gap。其实LR用得还是挺多的,而且效果还是不错的。一些高大上的算法,在公司这种大数据面前不一定跑得动,即使跑得动,效果也不一定好,而且还有可解释性和工程维护方面复杂度的问题。这倒是挺残酷的现实。

    发现学完coursera的机器学习课程后,离具体实践还是有不少距离,也没找到什么好的资料可以学习(如果谁发现有的话,麻烦告诉我一声吧),耳濡目染了一些奇技淫巧,总结一下,有一些其实之前的笔记也零散提到了。

    数据归一化

    仔细区分的话,有两种:

    1. 归一化: (x-最小值)/(最大值-最小值)
    2. 标准化: (x-平均数)/标准差

    反正就是把数据缩放到大小差不多,在1左右。这样起到的作用是加速迭代。根本原因其实是因为你偷懒,没有为每一个特征单独设置一个a。既然用了同一个a,那你也要保证数据scale也差不多。

    特征离散化&组合

    刚开始觉得,机器学习公司里有现成的包可以调用,然后把数据灌进去就好了,机器学习到底有啥搞头呢? 后来才搞明白,现实中,机器学习里面重要的一环其实就是搞“特征工程”,如果你对数据有足够的敏锐,能抽取出一些有效的特征,往往比算法本身的优化来得有效得多。怎么抽取特征这里就不多说,这里所说常见的特征处理方法:离散化和特征组合。

    离散化

    离散化就是把数值型特征离散化到几个固定的区间段。比如说成绩0-100,离散化成A、B、C、D四档,然后用4个01特征来one-hot编码,比如
    A为1,0,0,0
    B为0,1,0,0
    C为0,0,1,0
    D为0,0,0,1
    那第一位就表示是否为A,第二位表示是否为B……
    这里起到的作用就是减少过拟合,毕竟95和96分的两个学生能力不见得就一定有差别,但是A的学生跟D的比起来还是有明显差别的。其实就是把线性函数转换成分段阶跃函数了。

    另外一种,比如把汽车时速按10公里/小时之类的分一些档,就像这样:
    0-10
    10-20
    20-30
    ……

    如果现在我们想学习的目标是油耗

    这里以某款国内比较热销的车型做了下面的几项测试:
    120km/h匀速行驶时,油耗为7.81升/100km
    90km/h匀速行驶时, 油耗为5.86升/100km
    60km/h匀速行驶时, 油耗为4.12升/100km
    30km/h匀速行驶时 ,油耗为4.10升/100km

    显然油耗不是线性的,不离散化肯定不行。仔细想想,这样离散化之后,其实可以近似拟合任意函数了。

    特征组合

    特征组合就比较简单,比如现在有两个特征A和B,再新增一个A and B的特征。

    小结

    LR的劣势就是线性模型的线性假设过强,但我们发现通过上面这些trick,其实也可以学习”非线性“的特征,大大增强了LR的能力,所以LR才能这么流行。

    高纬度01特征

    就是one-hot编码,上面就用了。
    还有一个优点没提到,就是没有数据归一化(标准化)的问题。
    高纬度的特征我们一般不会存一个<特征名,下标值>这样一个hashmap,而是直接用
    哈希(特征名)%特征数
    以前还以为这样做是因为在算法预测能力上会有神奇的提升,结果不是,只是出于工程方便的考虑。
    好处只是少维护了一个索引,方便多了。当然,哈希冲突是有的,而且这个对算法是有害的,只不过冲突一般比较少,还hold得住。这里有个资料(http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.HashingVectorizer.html#sklearn.feature_extraction.text.HashingVectorizer)不错,说的是处理文本,其实对LR也一样。

    正负样本不均衡问题

    (注意这里只讨论LR,不要乱推广到其他算法)感觉怎么这问题有点像”玄学”了,坊间通用的说法是样本太不均衡是会有问题的,正负样本比例多大合适? 一些经验主义的说法是顶多负样本是正样本的几(5以内吧)倍。
    这问题的分析,显然要从loss function入手。
    假设现在负样本复制多一份,从loss function的角度看来,就是负样本的cost前面乘以2,这个2其实可以当做负样本的权重。所以,谁样本多,谁占的权重其实就大一些。要看看loss function的优化目标是不是跟你的目标一致,如果正负样本对你来说一样重要,那可以不用管,但通常都不是,所以是个问题。通常情况都是比较少的样本反而比较重要的,这真是一个大问题。假设正负样本是1:1w,你关心的是正样本,直接学出来的模型可能就直接把样本全判别为负样本。但这显然不是你想要的结果。

    像我这样的懒人,直觉是觉得保持1:1最好,或者说至少没坏处。那通常采用的方法就是up-sampling或者down-sampling,具体操作方法很简单,少的样本复制多份,或者多的样本只抽样一些。但我感觉前者容易过拟合,后者数据利用得又不够充分。难道咸鱼与熊掌就不可得兼?后来某大牛指点了一下,告诉我一个简单的trick:

    用down-sampling,然后采样多次,训练多个模型,跟随机森林一样,求个平均即可

    这里还有另外一个问题,我们知道LR学出来是一个概率值,样本不均衡,我们调一下阈值不就行了么?比如从原来的0.5调整到0.3,这样就会多判断一些正样本,唯一的问题就是样本不均衡时候的分类边界跟均衡时的边界平行么?
    好吧,作为一个懒惰的“工程学派”,懒得去推到公式从理论上去证明,还是来做个直观的实验吧。

    用R语言来做。我知道用R比较简单,但是R本身我不熟,还要google一番+?<函数名> 命令,勉强还是把代码撸出来了。代码逻辑很简单,自己定好一个斜率K=5,然后在边界上下生成一些随机数,高斯分布,均匀分布都可以。

    <code class="language-r hljs  has-numbering">
    LABEL_1_NUM <- <span class="hljs-number">100</span>
    LABEL_0_NUM <- <span class="hljs-number">100</span>K <- <span class="hljs-number">5</span>x1 <-runif(LABEL_1_NUM, <span class="hljs-number">0</span>, <span class="hljs-number">10</span>)
    x2 <-runif(LABEL_0_NUM , <span class="hljs-number">0</span>, <span class="hljs-number">10</span>)D <-<span class="hljs-number">1</span>
    x2 <- rep(x2,D)
    Y <- c( x1* K + rnorm(LABEL_1_NUM, mean=<span class="hljs-number">15</span>, sd=<span class="hljs-number">19</span>), x2 * K + rnorm(LABEL_0_NUM, mean=-<span class="hljs-number">15</span>, sd=<span class="hljs-number">19</span>) )
    <span class="hljs-comment">#Y <- c( x1* K + runif(LABEL_1_NUM, min=-15, max=50), x2 * K + runif(LABEL_0_NUM, min=-50, max=15) )</span>X <- c( x1, x2 )
    label <- as.factor( c(rep(<span class="hljs-number">1</span>,LABEL_1_NUM), rep(<span class="hljs-number">0</span>,LABEL_0_NUM*D) ) )data <- data.frame(X,Y, label)model <- glm(label~Y+X, data=data, family=<span class="hljs-string">'binomial'</span>, control = list(maxit = <span class="hljs-number">600</span>))plot( data$X , data$Y , type=<span class="hljs-string">"p"</span>, pch=<span class="hljs-number">19</span>, col=<span class="hljs-string">"red"</span>)
    points( data$X[ data$label==<span class="hljs-number">1</span>], data$Y[ data$label==<span class="hljs-number">1</span>], type=<span class="hljs-string">"p"</span>, pch=<span class="hljs-number">19</span>, col=<span class="hljs-string">"blue"</span>)
    points( data$X[ data$label==<span class="hljs-number">0</span>], data$Y[ data$label==<span class="hljs-number">0</span>], type=<span class="hljs-string">"p"</span>, pch=<span class="hljs-number">19</span>, col=<span class="hljs-string">"red"</span>)
    co = coef(model)
    lines(c(<span class="hljs-number">0</span>,<span class="hljs-number">100</span>),c(-co[<span class="hljs-number">1</span>]/co[<span class="hljs-number">2</span>], -(co[<span class="hljs-number">1</span>]+co[<span class="hljs-number">3</span>]*<span class="hljs-number">100</span>)/co[<span class="hljs-number">2</span>]), type=<span class="hljs-string">"l"</span>, col=<span class="hljs-string">'green'</span>, lwd=<span class="hljs-number">3</span>)print(co)
    <span class="hljs-comment">#截距</span>
    print(-co[<span class="hljs-number">1</span>]/co[<span class="hljs-number">2</span>])
    <span class="hljs-comment">#斜率</span>
    print(-co[<span class="hljs-number">3</span>]/co[<span class="hljs-number">2</span>])
    </code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a target=_blank href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li></ul>

    1:1
    正负 100:100

    1:10
    正负 100:1000

    有点遗憾,采样多次取平均,斜率居然都是5左右。后来想想,负样本多的时候,其实正样本都不用怎么看了,而负样本形成的带状物,边缘斜率肯定也是接近5。
    改变方法,负样本生成的时候斜率改成-K,然后标准差调大一些。这样分类边界应该是Y=0。
    100:100

    100:1000
    注意,一定要多抽样几次。能发现,负样本多的话,边界还是会向下偏一些的(至少比1:1的时候。 斜率 (-∞, -1] vs [-1,1] )。这个问题能举一个反例证明就够了。注意这里为了方便展示,取的只有2维,高维的就更不好说了。不过这里还发现,边界向下其实偏离得不会特别大,LR还是有一些容错能力的,但比赛的话,能提升0.5%都已经很不错了。


    http://chatgpt.dhexx.cn/article/Unu4BWAJ.shtml

    相关文章

    信用评分卡(A卡) 基于LR模型的数据处理及建模过程

    数据来自&#xff1a;魔镜杯风控算法大赛&#xff08;拍拍贷&#xff09;。有关数据的具体描述可以看比赛页面。 0. 数据集的关键字段及描述&#xff1a; Master&#xff1a;每一行代表一个样本&#xff08;一笔成功成交借款&#xff09;&#xff0c;每个样本包含200多个各类…

    机器分类---LR分类+模型评估

    文章目录 数据集ROC曲线与AUC理论知识曲线理解实例计算 代码 更详细的数据集介绍&#xff08;有图形分析&#xff0c;应该比较好理解&#xff09; https://blog.csdn.net/weixin_42567027/article/details/107416002 数据集 数据集有三个类别&#xff0c;每个类别有50个样本。…

    python机器学习算法(赵志勇)学习笔记( Logistic Regression,LR模型)

    Logistic Regression(逻辑回归) 分类算法是典型的监督学习,分类算法通过对训练样本的学习,得到从样本特征到样本的标签之间的映射关系,也被称为假设函数,之后可利用该假设函数对新数据进行分类。 通过训练数据中的正负样本,学习样本特征到样本标签之间的假设函数,Log…

    推荐系统实战中LR模型训练(二)

    背景&#xff1a; 上一篇推荐系统实战中LR模型训练&#xff08;一&#xff09; 中完成了LR模型训练的代码部分。本文中将详细讲解数据准备部分&#xff0c;即将文本数据数值化为稀疏矩阵的形式。 文本数据&#xff1a; 稀疏矩阵&#xff1a; 实现过程&#xff1a; 文本数据格…

    机器学习 | LR逻辑回归模型

    逻辑回归(Logistic Regression,简称LR)名为“回归”却是用来分类工作、在线性数据上表现优异的分类器。 视频教程:第07讲:逻辑回归是线性分类器的佼佼者 LR是数据挖掘领域常用的一种分类模型,常用于解决二分类问题,例如垃圾邮件判定、经济预测、疾病诊断(通过年龄、性…

    推荐系统实战中LR模型训练(一)

    背景&#xff1a; 在“批量导入数据到Redis” 中已经介绍了将得到的itema item1:score1,item2:score2…批量导入到Redis数据库中。本文的工作是运用机器学习LR技术&#xff0c;抽取相应的特征&#xff0c;进行点击率的估计。 点击率&#xff08;Click-Through-Rate, CTR&#…

    Prometheus TSDB存储原理

    Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https://blog.csdn.net/m0_56069948/article/details/122285941 Prometheus 包含一个存储在本地磁盘的时间序列数据库&#xff0c;同时也支持与远程…

    数据库必知必会:TiDB(8)TiDB 数据库 SQL 执行流程

    数据库必知必会&#xff1a;TiDB&#xff08;8&#xff09;TiDB 数据库 SQL 执行流程 数据库 SQL 执行流程DML语句读流程概述SQL的Parse与CompileSQL的Execute DML语句写流程概述执行 DDL语句流程概要执行 知识点回顾 数据库 SQL 执行流程 在TiDB中三个重要组件&#xff1a; …

    时不我待,TSDB崛起正当时

    近期有小伙伴问Jesse&#xff0c;为什么你们要在现在这个时点做TSDB&#xff0c;这是个好时点吗&#xff1f;我认为这是个挺好的问题&#xff0c;因为再强的个人也比不上一个团队&#xff0c;再牛的团队也需要顺势而为。我们其实一直在深度思考“Why Now”的问题&#xff0c;因…

    时间序列数据库TSDB排名

    DB-Engines 中时序列数据库排名 我们先来看一下DB-Engines中关于时序列数据库的排名&#xff0c;这是当前&#xff08;2016年2月的&#xff09;排名情况&#xff1a; 下面&#xff0c;我们就按照这个排名的顺序&#xff0c;简单介绍一下这些时序列数据库中的一些。下面要介绍的…

    TiDB Server

    目录 TiDB Server架构 Online DDL GC 缓存管理 热点小表缓存 例题 TiDB Server架构 Protocol Layer&#xff1a;负责处理客户端的连接 Parse&#xff0c;Compile&#xff1a;负责SQL语句的解析与编译&#xff0c;并生成执行计划 Executor&#xff0c;DistSQL&#xff0…

    Prometheus TSDB

    TSDB 概述&#xff1a; Head: 数据库的内存部分 Block: 磁盘上持久块&#xff0c;是不变的 WAL: 预写日志系统 M-map: 磁盘及内存映射 粉红色框是传入的样品&#xff0c;样品先进入Head中存留一会&#xff0c;然后到磁盘、内存映射中&#xff08;蓝色框&#xff09;。然后当内…

    TiDB体系结构之TiDB Server

    TiDB体系结构之TiDB Server TiDB ServerTiDB Server主要组成模块SQL语句的解析和编译行数据与KV的转化SQL读写相关模块在线DDL相关模块TiDB的垃圾回收TiDB Server的缓存 TiDB Server TiDB Server的主要作用如下&#xff1a; 处理客户端连接SQL语句的解析和编译关系型数据与KV…

    TSDB助力风电监控

    各位小伙伴大家好&#xff0c;本期Jesse想再来跟大家聊聊TSDB的应用场景&#xff0c;在此也感谢尹晨所著的《时序数据库在风电监控系统中的应用》一文&#xff0c;其为我们探究TSDB在风电系统中的应用提供了重要的帮助。 本文仅代表个人观点&#xff0c;如有偏颇之处&#xff…

    dbt-tidb 1.2.0 尝鲜

    作者&#xff1a; shiyuhang0 原文来源&#xff1a; https://tidb.net/blog/1f56ab48 本文假设你对 dbt 有一定了解。如果是第一次接触 dbt&#xff0c;建议先阅读 官方文档 或 当 TiDB 遇见 dbt 本文中的示例基于官方维护的 jaffle_shop 项目。关于此项目的细节介绍&a…

    为啥用 时序数据库 TSDB

    前言 其实我之前是不太了解时序数据库以及它相关的机制的&#xff0c;只是大概知晓它的用途。但因为公司的业务需求&#xff0c;我意外参与并主导了公司内部开源时序数据库influxdb的引擎改造&#xff0c;所以我也就顺理成章的成为时序数据库“从业者”。 造飞机的人需要时刻…

    Prometheus 学习之——本地存储 TSDB

    Prometheus 学习之——本地存储 TSDB 文章目录 Prometheus 学习之——本地存储 TSDB前言一、TSDB 核心概念二、详细介绍1.block1&#xff09;chunks2&#xff09;index3&#xff09;tombstone4&#xff09;meta.json 2.WAL 总结 前言 Prometheus 是 CNCF 收录的第二个项目&…

    阿里云IoT物模型上报数据流转到实例内TSDB

    阿里云物联网平台上存储的数据最多为30天&#xff0c;为了能让数据永久保存下来&#xff0c;就需要把物联网平台的数据流转到其他的数据库&#xff0c;对于企业版实例&#xff0c;内部有一个实例内的时空数据库TSDB&#xff0c;正好可以利用。下边就介绍一下物联网平台的物模型…

    使用TSDB自动检测时序数据的异常情况

    本期Jesse就带大家来继续了解一下TSDB的应用问题&#xff0c;小伙伴们&#xff0c;让我们直接步入正题吧。 本文仅代表个人观点&#xff0c;如有偏颇之处&#xff0c;还请海涵&#xff5e; 现今&#xff0c;每天都有数千亿个传感器产生大量时序数据。公司收集大量数据使得分析…

    TSDB 存储引擎介绍

    本文介绍 DolphinDB 在2.0版本中新推出的存储引擎 TSDB。 1. OLAP 与 TSDB 适用的场景 OLAP 是 DolphinDB 在2.0版本之前的唯一存储引擎。数据表中每个分区的每一列存为一个文件。数据在表中的存储顺序与数据写入的顺序一致&#xff0c;数据写入有非常高的效率。 OLAP 引擎的…