不均衡样本权重的计算

数据挖掘中有时候会遇到不均衡样本,一种常用的方法是通过根据样本个数进行统计计算,或者根据业务场景人工计算权重。诸如sklearn的DT、RF等模型都设置了class_weight参数进行快速balanced;而XGB的fit中也有sampe_weight参数,只是需要手动提供每个样本对应权重的array,这里提供了一段简单的计算样本权重的代码。

"""
根据labels序列进行统计,生成对应的sample权重
或者根据指定的权重字典,生成对应的sample权重
"""
import numpy as np

def sample_weights_cal(labels, flag=0, class_weights=None):
    """
    :param labels: 样本label
    :param flag: 0-返回权重字典,1-返回labels同维的权重序列
    :return: 权重字典或权重序列
    """
    try:
        labels = np.array(labels)
    except TypeError:
        print("输入格式错误")
    assert labels.ndim == 1

    labels_set = set(labels)
    labels_value = list(labels_set)
    
    labels_count = np.array([(labels==l).sum() for l in labels_value])
    sample_ratio = labels_count.prod()/labels_count

    sample_ratio_std = sample_ratio / sample_ratio.sum()

    sample_weights_dict = {i: round(j, 4) for i, j in zip(labels_value, sample_ratio_std)}

    if not class_weights:
        if flag == 0:
            return sample_weights_dict
        else:
            sample_weights_info = np.zeros(shape=labels.shape)
            for i in range(sample_weights_info.shape[0]):
                sample_weights_info[i] = sample_weights_dict.get(labels[i])
            return sample_weights_info
    else:
        assert isinstance(class_weights, dict)    # 必须为字典
        assert flag==1   # 必须返回序列
        assert labels_set == set(class_weights.keys())
        class_weights_sum = np.array(list(class_weights.values())).sum()
        print(class_weights_sum)
        for key, value in class_weights.items():
            class_weights[key] = value/class_weights_sum

        sample_weights_info = np.zeros(shape=labels.shape)
        for i in range(sample_weights_info.shape[0]):
            sample_weights_info[i] = class_weights.get(labels[i])
        return sample_weights_info
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值