原理+代码|手把手教你使用Python实战反欺诈模型

本文探讨了在反欺诈模型中如何处理不平衡数据,通过介绍欠采样、过采样方法如Tomek Link、Random Over Sampling、SMOTE等,以及综合采样的策略。强调了在处理过程中,不应只关注模型的准确度,而应考虑精确率、召回率和F1 Score等评价指标。在Python实战部分,展示了如何对训练集进行不同的抽样处理,并以决策树为例说明模型训练的效果。
摘要由CSDN通过智能技术生成

本文将基于不平衡数据,使用Python进行 反欺诈模型 数据分析实战,模拟分类预测模型中 因变量分类出现不平衡 时该如何解决,具体的案例应用场景除反欺诈外,还有客户违约和疾病检测等。只要是因变量中各分类占比悬殊,就可对其使用一定的采样方法,以达到除模型调优外的精度提升。主要将分为两个部分:

  • 原理介绍

  • Python实战

原理介绍

与其花大量的时间对建好的模型进行各种调优操作,不如在一开始就对源数据进行系统而严谨的处理。而数据处理背后的算法原理又常是理解代码的支撑。所以本节将详细介绍不平衡采样的多种方法。

在以往的学习中,数据大多是 对称分布 的,就像下图一样,即正负样本的数量相当。这样可以更好的把注意力集中在特定的算法上,而不被其他问题干扰。以分离算法为例,它的目标是尝试学习出一个能够分辨二者的分离器(分类器)。根据不同的数学、统计或几何假设,达成这一目标的方法很多:逻辑回归,岭回归,决策树,和各种聚类算法等。

但当我们开始面对真实的、未经加工过的数据时,很快就会发现这些数据要嘈杂且不平衡得多。真实数据看起来更像是如下图般毫无规律且零散。对于不平衡类的研究通常认为 “不平衡” 意味着少数类只占 10% ~ 20%。但其实这已经算好的了,在现实中的许多例子会更加的不平衡(1~2%),如规划中的客户信用卡欺诈率,重大疾病感染率等。就像下图一样

如果我们拿到像上图那样的数据,哪怕经过了清洗,已经非常整洁了,之后把它们直接丢进逻辑回归或者决策树和神经网络模型里面的话,效果一定会见得好吗?。以根据患者体征来预测其得某种罕见病为例:可能模型在预测该患者不得病上特准,毕竟不得病的数据占到了98%,那把剩下的得病的那 2% 也都预测成了不得病的情况下模型的整体准确度还是非常高...但整体准确度高并不代表模型在现实情况就能有相同的优良表现,所以最好还是能够拿到 1:1 的数据,这样模型预测出来的结果才最可靠。

所以对于这类数据,常见而有效的处理方式有基本的数据处理、调整样本权重与使用模型等三类。

本文将专注于从数据处理的角度来解决数据不平衡问题,后续推文会涉及使用模型来处理。

注意事项:

  • 评估指标:使用精确度(Precise Rate)、召回率(Recall Rate)、Fmeasure或ROC曲线、准确度召回曲线(precision-recall curve);不要使用准确度(Accurate Rate)

  • 不要使用模型给出的标签,而是要概率估计;得到概率估计之后,不要盲目地使用0.50的决策阀值来区分类别,应该再检查表现曲线之后再自己决定使用哪个阈值。

问:为什么数据处理的几种采样方法都只对训练集进行操作?

答:因为原始数据集的 0-1 比为 1:99,所以随即拆分成的训练集和测

好的,我了解了。关于 apriori 算法,它是一种经典的频繁项集挖掘算法,能够从大规模数据中发现物品之间的关联性。下面是 apriori 算法的原理Python 代码实现: ### 原理 apriori 算法的核心思想是利用频繁项集的性质,从候选项集中生成所有频繁项集。频繁项集指的是在数据集中出现频率超过预设阈值的项集。这里的阈值可以是支持度、置信度等度量指标。 算法流程: 1. 对数据集进行扫描,找出所有单个物品组成的候选项集; 2. 计算候选项集的支持度,剔除不满足最小支持度的项集; 3. 根据频繁项集的性质,使用候选项集生成下一级候选项集; 4. 重复步骤2和步骤3,直到无法生成更多的频繁项集。 ### 代码实现 下面是一个简单的 Python 实现,假设我们有一个包含多个交易记录的列表,每个交易记录是一个物品集合。我们要找出频繁项集,其中最小支持度为 0.5。 ```python def load_data(): """ 加载数据集 """ dataset = [ ['I1', 'I2', 'I5'], ['I2', 'I4'], ['I2', 'I3'], ['I1', 'I2', 'I4'], ['I1', 'I3'], ['I2', 'I3'], ['I1', 'I3'], ['I1', 'I2', 'I3', 'I5'], ['I1', 'I2', 'I3'] ] return dataset def create_c1(dataset): """ 生成所有单项候选集 """ c1 = set() for transaction in dataset: for item in transaction: c1.add(frozenset([item])) return c1 def calc_support(dataset, c, min_support): """ 计算候选集的支持度,并剔除不满足最小支持度的项集 """ count = {} for transaction in dataset: for item in c: if item.issubset(transaction): count[item] = count.get(item, 0) + 1 num_items = float(len(dataset)) ret_list = [] support_data = {} for item in count: support = count[item] / num_items if support >= min_support: ret_list.append(item) support_data[item] = support return ret_list, support_data def apriori_gen(lk, k): """ 生成下一级候选集 """ ret_list = [] len_lk = len(lk) for i in range(len_lk): for j in range(i + 1, len_lk): l1 = list(lk[i])[:k - 2] l2 = list(lk[j])[:k - 2] l1.sort() l2.sort() if l1 == l2: ret_list.append(lk[i] | lk[j]) return ret_list def apriori(dataset, min_support=0.5): """ apriori算法主函数 """ c1 = create_c1(dataset) d = list(map(set, dataset)) l1, support_data = calc_support(d, c1, min_support) l = [l1] k = 2 while len(l[k - 2]) > 0: ck = apriori_gen(l[k - 2], k) lk, sup_k = calc_support(d, ck, min_support) support_data.update(sup_k) l.append(lk) k += 1 return l, support_data ``` 我们可以调用 `apriori` 函数来计算频繁项集: ```python dataset = load_data() min_support = 0.5 frequent_itemsets, support_data = apriori(dataset, min_support) ``` `frequent_itemsets` 是一个列表,包含所有的频繁项集。`support_data` 是一个字典,记录每个项集的支持度。 以上就是 apriori 算法的原理Python 代码实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值