机器学习:类不平衡问题求解

一、出现场景

1.异常检测场景和罕见事件的分析2.客户流失场景3.发生频率低的事件

二、解决方法

1.过采样/上采样(应用更广泛)
(1)方法:增加分类中少数类样本的数量来实现样本均衡

  • 最直接的方法是简单复制少数类样本形成多条记录,这种方法的缺点是如果样本特征少而可能导致过拟合的问题;
  • 经过改进的过抽样方法通过在少数类中加入随机噪声、干扰数据或通过一定规则产生新的合成样本。
from imblearn.over_sampling import SMOTE # 过抽样处理库SMOTE
model_smote = SMOTE() # SMOTE算法是对正例进行线性插值产生额外的正例。
x_smote_resampled, y_smote_resampled = model_smote.fit_sample(x,y) 
x_smote_resampled = pd.DataFrame(x_smote_resampled, columns=['col1','col2']) # 将数据转换为数据框并命名列名
y_smote_resampled = pd.DataFrame(y_smote_resampled,columns=['label']) # 将数据转换为数据框并命名列名
smote_resampled = pd.concat([x_smote_resampled, y_smote_resampled],axis=1) # 按列合并数据框
groupby_data_smote = smote_resampled.groupby('label').count() # 输出经过SMOTE处理后的数据集样本分类分布

2.降采样/下采样
(1)方法:减少分类中多数类样本的样本数量来实现样本均衡

  • 最直接的方法是随机地去掉一些多数类样本来减小多数类的规模,缺点是会丢失多数类样本中的一些重要信息
from imblearn.under_sampling import RandomUnderSampler # 欠抽样处理库RandomUnderSampler
model_RandomUnderSampler = RandomUnderSampler() # 建立RandomUnderSampler模型对象
x_RandomUnderSampler_resampled, y_RandomUnderSampler_resampled =model_RandomUnderSampler.fit_sample(x,y) # 输入数据并作欠抽样处理

3.设置正负样本的惩罚权重
(1)方法:模型中小样本量类别权重高,大样本量类别权重低

from sklearn.svm import SVC #SVM中的分类算法SVC
model_svm = SVC(class_weight='balanced') # balanced代表算法将自动调整与输入数据中的类频率成反比的权重
model_svm.fit(x, y) # 输入x和y并训练模型
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression(class_weight="balanced")
lr = LogisticRegression(class_weight={0:0.9,1:0.1})
lr.fit(x,y,sample_weight={0:0.9,1:0.1})

4.组合/集成方法
(1)方法:在每次生成训练集时使用所有分类中的小样本量,同时从分类中的大样本量中随机抽取数据来与小样本量合并构成训练集,这样反复多次会得到很多训练集和训练模型。最后在应用时,使用组合方法(例如投票、加权投票等)产生分类预测结果。

from imblearn.ensemble import EasyEnsemble # 简单集成方法EasyEnsemble
# 使用集成方法EasyEnsemble处理不均衡样本
model_EasyEnsemble = EasyEnsemble() # 建立EasyEnsemble模型对象
x_EasyEnsemble_resampled, y_EasyEnsemble_resampled =
model_EasyEnsemble.fit_sample(x, y) # 输入数据并应用集成方法处理
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators=10,class_weight="balanced", random_state=1)

5.基于列的特征选择方法
(1)方法:样本不均衡也会导致特征分布不均衡,但如果小类别样本量具有一定的规模,那么意味着其特征值的分布较为均匀,可通过选择具有显著型的特征配合参与解决样本不均衡问题,也能在一定程度上提高模型效果。

上述几种方法的思路都是基于分类问题解决的。实际上,这种从大规模数据中寻找罕见数据的情况,也可以使用非监督式的学习方法,例如使用One-class SVM进行异常检测。分类是监督式方法,前期是基于带有标签(Label)的数据进行分类预测;而采用非监督式方法,则是使用除了标签以外的其他特征进行模型拟合,这样也能得到异常数据记录。所以,要解决异常检测类的问题,先是考虑整体思路,然后再考虑方法模型。

发布了60 篇原创文章 · 获赞 55 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/MARY197011111/article/details/90264974