当二分类数据不均衡时会影响模型的输出,此时需要对数据进行处理。
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'))