淳安|使用分类权重解决数据不平衡的问题

淳安|使用分类权重解决数据不平衡的问题

在分类任务中 , 不平衡数据集是指数据集中的分类不平均的情况 , 会有一个或多个类比其他类多的多或者少的多 。
在我们的日常生活中 , 不平衡的数据是非常常见的比如本篇文章将使用一个最常见的例子 , 信用卡欺诈检测来介绍 , 在我们的日常使用中欺诈的数量要远比正常使用的数量少很多 , 对于我们来说这就是数据不平衡的问题 。

我们使用kaggle上的信用卡交易数据集作为本文的数据集 。 数据的细节不是特别重要 。 因为为了进行脱敏 , 这个数据集的特征是经过PCA降维后输出的 , 所以讨论这些特征代表什么没有任何意义 。 除了PCA输出的特征以外 , 这个数据集还包括与每笔交易相关的美元金额、以秒为单位的连续时间索引 , 以及一个表示存在或不存在欺诈的二进制目标 。 对于时间索引 , 我们考虑到某些特征工程 , 它可能会很有用 , 但这不是本文的重点 。 对于我们真实可见的数据只有金额一项 , 这个很重要!
我们再看看目标 , 在284807行数据中只有0.173%的行是欺诈案例 , 这绝对是不平衡数据的样例 , 这种数据的分布会使建模和预测欺诈行为变得有非常的棘手 。
性能指标在不平衡数据时 , 可以使用几个有价值的性能指标来了解模型的性能 。 通常情况下 , 指标的选择很大程度上取决于应用以及与正负相关的结果 。 单独的一种方法不能适用于所有人 。
在信用卡欺诈的背景下 , 我们不会对产生高准确度分数的模型感兴趣 。 因为数据集非常不平衡欺诈的数据很少 , 如果我们将所有样本分类为不存在欺诈 , 那么准确率还是很高 。 但是我们对准确预测信用卡交易何时不存在欺诈不感兴趣 , 我们关心的是信用卡是否存在欺诈 , 也就是样本量少的分类是否能够被判断出来 。
最简单的办法就是召回分数作为模型性能的主要指标 。 召回是衡量有多少正面案例被模型准确预测的指标 。 在我们的特定用例中 , 更高的召回分数意味着我们检测到更多的欺诈案例 。
在本文中 , 我们除了使用召回以外还将分类与最后的财务指标相结合 , 还记得我们前面提到的数据集的包含交易的美元金额吗?我们也将把它纳入绩效评估 , 称之为“财务召回” 。 我们将在下面详细介绍 。
数据准备首先 , 让我们读入数据 , 并将其分成训练集和测试集:
import pandas as pd
from sklearn.model_selection import train_test_split

df = pd.read_csv('creditcard.csv')

# enumerate the feature columns
feats = [col for col in df.columns if 'V' in col


# Split data
x = df[feats + ['Amount'


y = df['Class'


X_train X_test y_train y_test = train_test_split(
   x y
   test_size=.2
   stratify=y
   random_state=41)
如果以前没有在train_test_split中使用过stratify参数 , 那么在处理不平衡数据时应该使用该参数 , train_test_split分割后欺诈案例的比例会根据传递列的比例进行分配(具体使用方法可以查看sklearn的文档) , 我们的目标是为了确保我们在训练集和测试集中保持相同比例类别分布 。
基类模型【淳安|使用分类权重解决数据不平衡的问题】我们将创建并训练一个基本的逻辑回归模型作为基线 。 但在此之前我们先创建一个小函数 , 将每笔交易的金额纳入性能评估 。
因为关心的是能够正确分类的欺诈案件的数量 , 并且我们也关心(可能更关心)将欺诈损失的美元保持在最低限度 。 这就是我们之前讨论的“财务召回” 。 让我们创建一个函数来计算正确识别的欺诈金额: