数据预处理-非平衡样本的处理方式(SMOTE--待补充)
背景:
在机器学习中,我们获取的数据往往存在一个问题,就是样本不均匀。比如你有一个样本集合,正例有9900个,负例100个,训练的结果往往是很差的,因为这个模型总趋近于是正例的。
就算全是正那么,也有99%的准确率,看起来挺不错的,但是我们要预测的负样本很可能一个都预测不出来。
这种情况,在机器学习中有三个处理办法,过采样、欠采样、K-fold交叉验证
一.一般经验
1. 1:20以上是需要做均衡处理的 ,普通数据召回率低的话1:10就可以做均衡处理
2. 一般如果不是严重不平衡,或者不平衡既是业务的正常反应,则不需要做处理,非平衡样本的处理方式不是必须的
3. 多分类样本不均衡,只能过采样处理 (一般实验或比赛数据才会过采样处理, 一般不会过采样处理, 因为会有很多问题.)
二.处理方法
1. 过采样:
对坏的人群提高权重,即复制坏样本,提高坏样本的占比。
优点:
简单,对数据质量要求不高
缺点:容易过拟合
--SMOTE算法,合并少数类过采样技术 KNN近邻 增加的不是原始样本也不是真实的样本
2. 欠采样:
对好的人群降低权重,通过抽样,降低好样本的占比
优点:
简单,对数据质量要求不高
缺点:
丢失重要信息,容易欠拟合
3. Smote 合成少数过采样技术
优点:
不易过拟合,保留信息
缺点:
不能对有缺失值和类别变量做处理(原始smote方法)
解决办法:可以将类别型进行编码或聚类,对缺失值进行处理后再使用
3、K-fold交叉验证
其他https://blog.csdn.net/weixin_43996899/article/details/94171209
值得注意的是,使用过采样方法来解决不平衡问题时应适当地应用交叉验证。这是因为过采样会观察到罕见的样本,并根据分布函数应用自举生成新的随机数据,如果在过采样之后应用交叉验证,那么我们所做的就是将我们的模型过拟合于一个特定的人工引导结果。这就是为什么在过度采样数据之前应该始终进行交叉验证,就像实现特征选择一样。只有重复采样数据可以将随机性引入到数据集中,以确保不会出现过拟合问题。
K-fold交叉验证就是把原始数据随机分成K个部分,在这K个部分中选择一个作为测试数据,剩余的K-1个作为训练数据。交叉验证的过程实际上是将实验重复做K次,每次实验都从K个部分中选择一个不同的部分作为测试数据,剩余的数据作为训练数据进行实验,最后把得到的K个实验结果平均。
三.SMOTE-只针对二分类模型
SMOTE算法的基本思想就是对少数类别样本进⾏分析和模拟,并将⼈⼯模
拟的新样本添加到数据集中,进⽽使原始数据中的类别不再严重失衡。该
算法的模拟过程采⽤了KNN技术,模拟⽣成新样本的步骤如下:
SMOTE算法步骤:
1. 随机找一个少数类的观测点
2. 用KNN计算观测点最近的样本
3. 随机挑选离观测点近邻的其中一个样本
4. 计算两点的差值后进行随机提取。所以这里的随机体现在两个方面,线性体现在求差值的运算上面。
# pip install imblearn
# 做平衡处理 from imblearn.over_sampling import SMOTE # 实例化 over_samples = SMOTE(random_state=1234) # fit数据结构 over_samples_x,over_samples_y = over_samples.fit_sample(Xtrain,Ytrain) over_test_x,over_test_y = over_samples.fit_sample(Xtest,Ytest) # 重采样之后的比例 print(pd.Series(over_samples_y).value_counts()/len(over_samples_y)) # 重采样之前的比例 print(Ytrain.value_counts()/len(Ytrain))