公司博客上

基于决策树和MLflow的大规模金融欺诈检测

分享这篇文章

在数据库试试这个笔记本

无论用例如何,使用人工智能大规模检测欺诈模式都是一个挑战。大量的历史数据需要筛选,不断发展的机器学习和深度学习技术的复杂性,以及非常少的欺诈行为的实际例子,这些都相当于在不知道针长什么样的情况下,在干草堆里找到一根针。在金融服务行业,对安全性的额外关注以及解释如何识别欺诈行为的重要性进一步增加了任务的复杂性。

为了构建这些检测模式,一个领域专家团队根据欺诈者的典型行为提出了一组规则。工作流可能包括财务欺诈检测领域的主题专家,他将特定行为的一组需求放在一起。然后,数据科学家可以从可用数据中提取子样本,并使用这些要求和可能的一些已知的欺诈案例,选择一组深度学习或机器学习算法。为了将模式投入生产,数据工程师可能会将结果模型转换为一组带有阈值的规则,通常使用SQL实现。

该方法允许金融机构提出一组明确的特征,从而识别符合《一般数据保护条例》(GDPR).然而,这种方法也带来了许多困难。使用硬编码规则集实现欺诈检测系统是非常脆弱的。对欺诈模式的任何改变都需要很长时间才能更新。这反过来又使其难以跟上和适应当前市场上发生的欺诈活动的变化。

此外,上面描述的工作流中的系统通常是孤立的,领域专家、数据科学家和数据工程师都是分开的。数据工程师负责维护大量数据,并将领域专家和数据科学家的工作转化为生产级代码。由于缺乏通用平台,领域专家和数据科学家不得不依赖bob体育客户端下载适合于一台机器的采样数据进行分析。这会导致沟通困难,最终导致缺乏合作。

在本博客中,我们将展示如何将几个这样的基于规则的检测用例转换为Databricks平台上的机器学习用例,统一欺诈检测的关键参与者:领域专家、数据科学家和数据工程师。bob体育客户端下载我们将学习如何创建机器学习欺诈检测数据管道,并利用从大型数据集构建模块化功能的框架实时可视化数据。我们还将学习如何使用决策树和Apache Spark MLlib检测欺诈。然后,我们将使用MLflow迭代和细化模型,以提高其准确性。

用机器学习解决问题

在金融领域,人们对机器学习模型有一定程度的不情愿,因为人们认为它们提供了一个“黑匣子”解决方案,无法证明已识别的欺诈案例是正确的。GDPR要求以及金融监管规定使得利用数据科学的力量似乎不可能。然而,几个成功的用例已经表明,应用机器学习大规模检测欺诈可以解决上面提到的许多问题。

训练一个有监督的机器学习模型来检测金融欺诈是非常困难的,因为实际确认的欺诈行为示例数量很少。然而,存在一组已知的规则来识别特定类型的欺诈可以帮助创建一组合成标签和一组初始特征。由该领域的领域专家开发的检测模式的输出很可能已经经过了适当的批准流程,才能投入生产。它产生预期的欺诈行为标志,因此可以用作训练机器学习模型的起点。这同时缓解了三个问题:

  1. 缺乏培训标签,
  2. 决定使用什么功能,
  3. 为模型提供适当的基准。

训练机器学习模型来识别基于规则的欺诈行为标志,可以通过混淆矩阵与预期输出进行直接比较。如果结果与基于规则的检测模式密切匹配,这种方法有助于获得怀疑论者对基于机器学习的欺诈预防的信心。该模型的输出非常容易解释,与原始检测模式相比,可以作为预期假阴性和假阳性的基线讨论。

此外,如果使用决策树模型作为初始机器学习模型,则可能会进一步缓解机器学习模型难以解释的问题。由于模型被训练成一组规则,决策树很可能优于任何其他机器学习模型。当然,额外的好处是模型的最大透明度,它将从本质上显示欺诈的决策过程,但没有人为干预,也不需要硬编码任何规则或阈值。当然,必须理解模型的未来迭代可能完全利用不同的算法来获得最大的精度。模型的透明性最终是通过理解算法中的特征来实现的。具有可解释的特征将产生可解释和可辩护的模型结果。

机器学习方法的最大好处是,在最初的建模工作之后,未来的迭代是模块化的,更新标签、特征或模型类型的集合非常容易和无缝,减少了生产的时间。在Databricks统一分析平台上,领域专家、数据科学家和数据工程师可以大规模地使用相同的bob体育亚洲版数据集,并直接在笔记本环境中协作。bob体育客户端下载让我们开始吧!

摄取和探索数据

在这个例子中,我们将使用一个合成数据集。要自己加载数据集,请下载从Kaggle导入到本地机器,然后通过import data -导入数据Azure而且AWS

PaySim数据模拟了移动货币交易,基于一个非洲国家实施的移动货币服务一个月的财务日志中提取的真实交易样本。下表显示了该数据集提供的信息:

探索数据

创建数据框架-现在我们已经上传了数据到数据库文件系统(DBFS),我们可以快速轻松地创建DataFrames使用Spark SQL

创建df DataFrame包含我们的模拟财务欺诈检测数据集df火花。sql("select step, type, amount, nameorg, oldbalanceOrg, newbalancorg, nameDest, oldbalanceDest, newbalanceDest from sim_fin_fraud_detection")

现在我们已经创建了DataFrame,让我们看一看模式和用于检查数据的前1000行。

#检查数据的模式df.printSchema ()| - - -步骤:整数(可空=真正的| - - -类型:字符串(可空=真正的|——数量:(可空=真正的|——nameOrig:字符串(可空=真正的|——oldbalanceOrg:(可空=真正的|——newbalanceOrig:(可空=真正的|——命名:字符串(可空=真正的|——oldbalanceDest:(可空=真正的|——newbalanceDest:(可空=真正的

交易类型

让我们将数据可视化,以了解数据捕获的事务类型及其对整体交易量的贡献。

为了了解我们谈论的是多少钱,让我们根据交易类型以及它们对转移现金金额的贡献(即总和(金额))来可视化数据。

基于规则的模型

我们不太可能从已知欺诈案例的大量数据集开始训练我们的模型。在大多数实际应用中,欺诈检测模式是由领域专家建立的一组规则识别的。在这里,我们创建一个名为标签基于这些规则。

#识别已知欺诈行为的规则df = df. withcolumn (“标签”F.when ((df.oldbalanceOrg56900) & (df. newbalanceorigin .56900) & (df. newbalanceorigin .>12) & (df。量>1160000),1) .otherwise (0))

可视化规则标记的数据

这些规则经常标记出相当多的欺诈案件。让我们可视化标记的事务的数量。我们可以看到,规则将大约4%的案件和11%的总金额标记为欺诈。

选择合适的机器学习模型

在许多情况下,不能使用黑盒方法进行欺诈检测。首先,领域专家需要能够理解为什么某个交易被识别为欺诈。然后,如果要采取行动,就必须在法庭上出示证据。决策树是一个容易解释的模型,是这个用例的一个很好的起点。

创建训练集

为了构建和验证我们的ML模型,我们将使用80/20分割.randomSplit.这将随机选择80%的数据用于训练,剩下的20%用于验证结果。

将数据集划分为训练数据集和测试数据集(train, test) = df.randomSplit([0.80.2),种子=12345

创建ML模型管道

为了为模型准备数据,我们必须首先将分类变量转换为数值变量.StringIndexer.然后,我们必须将我们希望模型使用的所有特性组装起来。除了决策树模型之外,我们还创建了一个管道来包含这些特征准备步骤,这样我们就可以在不同的数据集上重复这些步骤。请注意,我们首先将管道与训练数据相匹配,然后在后面的步骤中使用它来转换测试数据。

pyspark.ml进口管道pyspark.ml.feature进口StringIndexerpyspark.ml.feature进口VectorAssemblerpyspark.ml.classification进口DecisionTreeClassifier#将标签字符串列编码为标签索引列indexer = StringIndexer(inputCol =“类型”, outputCol =“typeIndexed”# VectorAssembler是一个转换器,它将一个给定的列列表组合为一个向量列va = VectorAssembler(inputCols = [“typeIndexed”“数量”“oldbalanceOrg”“newbalanceOrig”“oldbalanceDest”“newbalanceDest”“orgDiff”“destDiff”], outputCol =“特征”#使用决策树分类器模型dt = DecisionTreeClassifier(labelCol =“标签”, featuresCol =“特征”, seed =54321, maxDepth =5#创建管道阶段管道=管道(阶段=[索引器,va, dt])#查看决策树模型(在CrossValidator之前)Dt_model = pipe .fit(train)

可视化模型

调用显示()在管道的最后一个阶段,即决策树模型,允许我们查看每个节点上所选决策的初始拟合模型。这有助于理解算法是如何得出预测结果的。

显示器(dt_model.stages [1])
决策树模型的可视化表示

模型优化

为了确保我们有最佳的拟合树模型,我们将用几个参数变量交叉验证模型。鉴于我们的数据包含96%的阴性病例和4%的阳性病例,我们将使用精度-召回(PR)评估指标来解释不平衡分布。

< b >pyspark.ml.tuning  . bb0进口 CrossValidator, ParamGridBuilder#构建不同参数的网格paramGrid = ParamGridBuilder() \.addGrid (dt。maxDepth, (51015]) \.addGrid (dt。maxBins, (1020.30.]) \.build ()#构建交叉验证crossval =交叉验证器(估计= dt,estimatorParamMaps = paramGrid,evaluator = evaluatorPR,numFolds =3.#建立简历渠道pipelineCV = Pipeline(stages=[indexer, va, crossval])使用管道,参数网格和前面的BinaryClassificationEvaluator训练模型cvModel_u = pipelineCV.fit(train)

模型的性能

我们通过比较训练集和测试集的精度-召回率(PR)和ROC曲线下面积(AUC)指标来评估模型。PR和AUC似乎都很高。

#建立最好的模型(训练和测试数据集)train_pred = cvModel_u.transform(train)test_pred = cvModel_u.transform(test)在训练数据集上评估模型pr_train = evaluatorPR.evaluate(train_pred)auc_train = evaluatorAUC.evaluate(train_pred)在测试数据集上评估模型pr_test = evaluatorPR.evaluate(test_pred)auc_test = evaluatorAUC.evaluate(test_pred)打印PR和AUC值打印“公关培训:“pr_train)打印”AUC训练:“auc_train)打印“公关测试:”pr_test)打印“AUC测试:“auc_test)
              ---#输出:# PR列车:0.9537894984523128# AUC列车:0.998647996459481# PR测试:0.9539170535377599# AUC测试:0.9984378183482442

为了了解模型如何对结果进行错误分类,让我们使用matplotlib和pandas来可视化我们的混淆矩阵。

平衡类

我们看到该模型比原来的规则多识别了2421个案例。这并不像发现更多潜在的欺诈案件那样令人担忧,这可能是一件好事。然而,有58个病例没有被算法检测到,但最初被识别出来。我们将尝试通过使用欠抽样来平衡我们的类来进一步改进我们的预测。也就是说,我们将保留所有欺诈案例,然后对非欺诈案例进行抽样,以匹配该数字,从而获得平衡的数据集。当我们可视化我们的新数据集时,我们看到是和否的情况是50/50。

#重置数据帧为no fraud (' dfn ')和fraud (' dfy ')DFN =火车。过滤器(火车。标签==0火车。过滤器(火车。标签==1#计算汇总指标N = train.count()Y = dfy.count()p = y/N#创建一个更平衡的训练数据集Train_b = fdf .sample( .sample, p, seed =92285) .union (dfy)#打印指标打印“总计数:%s,欺诈案件计数:%s,欺诈案件比例:%s”% (N, y, p))打印"平衡训练数据集计数:%s"% train_b.count ())
              ---#输出:#总计数:5090394,欺诈案件计数:204865,欺诈案件比例:0.040245411258932016#平衡训练数据集计数:401898---#显示我们更平衡的训练数据集显示器(train_b.groupBy (“标签”) .count ())

更新管道

现在让我们更新毫升管道并创建一个新的交叉验证器。因为我们正在使用ML管道,我们只需要用新的数据集更新它,我们可以快速重复相同的管道步骤。

#重新运行相同的ML管道(包括参数网格)crossval_b =交叉验证器(估计= dt,estimatorParamMaps = paramGrid,评估器=评估auc,numFolds =3.pipelineCV_b = Pipeline(stage =[indexer, va, crossval_b])使用管道,参数网格和BinaryClassificationEvaluator使用' train_b '数据集训练模型cvModel_b = pipelineCV_b.fit(train_b)#构建最佳模型(平衡训练和完整测试数据集)train_pred_b = cvModel_b.transform(train_b)test_pred_b = cvModel_b.transform(test)在平衡训练数据集上评估模型pr_train_b = evaluatorPR.evaluate(train_pred_b)auc_train_b = evaluatorAUC.evaluate(train_pred_b)在完整的测试数据集上评估模型pr_test_b = evaluatorPR.evaluate(test_pred_b)auc_test_b = evaluatorAUC.evaluate(test_pred_b)打印PR和AUC值打印“公关培训:“pr_train_b)打印”AUC训练:“auc_train_b)打印“公关测试:”pr_test_b)打印“AUC测试:“auc_test_b)
              ---#输出:# PR列车:0.999629161563572# AUC列车:0.9998071389056655# PR测试:0.9904709171789063# AUC测试:0.9997903902204509

回顾结果

现在让我们看看新的混淆矩阵的结果。该模型只识别错了一起欺诈案。平衡类似乎改进了模型。

模型反馈和使用MLflow

一旦选择了用于生产的模型,我们希望持续收集反馈,以确保模型仍然识别出感兴趣的行为。由于我们从基于规则的标签开始,我们希望为未来的模型提供基于人类反馈的经过验证的真实标签。这一阶段对于在机器学习过程中保持信心和信任至关重要。由于分析人员不能审查每一个单独的案例,我们希望确保我们向他们展示了精心选择的案例,以验证模型输出。例如,模型的确定性较低的预测是分析人员检查的好对象。这种反馈的加入将确保模型随着环境的变化而不断改进和进化。

MLflow在我们训练不同模型版本时帮助我们完成这个循环。我们可以跟踪我们的实验,比较不同模型配置和参数的结果。例如,在这里,我们可以使用MLflow UI比较在平衡数据集和不平衡数据集上训练的模型的PR和AUC。数据科学家可以使用MLflow跟踪各种模型指标以及任何额外的可视化和工件,以帮助决定应该在生产中部署哪个模型。然后,数据工程师将能够轻松地检索所选择的模型以及用于培训的库版本,将其作为.jar文件部署到生产中的新数据上。因此,审查模型结果的领域专家、更新模型的数据科学家和在生产中部署模型的数据工程师之间的协作将在整个迭代过程中得到加强。

https://www.youtube.com/watch?v=x_4S9r-Kks8

https://www.youtube.com/watch?v=BVISypymHzw

结论

我们已经回顾了如何使用基于规则的欺诈检测标签并使用Databricks和MLflow将其转换为机器学习模型的示例。这种方法允许我们构建一个可扩展的模块化解决方案,帮助我们跟上不断变化的欺诈行为模式。建立一个机器学习模型来识别欺诈,允许我们创建一个反馈循环,允许模型进化并识别新的潜在欺诈模式。我们已经看到,由于决策树模型的可解释性和出色的准确性,它是如何将机器学习引入欺诈检测程序的一个很好的起点。

使用Databricks平台的一个主要好处是,它允许数据科学家、工程师和业务用户bob体育客户端下载在整个过程中无缝地一起工作。准备数据、构建模型、共享结果以及将模型投入生产现在都可以在同一个平台上进行,从而实现前所未有的协作。bob体育客户端下载这种方法在以前孤立的团队之间建立信任,导致有效和动态的欺诈检测程序。

试试这个笔记本只需在几分钟内注册免费试用,就可以开始创建自己的模型。

免费试用Databricks
看到所有公司博客上的帖子