欠采样(undersampling)和过采样(oversampling)

 

当二分类数据不均衡时会影响模型的输出,此时需要对数据进行处理。

1:为什么类别不平横会影响模型的输出:

许多模型的输出类别是基于阈值的,例如逻辑回归中小于0.5的为反例,大于则为正例。在数据不平衡时,默认的阈值会导致模型输出倾向与类别数据多的类别。

因此可以在实际应用中,解决办法包括:

1)调整分类阈值,使得更倾向与类别少的数据。

2)选择合适的评估标准,比如ROC或者F1,而不是准确度(accuracy)

3)过采样法(sampling):来处理不均衡的问题。分为欠采样(undersampling)和过采样(oversampling)两种,

过采样:重复正比例数据,实际上没有为模型引入更多数据,过分强调正比例数据,会放大正比例噪音对模型的影响。

欠采样:丢弃大量数据,和过采样一样会存在过拟合的问题。

由于随机过采样采取简单复制样本的策略来增加少数类样本,这样容易产生模型过拟合的问题,即使得模型学习到的信息过于特别(Specific)而不够泛化(General)

4)数据合成:SMOTE(Synthetic Minority Oversampling Technique)即合成少数类过采样技术,它是基于随机过采样算法的一种改进方案,,SMOTE算法的基本思想是对少数类样本进行分析并根据少数类样本人工合成新样本添加到数据集中。

经验:

相关参考:

https://blog.csdn.net/Dawei_01/article/details/80846371

概率采样方法的实现:

从总样本中采样1/4实现:random.uniform(0, 1) < 0.025

#-*- coding:utf-8 -*-
f = open("./sample_skeleton_test.csv",'r')   
f_o=open(".//BuyWeight_sample_skeleton_test_sample_2_percent.csv",'w') 
test_md5_set = set()
index = 0
for line in f:
    tokens = line.strip().split(",")
    #tokens[2]等于1表示正样本,不等于1时,采样1/4的样本
    if tokens[2] == '1' or random.uniform(0, 1) < 0.025:
        f_o.write(line)
        test_md5_set.add(tokens[3])
    index += 1
    if index % 1000000 == 0:
        print("current_index:",index)
f.close()
f_o.close()
pickle.dump(test_md5_set, open('./BuyWeight_test_md5_set.p', 'wb'))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值