不均衡分类问题 之 class weight sample weight
分类问题中,当不同类别的样本量差异很大,即类分布不平衡时,很容易影响分类结果。因此需要进行校正。
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呢?
- 通过字典形式传入权重参数,如二分类问题y∈{0,1}y \in \{0,1\}y∈{0,1},class_weight={0:0.9, 1:0.1}
- 设置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来自己调节每个样本权重。
注意事项:
在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)
应用:做受众选择(人群扩展、人群定向)模型,若种子包括目标商品转化和行为用户(购买较少,加入线上加购、收藏作为正样本),可考虑加大转化用户的样本权重。
如果仅仅是类不平衡,则使用class_weight;
如果类内样本之间还不平衡,则使用sample_weights。如果class_weight选择balanced,那么类库会根据训练样本量来计算权重。某种类型样本量越多,则权重越低,样本量越少,则权重越高。
不均衡分类问题 之 class weight sample weight相关推荐
- 【机器学习】机器学习处理不均衡分类
在真实的场景中,不均衡的分类到处可见,比如大多数访客都不会单击"购买"按钮,大多数用户都不会付费成为"VIP",有些癌症或遗传病也是十分罕见的.因此,处理不 ...
- 【Pytorch神经网络理论篇】 34 样本均衡+分类模型常见损失函数
同学你好!本文章于2021年末编写,获得广泛的好评! 故在2022年末对本系列进行填充与更新,欢迎大家订阅最新的专栏,获取基于Pytorch1.10版本的理论代码(2023版)实现, Pytorch深 ...
- 面试官:说说你知道的几种负载均衡分类
负载均衡其实就是任务的分发,使得任务能按照你的预想分配到各个计算单元上,它能提高服务对外的性能,避免单点失效场景.这里要注意的一点是虽说叫负载均衡,但是有时候我们的分配算法就是不是均衡的. 比如配个n ...
- 【小夕精选】如何优雅而时髦的解决不均衡分类问题
之前小夕因项目需要研究了一小阵子的不均衡(文本)分类问题,不过没有研究的太过深入,也没有总结出一套成体系的处理思路.正好今天发现数据挖掘大佬「微调」在知乎上写了一个言简意赅又很具有实际操作价值的回答, ...
- 负载均衡算法--加权轮询法(Weight Round Robin)
接上一篇博文:负载均衡算法–轮询法(Round Robin),本文讲解加权轮询算法. 加权轮询算法:不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同.给配置高.负载低 ...
- 使用class weight和sample weight处理不平衡问题
https://blog.csdn.net/xpy870663266/article/details/104600054/
- java实现加权随机,负载均衡--加权随机算法(Weight Random)
加权随机法根据服务器的配置和系统的负载,分配不同的权重,按照权重随机请求后端服务器. 一.算法描述 假设有 N 台服务器 S = {S0, S1, S2, -, Sn},权重为 W = {W0, W1 ...
- 负载均衡--加权轮询算法(Weight Round)
加权轮询算法:不同的后端服务器,在机器的配置和当前系统的负载方面,可能并不相同.因此,它们的抗压能力也不相同.给配置高.负载低的机器配置更高的权重,让其处理更多的请求:给配置低.负载高的机器分配较低的 ...
- 分布式架构下的负载均衡技术:分类、原理、算法、常见方案
1.引言 关于"负载均衡"的解释,英文叫Load Balance,意思就是将请求或者数据分摊到多个操作单元上进行执行,共同完成工作任务. 负载均衡(Load Balance)建立在 ...
- 一篇读懂分布式架构下的负载均衡技术:分类、原理、算法、常见方案等
1.引言 关于"负载均衡"的解释,百度词条里:负载均衡,英文叫Load Balance,意思就是将请求或者数据分摊到多个操作单元上进行执行,共同完成工作任务. 负载均衡(Load ...
最新文章
- Spring Security 实战干货:OAuth2第三方授权初体验
- Latex字体加粗命令备忘
- drtek收音机使用说明_一百年前的便携式矿石收音机长啥样?这台1919年产品给你答案...
- 2020ICPC(小米邀请赛1) - Phone Network(线段树优化递推)
- 创建虚拟磁盘的小工具软件plainmaker.exe
- 这可能是史上最全 Redis 高可用解决方案总结
- 新塘单片机烧写器_NuMicro ICP Programming Tool-ICP Programming Tool(新唐单片机烧录工具)下载 v3.00.6909官方版--pc6下载站...
- matlab SVMtrain函数
- matlab得到小波参数,matlab小波分析去噪详解
- [Google标准文档]如何做好代码评审
- google关键词查询
- 【学习笔记】斯坦福大学公开课(机器学习) 之生成学习算法:朴素贝叶斯
- Spring Boot整合MyBatis框架(XML文件版)
- 介绍lookup函数十大常用的用法
- c++数组指针和指针数组详解
- js点击小图完成大图切换
- (三)mmclassification图像分类——模型训练
- 郑大计算机专业多少分,2020年,郑大各专业分数线公布,里面门道很多,给你们一一分析...
- Vue-cli3 创建项目
- Hadoop集群启动后利用Web界面管理HDFS
热门文章
- String 与 char* 相互转换
- 双碑零基础法语学习 学习法语要知道哪些法语常识?
- 我建议你自己写一个疫情数据监控
- 计算机网络应用基础总结,(完整版)计算机网络应用基础高教版对口高考复习资料总结...
- Visual studio系统找不到指定文件的解决办法
- MIUI的JAVA导出
- Linux下文件属性详解
- 程序人生 - 错过等一年!杭州人独属的惠民福利,还有最后三天
- encode()和decode()编码与解码的解析、常用编码与为何要encode和decode
- 因果分析.科学实验评估