分类机器学习中,某一标签占比太大(标签稀疏),如何学习?

链接:https://www.zhihu.com/question/372186043

编辑:深度学习与计算机视觉

声明:仅做学术分享,侵删

假设10000个数据,有100个1,200个2,其余全是0,这种数据如何建模,普通模型会倾向所有数据都标注成0。

batch抽样学习,每次从数据中抽样,比如每次抽32个数据训练,16个0,8个1,8个2,丢到模型里面训练,这么做可以吗?

作者:予以初始

https://www.zhihu.com/question/372186043/answer/1393735908

1.问题定义

这是典型的数据类型不平衡问题。比如对于一个二分类任务,训练集中类别为0的负样本占样本总数的90%,而正样本只占10%。那么这样的训练集有什么弊端呢?

如果类别不平衡的样本直接丢给模型学习,那么很显然模型会在负样本上的学习效果更好,因为模型‘看到’的负样本更多。举个栗子,就像你如果花9天时间去学习数学,花一天时间去学习语文,不出意外你会在数学考试中表现更好。

那么对于类别不平衡的训练集,该如何处理呢?

做过视频或者广告点击预估比赛的小伙伴应该经常遇到这种问题,这类比赛的训练集一般都是非常不平衡的,正样本的比例通常不足10%。这里我总结了一些在比赛中用过的一些行之有效的处理方法,下面为大家逐一介绍。

Tips:是不是类别平衡的训练集就一定更好呢?这个不能保证,但对于大多数情况,类别平衡的数据对模型来说是更友好的,至少模型不会倾向于数量多的那一类别。

2.解决方法

2.1 采样

这是解决数据类别不平衡的最简单、最暴力的方法。

如果负样本太多,那就对负样本进行欠采样,就是随机的从负样本中抽取一部分样本,然后与正样本合并成训练集丢给模型训练。这样有个很明显的弊端,就是会造成严重的信息损失,数据收集不易,你还要丢弃一部分,很显然不合理。

如果正样本太少,那就对正样本进行过采样,就是对正样本进行复制,或者如果是NLP、CV任务,可以做一些数据增强,以此来增加正样本的数量。但是对于一般的任务来说,简单的对正样本进行复制,以此来达到增加正样本数量的目的,这样会使模型在这正样本上过拟合,因为模型‘看到’太多次这样的样本。就像你如果复习同一道题太多次,答案都背住了,所以看到类似的题就直接写答案,不会变通显然是不对的。

所以采样的方法不是解决类别不平衡问题的权宜之计,慎用

2.2 SMOTE方法

上面介绍了对正样本进行过采样,会使模型过拟合的问题,SMOTE也是基于采样的方法,但是SMOTE可以降低过拟合的风险。

过采样是直接对样本进行复制,导致训练集重复样本太多,而SMOTE则不是直接复制,而是生成与正样本相似并且训练集中没有的样本。具体做法:首先随机选取一个正样本,然后用K近邻选取一个与其最相似的样本,取两样本的中值或者均值,作为新样本。这样生成的样本可一定程度降低模型过拟合的风险 (仍然可能过拟合) 。

Tips:如果你对K近邻有些陌生,可以参考我的这篇文章做个简单的回顾。https://zhuanlan.zhihu.com/p/160800727

2.3 阈值调整

调整阈值也是比较简单而且有效的方法,这也是我在做比赛时经常会用到的方法。

对于二分类任务来说,一般会以0.5作为阈值来划分正负样本(比如逻辑回归),预测概率值大于0.5则判定为正样本,反之为负样本。对于类别不平衡的训练集来说,这个阈值就不再合适了,因为当使用负样本来更新模型权重时,权重的更新会使模型的输出尽量偏向于0,如果负样本太多,那么负样本对于模型权重的更新量就比较多,使得模型输出接近0的概率就比较大,所以可以根据正负样本所占的比例来调整阈值。比如正样本只占10%,则可以将阈值调整为0.1,输出概率大于0.1的则判定为正样本,这样可以很好的解决类别不平衡问题,调整阈值是个简单且高效的方法。

感谢评论区馒头对解决方法的补充:可以在计算每个样本的loss时,通过为正样本增加权重的方式,来优化样本不平衡问题。该方法原理跟划分阈值类似,正样本对权重的更新会使模型输出尽可能偏向于1,但是正样本太少,所以一方面可以降低划分为正样本的阈值,另一方面则可以在计算loss时,增加正样本权重,从而增大正样本对模型参数的更新量,提高模型输出为1的概率。

2.4 模型融合

模型融合不仅可以提升预测的准确性,其实也可以解决类别不平衡问题。

比如对于正样本(10%)、负样本(90%)的训练集,可以将负样本均等拆分为9份(注意一定要同分布拆分),然后每一份都与正样本组合成为一个小训练集,得到9份类别平衡的数据。然后用9个模型分别去训练(可以使用有差异性的模型, 使预测精度更高),然后可以对9个模型的预测结果加权累加,作为最终的输出。最优的权重通常难以抉择,可以使用一个LR将9个模型的输出作为输入,通过训练让模型自己学习每个模型对应的权重即可。

通过模型融合就可以保证每个模型的训练数据都是类别平衡的数据,并且还能提升预测的准确性,一举两得。

Tips:做一个小小的总结,方法一简单粗暴,方法二复杂、收益低,方法三和四是我最常用到的两种,简单且高效。当你遇到类别不平衡的数据时,可以参照以上几种方法进行尝试,至于哪种方法更有效还得通过实践来证明。

作者:莫名
https://www.zhihu.com/question/372186043/answer/1043490391

有些方案又老又长,捡些有用的写吧。

多类单标签的不平衡问题

常见两个方向

1.构造数据集。比如用半监督或度量学习做筛选/辅助标签,大概率会比简单的按数量比例要好一些。

2.设计loss /loss weight,注意 细粒度,优化内容

其它方案比如数据合成,GAN生成新样本,我们做过实验,没有明显提高,或者和强数据增强的效果差不多,但是成本就很高啦;多模型在工业项目是不划算的/没有产品竞争力的,单模型都得各种修剪。当然这有个前提,哪怕是一个很小的任务,数据总量都得在百万级。否则,您要试验的方法可多得去了,而且并不能超过数据量上升带来的收益。

如果是极端不平衡

考虑 异常检测的思路


作者:苏冠旭 https://www.zhihu.com/question/372186043/answer/1140392823

针对样本不均衡问题,我专门做过试验。一句话概括:随机森林、GBDT等集成学习方法能够显著提高F1,而上抽样、下抽样、SMOTE等方法,在集成学习面前基本没用。

作者:打铁烧砖
https://www.zhihu.com/question/372186043/answer/1502141503

这是一个经常会在各类明星公司的AI,机器学习以及数据面试中出现的问题。

很多答主都谈了一些比较新的方法。而最基本的三种方法可以归纳如下(面试的一个比较基本的答案):

1.欠采样(under-sampling),去除一些反例。

2.过采样,up-samplinh增加一些正例。比如data augmentation等方法。很多答主提到的SMOTE就是这种方法的典型代表。

3.第三种方法叫阈值移动(threshold-moving),不动原始数据集,对预测值进行一些调整,也就是对算法本身进行一些改动。这方面也有不少的一些算法。比如有改版的SVM以及ensemble learning。在现在的其他一些研究领域比如AI的公平性研究(比如避免在银行贷款算法中出现根据肤色来决定是否贷款的情况),类似的改动算法本身的参数的思想也有很大应用。

作者:Ming
https://www.zhihu.com/question/372186043/answer/1182965574

分享一个面试题中的回答:

面试DS的职位的时候,被面试官问道。回答了上采样下采样之后,面试官追问,没有回答的很好(掩面)。然后面试官的回答是,在业内里面,假如遇到了这种太稀疏的情况,可以构建一个白噪声的分布,比如说 ,然后加上原数据构建新的数据来让整体的数据变得平衡。或者用别的标准来看模型的好坏,比如说F1-Score。


作者:Yiiiiiii
https://www.zhihu.com/question/372186043/answer/1149397361

个人觉得,高维不平衡数据集,就机器学习方法来说,ensemble+集成学习是个不错的方案。还有现成的库可以用。

我在跑一个不平衡数据集的时候,用的是imblearn的balancedbaggingclassifier(),和balancedRandomforest()效果相当好。

对于一个分布不明的数据集,建议不要过采样。而ensemble方法可以保证欠采样也不丢失信息。

作者:Xiecheng
https://www.zhihu.com/question/372186043/answer/1056969532

补充下其他需要注意的地方。

如果是binary问题,需不需要做再平衡,取决于两点,1.你的建模或者实验目的;2.你的检验结果。不同的模型,对于非平衡标签的容忍度是不一样的。多做几轮实验,看下under sampling, over sampling 或者smote这类拟合仿真数据的方法下,检验结果的好坏,这个没有统一的标准。重抽样不是必须的。

如果是multiclass的问题,我会建议必须做再平衡。因为这类问题通常需要模型回答正确分到哪个类。不做平衡容易导致结果倾斜到一个类上。

Binary有一些不同。除了回答正确分类之外,也会经常用输出的概率解决排序问题。

作者:adam86546853
https://www.zhihu.com/question/372186043/answer/1152217557

目前工业界的角度来看,保留数据的原始分布是最可靠的,大厂基本都是拟合原始分布,一般不太会去采样。自己原先也做过相关采样实验,会有信息损失,auc在千分点损失在实际线上效果都是可反映的。由于样本多,所以一般是加大模型复杂度,nn模型增大特征规模,尽量拟合真实分布。当然也有各种采样理论以及修正,如果不计较精度,可以权衡准度和样本规模。


作者:磐石
https://www.zhihu.com/question/372186043/answer/1432241043

楼主的想法实际可以尝试看看效果。技术层面很多楼主回答很详细了,我就不在说了。从学习的角度来说,如果比较少的样本存在这个标签对应的模式,那么使用一些学习技术很有意义。如果少量的样本中无法学习得到这个标签的模式,那么意义也不大,因为可能网络拟合的只是记忆样本,无法学习到对应的范式,这样泛化效果也不会好。

☆ END ☆

如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 mthler」,每日朋友圈更新一篇高质量博文。

扫描二维码添加小编↓

<think>好的,我现在需要回答用户的问题:“对稀疏数据优先使用MaxAbsScaler”。首先,我要理解用户的问题到底在问什么。用户可能是在数据处理或机器学习的数据预处理阶段遇到了问题,想知道为什么在处理稀疏数据时应该优先选择MaxAbsScaler而是其他标准化方法,比如MinMaxScaler或者StandardScaler。 首先,我需要回忆稀疏数据的特点。稀疏数据通常指的是数据矩阵中有大量的零元素,非零元素比较少。比如,经过独热编码后的数据就是个典型的稀疏矩阵。这种情况下,数据维度可能很高,但大部分位置都是零。处理这样的数据时,保持其稀疏性是很重要的,因为转换成密集矩阵会用大量内存,计算效率也会降低。 接下来,我需要了解MaxAbsScaler的工作原理。MaxAbsScaler是scikit-learn中的个数据预处理工具,它通过每个特征的最大绝对值来缩放数据。具体来说,每个特征的值会被除以该特征的最大绝对值,使得数据范围落在[-1, 1]之间。这种方法的个特点是它会移动/平移数据,也就是会改变数据的中心点(均值),只是进行缩放。这对于稀疏数据来说非常重要,因为平移操作可能会将大量的零值转换为非零值,从而破坏数据的稀疏性。 现在,我需要比较其他常见的标准化方法,如StandardScaler和MinMaxScaler,看看它们在处理稀疏数据时可能存在的问题。StandardScaler通过减去均值然后除以标准差来标准化数据,这会导致数据的均值为0,标准差为1。然而,减去均值会将数据平移,这会导致原本为零的值变成非零,从而增加数据的密度,破坏稀疏性。这对于高维稀疏数据来说是可取的,因为会导致内存使用激增,计算效率下降。 MinMaxScaler则是将数据缩放到个指定的范围(通常是[0, 1]),通过减去最小值然后除以范围(最大值减最小值)。同样,减去最小值也会导致数据平移,从而破坏稀疏性。此外,如果某个特征的最小值为0(这在稀疏数据中很常见,因为很多特征可能大部分时间都是0),那么MinMaxScaler可能会带来太大问题,但如果最小值是0,同样会导致零值变为非零。 因此,MaxAbsScaler的优势在于它仅进行缩放而进行平移,保持零值的位置变,从而维持了数据的稀疏结构。这对于保持计算效率和内存使用非常关键,尤其是在处理高维稀疏数据时。 接下来,我需要验证这个理解是否正确。查阅scikit-learn的官方文档,可以看到MaxAbsScaler确实被推荐用于稀疏数据,因为它会破坏数据的稀疏性。而StandardScaler和MinMaxScaler在处理稀疏数据时,如果设置了with_mean=True(默认值),就会进行中心化,导致数据变得密集。虽然在某些情况下可以通过设置with_mean=False来避免中心化,但这可能符合标准化方法的初衷。 此外,还需要考虑实际应用中的例子。例如,在文本处理中使用TF-IDF向量化后的数据通常是稀疏的,使用MaxAbsScaler可以在增加内存消耗的情况下进行特征缩放,而使用其他方法可能导致内存足或计算速度大幅下降。 过,可能还存在些特殊情况或例外情况需要考虑。例如,如果稀疏数据中存在大量的离群值,MaxAbsScaler可能会受到这些离群值的影响,因为它基于最大值进行缩放。这时候可能需要其他处理方法,比如RobustScaler,但它同样涉及到中心化和缩放,可能适合稀疏数据。因此,在处理稀疏数据时,需要权衡同的缩放方法及其影响。 总结下,用户的问题“对稀疏数据优先使用MaxAbsScaler”的核心原因在于MaxAbsScaler在缩放过程中进行数据平移,保持了稀疏数据的结构,避免了内存和计算资源的浪费。而其他常见的标准化方法由于涉及中心化(平移)操作,会导致稀疏数据变得密集,从而引发效率和内存问题。</think>--- ### **、直接结论** **是的,对稀疏数据优先使用 `MaxAbsScaler`**。其核心优势在于破坏稀疏结构(保持零值变),同时避免因中心化(如均值平移)导致内存爆炸和计算效率下降。 --- ### **二、稀疏数据的特点与挑战** #### 1. **稀疏数据的本质** - 矩阵中**零元素比极高**(如独热编码、TF-IDF向量化后的数据); - 典型结构: $$ \begin{bmatrix} 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 1 & 0 & 0 & 0 \\ \end{bmatrix} $$ - 高维特征(如文本分类中的词表维度可达 $10^6$ 级)。 #### 2. **关键需求** - **保持稀疏性**:避免将零值转换为非零值; - **内存高效**:防止因数据密集化导致存储开销剧增; - **计算高效**:支持稀疏矩阵的快速运算。 --- ### **三、MaxAbsScaler 的核心原理** #### 1. **数学定义** - 对每个特征列独立操作,缩放公式为: $$ x_{\text{scaled}} = \frac{x}{|x_{\text{max}}|} $$ 其中 $|x_{\text{max}}|$ 是该特征列的**最大绝对值**。 - **结果范围**:$[-1, 1]$。 #### 2. **稀疏兼容性** - **无平移操作**:仅缩放,改变零值位置; - **保留稀疏结构**:零元素仍为 $0$,非零元素按比例压缩; - **示例**: 原始稀疏特征值 $[0, -3, 0, 2]$,缩放后为 $[0, -1, 0, 0.666]$。 --- ### **四、对比其他Scaler的局限性** #### 1. **StandardScaler(标准化)** - **公式**: $$ x_{\text{scaled}} = \frac{x - \mu}{\sigma} $$ - **问题**: - 计算均值 $\mu$ 时,零值参与计算,导致非零值被稀释; - 平移操作($- \mu$)会将零值变为非零,破坏稀疏性; - **数据变化示例**: 原始 $[0, 0, 5, 0]$ → 均值 $\mu=1.25$ → 缩放后 $[-0.25, -0.25, 3.75, -0.25]$(所有零值变为非零)。 #### 2. **MinMaxScaler(归化)** - **公式**: $$ x_{\text{scaled}} = \frac{x - x_{\text{min}}}{x_{\text{max}} - x_{\text{min}}} $$ - **问题**: - 平移操作($-x_{\text{min}}$)同样破坏稀疏性; - 若 $x_{\text{min}} \neq 0$(如负值特征),零值被转换为非零值; - **数据变化示例**: 原始 $[0, 0, 5, 0]$ → $x_{\text{min}}=0$,$x_{\text{max}}=5$ → 缩放后 $[0, 0, 1, 0]$(此时未破坏稀疏性,但若存在负值则失效)。 #### 3. **核心区别总结** | Scaler | 是否平移数据 | 是否保持稀疏性 | 适用场景 | |------------------|--------------|----------------|----------------------| | MaxAbsScaler | 否 | 是 | 稀疏数据、含负值特征 | | StandardScaler | 是 | 否 | 密集数据、正态分布 | | MinMaxScaler | 是(可能) | 否(通常) | 密集数据、固定范围 | --- ### **五、实际应用验证** #### 1. **Python代码示例** ```python from sklearn.preprocessing import MaxAbsScaler import scipy.sparse as sp # 创建稀疏矩阵(CSR格式) X_sparse = sp.csr_matrix([[0, -3, 0], [0, 0, 2], [1, 0, 0]]) # 使用MaxAbsScaler scaler = MaxAbsScaler() X_scaled = scaler.fit_transform(X_sparse) print("缩放后矩阵(仍为稀疏格式):\n", X_scaled.toarray()) print("各列最大绝对值:", scaler.max_abs_) ``` **输出**: ``` 缩放后矩阵(仍为稀疏格式): [[ 0. -1. 0. ] [ 0. 0. 1. ] [ 1. 0. 0. ]] 各列最大绝对值: [1. 3. 2.] ``` #### 2. **内存用对比** | 数据形态 | 原始稀疏矩阵 | 经StandardScaler处理 | 经MaxAbsScaler处理 | |-------------------|--------------|-----------------------|---------------------| | 存储格式 | CSR | 密集矩阵 | CSR | | 内存用(示例) | 10MB | 1GB | 10MB | --- ### **六、使用场景与注意事项** #### 1. **推荐场景** - **文本分类**:TF-IDF向量化后的稀疏词袋矩阵; - **推荐系统**:用户-物品交互矩阵(大量零交互记录); - **高维分类特征**:独热编码后的类别特征。 #### 2. **注意事项** - **离群值敏感**:若某特征存在极端值(如 $|x|=1000$),缩放后其他值会被压缩到接近 $0$; - **负值处理**:MaxAbsScaler可处理含负值的稀疏数据(如情感分析中的词频统计); - **与模型兼容性**:树模型(如XGBoost)对缩放敏感,但线性模型(如逻辑回归)依赖特征缩放。 --- ### **七、替代方案** 1. **稀疏数据缩放** - 部分算法(如朴素贝叶斯)对特征尺度敏感,可直接使用原始稀疏矩阵。 2. **哈希分桶(Hashing Trick)** - 在特征编码阶段限制维度,间接降低后续缩放的计算压力。 3. **自定义稀疏缩放器** - 针对业务需求实现仅对非零值缩放的逻辑(需谨慎验证数学合理性)。 --- **总结**:`MaxAbsScaler` 是处理稀疏数据的首选缩放器,通过避免平移操作保留稀疏性,同时提供高效的内存和计算性能。在实际工程中,应始终优先检查数据稀疏性,并根据算法需求选择合适的预处理方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值