样本不均衡与异常点检测处理|SMOTE|LOF|IForest
在机器学习中,数据样本不均衡和异常值检测是数据科学家和机器学习工程师经常面临的挑战。这些问题如果不加以处理,会严重影响模型的性能和准确性。本文将概述这些问题,并提出相应的解决方案。
样本不均衡概述
在分类任务中,样本不均衡指的是不同类别的样本数量相差悬殊,比如y值中的正负样本不均衡。这种情况在实际应用中非常常见,比如在信贷审批中,违约的客户(负样本)往往远少于未违约的客户(正样本)。这种不均衡会导致模型在预测时偏向于多数类,从而降低对少数类的预测性能。
解决方案
-
下探
下探是指在被拒绝的客户中放一部分人进来,即通过牺牲一部分收益,积累负样本,供后续模型学习。然而,下探的代价是风险增加和成本上升。它会造成信用质量的恶化,不是每个平台都愿意承担这部分坏账。并且,往往很难对每次下探的量给出一个较合适的参考值。
-
代价敏感(设置参数)
代价敏感方法通过改变样本的权重来解决不均衡问题。类权重的计算方法通常如下:
textweight=(n_classes×np.bincount(y))n_samples
其中,n_samples 为样本数,n_classes 为类别数量,np.bincount(y) 会输出每个类别的样本数量。
逻辑回归模型在创建时,可以通过设置
class_weight='balanced'
参数来实现代价敏感。此外,还可以通过fpr和tpr的最大差值计算KS值来验证模型性能,KS值越大越好。 -
采样算法
-
欠采样:通过减少多数类样本的数量来平衡数据集。
-
过采样:通过增加少数类样本的数量来平衡数据集。
其中,SMOTE算法是一种常用的过采样技术。它通过计算每个少数类样本的K个近邻,并从这些近邻中随机挑选样本进行线性插值,从而构造新的少数类样本。然而,SMOTE算法会放大数据集中的噪声和异常,因此需要对训练样本进行清洗。另一种随机过采样方法则是简单复制现有样本,但这种方法会导致训练得到的模型泛化能力较差。
SMOTE算法的使用可以通过以下代码实现:
from imblearn.over_sampling import SMOTE smote = SMOTE( k_neighbors=K, # 找K个邻居 n_jobs=1, random_state=random_state ) x_resampled, y_resampled = smote.fit_resample(x, y)
-
异常点检测概述
异常值在实际数据中不可避免,异常点检测是数据处理的重要步骤。异常值通常指的是那些与大多数样本显著不同的样本点,它们可能是由于测量错误、数据录入错误或异常事件产生的。
解决方案
-
z-score
z-score是一种基于统计思想的异常值检测方法。它通过将每个样本点与其均值之间的差值除以标准差来计算z值,然后根据z值的绝对值大小来判断样本点是否为异常值。
-
LOF(Local Outlier Factor)
LOF是一种无监督的异常点检测算法。它基于密度来计算局部异常因子,密度越大说明样本越正常,反之则样本异常。LOF算法的实现流程如下:
- 首先对样本空间进行去重,并计算每个样本到其余点的距离。
- 将距离升序排列,并指定近邻样本个数k。
- 对于每个样本点,寻找其k近邻样本,并计算LOF分数作为异常分数。
LOF算法的使用可以通过以下代码实现:
from pyod.models.lof import LOF clf = LOF(n_neighbors=k) clf.fit(x) y_pred = clf.predict(x)
-
Isolation Forest
Isolation Forest是一种基于树模型的异常点检测算法。它从样本的分割难易程度来区分正常点和异常点。Isolation Forest的构建过程类似于随机森林,但每个决策树的构建过程不同。它随机选择一个特征和一个特征值作为分割点,将样本空间划分为两部分,直到所有样本都被孤立或达到树的深度限制。
Isolation Forest的使用可以通过以下代码实现:
from pyod.models.iforest import IForest clf = IForest( behaviour='new', # 为了兼容后续版本 n_estimators=500, n_jobs=-1 ) clf.fit(x) y_pred = clf.predict(x)
通过合理的策略处理样本不均衡和异常值,可以显著提高模型的性能和准确性。在实际应用中,需要根据具体的数据集和任务需求选择合适的解决方案。