分类问题中,当不同类别的样本量差异很大,即类分布不平衡时,很容易影响分类结果。因此需要进行校正。

sklearn的做法是加权,加权就要涉及到class_weight和sample_weight,当不设置该参数时,默认所有类别的权值为1。

类型权重 class_weight

字典类型,将类索引映射到权重值。对训练集里的每个类别加权,作用于损失函数(仅在训练过程中)。从而使模型更加关注样本数量少的类别。如果某类别的样本数多,那么它的权重就低,反之则权重就高.

应用场景
第一种是误分类的代价很高。比如对合法用户和非法用户进行分类,将非法用户分类为合法用户的代价很高,我们宁愿将合法用户分类为非法用户,这时可以人工再甄别,但是却不愿将非法用户分类为合法用户。这时,我们可以适当提高非法用户的权重class_weight={0:0.9, 1:0.1}。

第二种是样本是高度失衡的,比如我们有合法用户和非法用户的二元样本数据10000条,里面合法用户有9995条,非法用户只有5条,如果我们不考虑权重,则我们可以将所有的测试集都预测为合法用户,这样预测准确率理论上有99.95%,但是却没有任何意义。这时,我们可以选择balanced(scikit-learn 逻辑回归类库使用小结),让类库自动提高非法用户样本的权重。

参数设置
那么应该如何设置class_weight呢?

  1. 通过字典形式传入权重参数,如二分类问题y∈{0,1}y \in \{0,1\}y∈{0,1},class_weight={0:0.9, 1:0.1}
  2. 设置class_weight = 'balanced’
    此时,会自动调用from sklearn.utils.class_weight import compute_class_weight计算权重,平衡输入样本中各类别之间的权重。其计算公式为:
    weight=n_samples/(n_classes∗np.bincount(y))weight = n\_samples / (n\_classes * np.bincount(y))weight=n_samples/(n_classes∗np.bincount(y))
import numpy as npy = [0,0,0,0,0,0,0,0,1,1,1,1,1,1,2,2]  #标签值,一共16个样本a = np.bincount(y)  # array([8, 6, 2], dtype=int64) 计算每个类别的样本数量
aa = 1/a  #倒数 array([0.125     , 0.16666667, 0.5       ])
print(aa)from sklearn.utils.class_weight import compute_class_weight
class_weight = 'balanced'
classes = np.array([0, 1, 2])  #标签类别
weight = compute_class_weight(class_weight, classes, y)
print(weight) # [0.66666667 0.88888889 2.66666667]print(0.66666667*8)  #5.33333336
print(0.88888889*6)  #5.33333334
print(2.66666667*2) #5.33333334
# 这三个值非常接近
# 'balanced'计算出来的结果很均衡,使得惩罚项和样本量对应

这种方式在原始的损失函数的基础上乘以对应的sample_weight来计算最终的损失。这样计算而来的损失函数不会因为样本不平衡而被“推向”样本量偏少的类别中

样本权重 sample_weight

numpy权重数组。对每个样本加权(仅在训练过程中),思路和类别权重类似,即样本数多的类别样本权重低,反之样本权重高

应用场景
样本不平衡,导致样本不是总体样本的无偏估计,从而可能导致我们的模型预测能力下降。遇到这种情况,我们可以通过调节样本权重来尝试解决这个问题。调节样本权重的方法有两种,第一种是在class_weight使用balanced。第二种是在调用fit函数时,通过sample_weight来自己调节每个样本权重。

注意事项:

  1. 在sklearn中的逻辑回归时,如果上面两种方法都用到了,那么样本的真正权重是class_weight * sample_weight.
    原理:样本或类别的权重在训练模型最终通过损失函数实现(以逻辑回归为例):
    算法会把每个样本的训练损失乘以它的权重class_weight*sample_weight,损失函数为:

    J(θ)=−β∗ln⁡(θ)=−β∑i=1m(y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i))))J(\theta) =-\beta*\ln(\theta) = −\beta∑_{i=1}^m(y^{(i)}log(h_θ(x^{(i)}))+(1−y^{(i)})log(1−h_θ{(x^{(i)})}))J(θ)=−β∗ln(θ)=−β∑i=1m​(y(i)log(hθ​(x(i)))+(1−y(i))log(1−hθ​(x(i))))

    其中,β=(class_weight∗sample_weight)\beta = (class\_weight∗sample\_weight)β=(class_weight∗sample_weight)

    应用:做受众选择(人群扩展、人群定向)模型,若种子包括目标商品转化和行为用户(购买较少,加入线上加购、收藏作为正样本),可考虑加大转化用户的样本权重。

  2. 如果仅仅是类不平衡,则使用class_weight;
    如果类内样本之间还不平衡,则使用sample_weights。

  3. 如果class_weight选择balanced,那么类库会根据训练样本量来计算权重。某种类型样本量越多,则权重越低,样本量越少,则权重越高。

不均衡分类问题 之 class weight sample weight相关推荐

  1. 【机器学习】机器学习处理不均衡分类

      在真实的场景中,不均衡的分类到处可见,比如大多数访客都不会单击"购买"按钮,大多数用户都不会付费成为"VIP",有些癌症或遗传病也是十分罕见的.因此,处理不 ...

  2. 【Pytorch神经网络理论篇】 34 样本均衡+分类模型常见损失函数

    同学你好!本文章于2021年末编写,获得广泛的好评! 故在2022年末对本系列进行填充与更新,欢迎大家订阅最新的专栏,获取基于Pytorch1.10版本的理论代码(2023版)实现, Pytorch深 ...

  3. 面试官:说说你知道的几种负载均衡分类

    负载均衡其实就是任务的分发,使得任务能按照你的预想分配到各个计算单元上,它能提高服务对外的性能,避免单点失效场景.这里要注意的一点是虽说叫负载均衡,但是有时候我们的分配算法就是不是均衡的. 比如配个n ...

  4. 【小夕精选】如何优雅而时髦的解决不均衡分类问题

    之前小夕因项目需要研究了一小阵子的不均衡(文本)分类问题,不过没有研究的太过深入,也没有总结出一套成体系的处理思路.正好今天发现数据挖掘大佬「微调」在知乎上写了一个言简意赅又很具有实际操作价值的回答, ...

  5. 负载均衡算法--加权轮询法(Weight Round Robin)

    接上一篇博文:负载均衡算法–轮询法(Round Robin),本文讲解加权轮询算法. 加权轮询算法:不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同.给配置高.负载低 ...

  6. 使用class weight和sample weight处理不平衡问题

    https://blog.csdn.net/xpy870663266/article/details/104600054/

  7. java实现加权随机,负载均衡--加权随机算法(Weight Random)

    加权随机法根据服务器的配置和系统的负载,分配不同的权重,按照权重随机请求后端服务器. 一.算法描述 假设有 N 台服务器 S = {S0, S1, S2, -, Sn},权重为 W = {W0, W1 ...

  8. 负载均衡--加权轮询算法(Weight Round)

    加权轮询算法:不同的后端服务器,在机器的配置和当前系统的负载方面,可能并不相同.因此,它们的抗压能力也不相同.给配置高.负载低的机器配置更高的权重,让其处理更多的请求:给配置低.负载高的机器分配较低的 ...

  9. 分布式架构下的负载均衡技术:分类、原理、算法、常见方案

    1.引言 关于"负载均衡"的解释,英文叫Load Balance,意思就是将请求或者数据分摊到多个操作单元上进行执行,共同完成工作任务. 负载均衡(Load Balance)建立在 ...

  10. 一篇读懂分布式架构下的负载均衡技术:分类、原理、算法、常见方案等

    1.引言 关于"负载均衡"的解释,百度词条里:负载均衡,英文叫Load Balance,意思就是将请求或者数据分摊到多个操作单元上进行执行,共同完成工作任务. 负载均衡(Load ...

最新文章

  1. Spring Security 实战干货:OAuth2第三方授权初体验
  2. Latex字体加粗命令备忘
  3. drtek收音机使用说明_一百年前的便携式矿石收音机长啥样?这台1919年产品给你答案...
  4. 2020ICPC(小米邀请赛1) - Phone Network(线段树优化递推)
  5. 创建虚拟磁盘的小工具软件plainmaker.exe
  6. 这可能是史上最全 Redis 高可用解决方案总结
  7. 新塘单片机烧写器_NuMicro ICP Programming Tool-ICP Programming Tool(新唐单片机烧录工具)下载 v3.00.6909官方版--pc6下载站...
  8. matlab SVMtrain函数
  9. matlab得到小波参数,matlab小波分析去噪详解
  10. [Google标准文档]如何做好代码评审
  11. google关键词查询
  12. 【学习笔记】斯坦福大学公开课(机器学习) 之生成学习算法:朴素贝叶斯
  13. Spring Boot整合MyBatis框架(XML文件版)
  14. 介绍lookup函数十大常用的用法
  15. c++数组指针和指针数组详解
  16. js点击小图完成大图切换
  17. (三)mmclassification图像分类——模型训练
  18. 郑大计算机专业多少分,2020年,郑大各专业分数线公布,里面门道很多,给你们一一分析...
  19. Vue-cli3 创建项目
  20. Hadoop集群启动后利用Web界面管理HDFS

热门文章

  1. String 与 char* 相互转换
  2. 双碑零基础法语学习 学习法语要知道哪些法语常识?
  3. 我建议你自己写一个疫情数据监控
  4. 计算机网络应用基础总结,(完整版)计算机网络应用基础高教版对口高考复习资料总结...
  5. Visual studio系统找不到指定文件的解决办法
  6. MIUI的JAVA导出
  7. Linux下文件属性详解
  8. 程序人生 - 错过等一年!杭州人独属的惠民福利,还有最后三天
  9. encode()和decode()编码与解码的解析、常用编码与为何要encode和decode
  10. 因果分析.科学实验评估