【机器学习】处理样本不平衡的问题

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

文章目录

样本不均衡的概念及影响

机器学习中样本不均衡问题经常遇到比如在金融风险人员二分类问题中绝大部分的样本均为正常人群可用的风险样本较少。如果拿全量样本去训练一个严重高准确率的二分类模型那结果毫无疑问会严重偏向于正常人群从而导致模型的失效所以说训练样本比例均衡对模型的结果准确性至关重要。
首先来看概念
【样本不均衡】所谓的样本不平衡问题指的是数据集中正负样本比例极不均衡样本比例超过4:1的数据就可以称为不平衡数据。

样本不均衡的解决方法

常用的解决方法主要从样本层面、损失函数层面、模型层面以及评价指标等4方面进行优化。

样本层面

欠采样 undersampling

imblearn
imblearn库中的欠采样方法包含
在这里插入图片描述

  1. 随机欠采样
    下面是一个使用随机欠采样的示例代码
from imblearn.under_sampling import RandomUnderSampler

# 创建RandomUnderSampler对象
sampler = RandomUnderSampler(random_state=42)

# 对训练数据进行欠采样
X_resampled, y_resampled = sampler.fit_resample(X_train, y_train)

在上述代码中X_train和y_train分别表示训练数据的特征和标签。fit_resample()方法将返回欠采样后的特征和标签。

2.集群中心欠采样
集群中心选择欠采样Cluster Centroids Undersampling这是一种基于聚类的欠采样方法它通过聚类算法将多数类别样本聚集到少数类别样本的中心点从而减少多数类别的数量。同样地可以使用imbalanced-learn库来实现集群中心选择欠采样。

下面是一个使用集群中心选择欠采样的示例代码

from imblearn.under_sampling import ClusterCentroids

# 创建ClusterCentroids对象
sampler = ClusterCentroids(random_state=42)

# 对训练数据进行欠采样
X_resampled, y_resampled = sampler.fit_resample(X_train, y_train)
在上述代码中X_train和y_train分别表示训练数据的特征和标签。fit_resample()方法将返回欠采样后的特征和标签。

这些方法都可以根据具体情况选择合适的欠采样策略。值得注意的是欠采样可能会导致信息丢失因此在应用欠采样之前需要仔细评估其对模型性能的影响并选择适当的评估指标来评估模型的效果。

过采样

过采样Oversampling是一种处理样本不均衡问题的方法它通过增加少数类别样本的数量来平衡数据集。在Python中有多种过采样方法可供选择。以下是几种常用的过采样方法及其示例代码

1. 复制样本Duplicate Samples这是一种简单直接的过采样方法它通过复制少数类别样本来增加其数量。

import numpy as np

# 找出少数类别样本的索引
minority_indices = np.where(y == minority_class_label)[0]

# 复制少数类别样本
duplicated_samples = X[minority_indices]

# 将复制的样本添加到原始数据集中
X_oversampled = np.concatenate((X, duplicated_samples), axis=0)
y_oversampled = np.concatenate((y, np.ones(len(duplicated_samples))), axis=0)

在上述代码中X和y分别表示原始数据集的特征和标签。minority_class_label是少数类别的标签。通过复制少数类别样本并将其添加到原始数据集中我们可以实现过采样。

2.SMOTESynthetic Minority Over-sampling TechniqueSMOTE是一种基于合成样本的过采样方法它通过在特征空间中插入新的合成样本来增加少数类别样本的数量。

from imblearn.over_sampling import SMOTE

# 创建SMOTE对象
smote = SMOTE(random_state=42)

# 对训练数据进行过采样
X_oversampled, y_oversampled = smote.fit_resample(X_train, y_train)
在上述代码中X_train和y_train分别表示训练数据的特征和标签。fit_resample()方法将返回过采样后的特征和标签。

3. ADASYNAdaptive Synthetic SamplingADASYN是一种基于合成样本的自适应过采样方法它根据样本密度来生成合成样本更关注于那些在决策边界附近的少数类别样本。

from imblearn.over_sampling import ADASYN

# 创建ADASYN对象
adasyn = ADASYN(random_state=42)

# 对训练数据进行过采样
X_oversampled, y_oversampled = adasyn.fit_resample(X_train, y_train)
在上述代码中X_train和y_train分别表示训练数据的特征和标签。fit_resample()方法将返回过采样后的特征和标签。

这些方法都可以根据具体情况选择合适的过采样策略。需要注意的是过采样可能会导致模型对少数类别样本过拟合的问题因此在应用过采样之前需要仔细评估其对模型性能的影响并选择适当的评估指标来评估模型的效果。

数据增强

损失函数层面

损失函数层面主流的方法也就是常用的代价敏感学习cost-sensitive为不同的分类错误给予不同惩罚力度权重在调节类别平衡的同时也不会增加计算复杂度。如下常用方法
这最常用也就是scikit模型的’class weight‘方法If ‘balanced’, class weights will be given by n_samples / (n_classes * np.bincount(y)). If a dictionary is given, keys are classes and values are corresponding class weights. If None is given, the class weights will be uniform.class weight可以为不同类别的样本提供不同的权重少数类有更高的权重从而模型可以平衡各类别的学习。如下图通过为少数类做更高的权重以避免决策偏重多数类的现象类别权重除了设定为balanced还可以作为一个超参搜索。示例代码请见github.com/aialgorithm
在这里插入图片描述

clf2 = LogisticRegression(class_weight={0:1,1:10})  # 代价敏感学习

模型层面

模型方面主要是选择一些对不均衡比较不敏感的模型比如对比逻辑回归模型lr学习的是全量训练样本的最小损失自然会比较偏向去减少多数类样本造成的损失决策树在不平衡数据上面表现相对好一些树模型是按照增益递归地划分数据如下图划分过程考虑的是局部的增益全局样本是不均衡局部空间就不一定所以比较不敏感一些但还是会有偏向性.

采样+集成学习

BalanceCascade
BalanceCascade基于Adaboost作为基分类器核心思路是在每一轮训练时都使用多数类与少数类数量上相等的训练集然后使用该分类器对全体多数类进行预测通过控制分类阈值来控制FPFalse Positive率将所有判断正确的类删除然后进入下一轮迭代继续降低多数类数量。
在Python中BalanceCascade是一个用于处理样本不均衡问题的集成学习方法它基于级联分类器。BalanceCascade通过多次迭代地训练和删除错误分类的样本来减少多数类别的数量从而实现欠采样。

你可以使用imbalanced-learn库来实现BalanceCascade方法。下面是一个使用BalanceCascade的示例代码

python

from imblearn.ensemble import BalanceCascade
from sklearn.tree import DecisionTreeClassifier

# 创建BalanceCascade对象并指定基分类器
bc = BalanceCascade(estimator=DecisionTreeClassifier(random_state=42))

# 对训练数据进行欠采样
X_resampled, y_resampled = bc.fit_resample(X_train, y_train)
在上述代码中X_train和y_train分别表示训练数据的特征和标签。fit_resample()方法将返回欠采样后的特征和标签。

BalanceCascade方法会自动进行多轮迭代每轮迭代都会训练一个基分类器并删除错误分类的样本。这样多数类别的样本数量会逐步减少直到达到平衡。

请注意BalanceCascade方法可能需要较长的时间来运行因为它涉及多轮迭代和训练多个分类器。此外选择合适的基分类器也是很重要的你可以根据具体情况选择适合的分类器。

你可以在imbalanced-learn官方文档中找到更多关于BalanceCascade方法的详细信息和示例代码。

EasyEnsemble
EasyEnsemble也是基于Adaboost作为基分类器就是将多数类样本集随机分成 N 个子集且每一个子集样本与少数类样本相同然后分别将各个多数类样本子集与少数类样本进行组合使用AdaBoost基分类模型进行训练最后bagging集成各基分类器得到最终模型。示例代码可见http://www.kaggle.com/orange90/ensemble-test-credit-score-model-example
在Python中EasyEnsemble是一种用于处理样本不均衡问题的集成学习方法。它通过将原始数据集划分为多个子集并在每个子集上训练一个基分类器来实现欠采样。

你可以使用imbalanced-learn库来实现EasyEnsemble方法。下面是一个使用EasyEnsemble的示例代码

from imblearn.ensemble import EasyEnsemble
from sklearn.tree import DecisionTreeClassifier

# 创建EasyEnsemble对象并指定基分类器和子集数量
ee = EasyEnsemble(n_estimators=10, base_estimator=DecisionTreeClassifier(random_state=42))

# 对训练数据进行欠采样
X_resampled, y_resampled = ee.fit_resample(X_train, y_train)
在上述代码中X_train和y_train分别表示训练数据的特征和标签。n_estimators参数表示要生成的子集数量base_estimator参数表示用于训练每个子集的基分类器。

EasyEnsemble方法会生成多个子集并在每个子集上训练一个基分类器。最终的预测结果是所有基分类器的投票结果或平均结果以达到平衡样本不均衡的效果。

请注意EasyEnsemble方法可能需要较长的时间来运行因为它涉及生成多个子集并训练多个分类器。同样地选择合适的基分类器也是很重要的你可以根据具体情况选择适合的分类器。
你可以在imbalanced-learn官方文档中找到更多关于EasyEnsemble方法的详细信息和示例代码。

通常在数据集噪声较小的情况下可以用BalanceCascade可以用较少的基分类器数量得到较好的表现基于串行的集成学习方法对噪声敏感容易过拟合。噪声大的情况下可以用EasyEnsemble基于串行+并行的集成学习方法bagging多个Adaboost过程可以抵消一些噪声影响。此外还有RUSB、SmoteBoost、balanced RF等其他集成方法可以自行了解。

决策及评估指标

在处理不平衡样本问题时传统的评价指标如准确率可能会给出误导性的结果。因此为了更准确地评估模型在不平衡数据上的性能我们通常使用以下评价指标

1.混淆矩阵Confusion Matrix混淆矩阵是一个二维矩阵用于显示分类器在每个类别上的预测结果。它包含四个重要的指标真阳性True Positive, TP真阴性True Negative, TN假阳性False Positive, FP和假阴性False Negative, FN。根据这些指标可以计算其他评价指标。

2.精确率Precision精确率是指模型预测为正例的样本中实际为正例的比例。它可以通过以下公式计算Precision = TP / (TP + FP)。精确率越高表示模型对于正例的判断越准确。

3.召回率Recall召回率是指实际为正例的样本中模型正确预测为正例的比例。它可以通过以下公式计算Recall = TP / (TP + FN)。召回率越高表示模型对于正例的识别能力越强。

4.F1值F1-ScoreF1值是精确率和召回率的调和平均值用于综合评估模型的性能。它可以通过以下公式计算F1 = 2 * (Precision * Recall) / (Precision + Recall)。F1值越高表示模型在精确率和召回率之间取得了更好的平衡。

5.ROC曲线和AUCReceiver Operating Characteristic Curve and Area Under the CurveROC曲线是以假阳性率False Positive Rate, FPR为横轴真阳性率True Positive Rate, TPR为纵轴绘制的曲线。AUC表示ROC曲线下的面积用于衡量模型在不同阈值下的分类性能。AUC的取值范围在0到1之间越接近1表示模型性能越好。

以上评价指标可以帮助我们更全面地评估模型在不平衡样本上的性能。根据具体问题的需求选择适当的评价指标来评估模型的效果是非常重要的。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: 机器学习