基于决策树的大规模金融欺诈检测
MLflow on Databricks
一个Databricks指南,包括代码示例和笔记本。
简介
无论用例如何,大规模检测欺诈模式都是一个挑战。大量的数据需要筛选,不断发展的技术的复杂性,以及非常少的实际欺诈行为的例子,这就相当于在不知道针长什么样的情况下,在干草堆里找到一根针。在金融领域,对安全性的额外关注以及解释如何识别欺诈行为的重要性进一步增加了任务的复杂性。
为了构建这些检测模式,领域专家团队通常会提出一组定义欺诈行为的规则。一个典型的工作流可能包括财务欺诈检测领域的主题专家,将一组特定行为的需求放在一起。然后,数据科学家可以从可用数据中获取子样本,并使用这些需求和可能的一些已知欺诈案例构建模型。为了将模式投入生产,数据工程师可能会将结果模型转换为一组带有阈值的规则,通常使用SQL实现。
该方法允许金融机构提出一组明确的特征,以识别符合《一般数据保护条例》(GDPR).然而,这种方法也带来了许多困难。使用硬编码规则集实现检测模式是非常脆弱的。对模式的任何更改都需要很长时间才能更新。这反过来又使其难以跟上和适应当前市场上发生的欺诈行为的转变。
此外,上面描述的工作流中的系统通常是孤立的,领域专家、数据科学家和数据工程师都是分开的。数据工程师负责维护大量数据,并将领域专家和数据科学家的工作转化为生产级代码。由于缺乏通用平台,领域专家和数据科学家不得不依赖bob体育客户端下载适合于一台机器的采样数据进行分析。这会导致沟通困难,最终导致缺乏合作。
在这本电子书中,我们将展示如何将几个这样的基于规则的检测用例转换为Databricks平台上的机器学习用例,统一欺诈检测的关键参与者:领域专家、数据科学家和数据工程师。bob体育客户端下载我们将学习如何创建欺诈检测数据管道,并利用从大型数据集构建模块化功能的框架来可视化数据。我们还将学习如何使用决策树和Apache Spark MLlib检测欺诈。然后,我们将使用MLflow迭代和细化模型,以提高其准确性。
利用机器学习解决金融欺诈问题
在金融领域,人们对机器学习模型有一定程度的不情愿,因为人们认为它们提供了一个“黑匣子”解决方案,无法证明已识别的欺诈案例是正确的。GDPR要求以及金融监管规定使得利用机器学习的力量似乎不可能。然而,几个成功的用例表明,应用机器学习大规模检测欺诈可以解决上述许多问题。
训练一个有监督的机器学习模型来检测金融欺诈是非常困难的,因为实际确认的欺诈行为示例数量很少。然而,存在一组已知的规则来识别特定类型的欺诈可以帮助创建一组合成标签和一组初始特征。由该领域的领域专家开发的检测模式的输出很可能已经经过了适当的批准流程,才能投入生产。它产生预期的欺诈行为标志,因此可以用作训练机器学习模型的起点。这同时缓解了三个问题:
- 缺乏培训标签,
- 决定使用什么特性,以及
- 为模型提供适当的基准。
训练机器学习模型来识别基于规则的欺诈行为标志,可以通过混淆矩阵与预期输出进行直接比较。如果结果与基于规则的检测模式密切匹配,这种方法有助于获得怀疑论者对基于机器学习的欺诈检测的信心。该模型的输出非常容易解释,与原始检测模式相比,可以作为预期假阴性和假阳性的基线讨论。
此外,如果使用决策树模型作为初始机器学习模型,则可能会进一步缓解机器学习模型难以解释的问题。由于模型被训练成一组规则,决策树很可能优于任何其他机器学习模型。当然,该模型的额外好处是最大程度的透明度,它将从本质上显示欺诈的决策过程,但没有人为干预,也不需要硬编码任何规则或阈值。当然,必须理解模型的未来迭代可能完全利用不同的算法来获得最大的精度。模型的透明性最终是通过理解算法中的特征来实现的。具有可解释的特征将产生可解释和可辩护的模型结果。
机器学习方法的最大好处是,在最初的建模工作之后,未来的迭代是模块化的,更新标签、特征或模型类型的集合非常容易和无缝,减少了生产的时间。在Databricks统一分析平台上,领域专家、数据科学家和数据工程师可以大规模地使用相同的bob体育亚洲版数据集,并直接在笔记本环境中协作。bob体育客户端下载让我们开始吧!
吸收和探索数据
在这个例子中,我们将使用一个合成数据集。
PaySim数据模拟了移动货币交易,基于一个非洲国家实施的移动货币服务一个月的财务日志中提取的真实交易样本。下表显示了该数据集提供的信息:
除了减少操作摩擦,Databricks还是运行最新机器学习模型的中心位置。用户可以使用原生Spark MLLib包或下载任何开源Python或R ML包。bob下载地址使用Databricks Runtime for Machine Learning, Databricks集群预先配置了XGBoost、scikit-learn和numpy以及流行的深度学习框架(如TensorFlow、Keras、Horovod)及其依赖项。
在这本电子书中,我们将探讨如何:
- 导入示例数据源以创建Databricks表
- 使用Databricks Visualizations探索您的数据
- 针对数据执行ETL代码
- 执行ML管道,包括模型调优XGBoost逻辑回归
探索数据
创建数据框架-现在我们已经上传了数据到数据库文件系统(DBFS),我们可以快速轻松地创建DataFrames使用Spark SQL
#创建df数据框架,其中包含我们模拟的金融欺诈检测数据集df = spark。sql(" select step, type, amount, nameorg, oldbalanceOrg, newbalancorg, nameDest, oldbalanceDest, newbalanceDest from sim_fin_fraud_detection ")
现在我们已经创建了DataFrame,让我们看一看模式和用于检查数据的前1000行。
#检查您的数据的架构df.printSchema() root |——step: integer (nullable = true) |——type: string (nullable = true) |——amount: double (nullable = true) |——oldbalanceOrg: double (nullable = true) |——newbalanceOrig: double (nullable = true) |——nameDest: string (nullable = true) |——oldbalanceDest: double (nullable = true) |——newbalanceDest: double (nullable = true)
事务类型
让我们将数据可视化,以了解数据捕获的事务类型及其对整体交易量的贡献。
为了了解我们谈论的是多少钱,让我们根据交易类型以及它们对转移现金金额的贡献(即总和(金额))来可视化数据。
Rules-based-model
我们不太可能从已知欺诈案例的大量数据集开始训练我们的模型。在大多数实际应用中,欺诈检测模式是由领域专家建立的一组规则识别的。在这里,我们创建一个名为标签基于这些规则。
#识别已知欺诈的规则df = df。withColumn(“label”,F.when((df.)oldbalanceOrg <= 56900) & (df。type == " TRANSFER ") & (df。newbalanceDest <= 105)) | ((df。oldbalanceOrg > 56900) & (df。newbalanceOrig <= 12)) | ((df。oldbalanceOrg > 56900) & (df。newbalanceOrig > 12) & (df。金额> 1160000)),1).否则(0))
在这个ETL过程完成之后,您可以再次使用display命令在散点图中查看已清理的数据。
查看数据显示的条形图(loan_stats)
可视化规则标记的数据
这些规则经常标记出相当多的欺诈案件。让我们可视化标记的事务的数量。我们可以看到,规则将大约4%的案件和11%的总金额标记为欺诈
选择合适的机器学习模型
在许多情况下,不能使用黑盒方法进行欺诈检测。首先,领域专家需要能够理解为什么某个交易被识别为欺诈。然后,如果要采取行动,就必须在法庭上出示证据。决策树是一个容易解释的模型,是这个用例的一个很好的起点。
创建训练集
为了构建和验证我们的ML模型,我们将使用80/20分割.randomSplit
.这将随机选择80%的数据用于训练,剩下的20%用于验证结果。
#分离训练数据集和测试数据集(train, test) = df.randomSplit([0.8, 0.2], seed=12345)
创建训练集
为了为模型准备数据,我们必须首先将分类变量转换为数值变量.StringIndexer
.然后,我们必须将我们希望模型使用的所有特性组装起来。除了决策树模型之外,我们还创建了一个管道来包含这些特征准备步骤,这样我们就可以在不同的数据集上重复这些步骤。请注意,我们首先将管道与训练数据相匹配,然后在后面的步骤中使用它来转换测试数据。
从pyspark。毫升进口管道从pyspark.ml.feature进口StringIndexer pyspark.ml.feature进口VectorAssembler pyspark.ml.classification进口DecisionTreeClassifier #标签的编码字符串列的列标签索引索引器= StringIndexer (inputCol =“类型”,outputCol =“typeIndexed”)# VectorAssembler变压器相结合是一个给定的列表,列成一个向量列va = VectorAssembler (inputCols =[“typeIndexed”,“数量”,“oldbalanceOrg”," newbalanceDest ", " oldbalanceDest ", " newbalanceDest ", " orgDiff ", " destDiff "], outputCol = " features ") #使用决策树分类器模型dt = DecisionTreeClassifier(labelCol = " label ", featuresCol = " features ", seed = 54321, maxDepth = 5) #创建我们的管道阶段pipeline = pipeline (stages=[indexer, va, dt]) #查看决策树模型(在CrossValidator之前)dt_model = pipeline.fit(train)
可视化模型
调用
显示()
在管道的最后一个阶段,即决策树模型,允许我们查看每个节点上所选决策的初始拟合模型。这有助于理解算法是如何得出预测结果的
显示器(dt_model.stages [1])
模型优化
为了确保我们有最佳的拟合树模型,我们将用几个参数变量交叉验证模型。鉴于我们的数据包含96%的阴性病例和4%的阳性病例,我们将使用精度-召回(PR)评估指标来解释不平衡分布。
从pyspark.ml.tuning导入CrossValidator, ParamGridBuilder #构建不同参数的网格paramGrid = ParamGridBuilder() \ . addgrid (dt。maxDepth, [5,10,15]) \ . addgrid (dt。maxBins, [10,20,30]) \ .build() #构建交叉验证crossval = CrossValidator(estimator = dt, estimatorParamMaps = paramGrid, evaluator = evaluatorPR, numFolds = 3) #构建CV管道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值Print (" PR train: ", pr_train) Print (" AUC train: ", auc_train) Print (" PR test: ",pr_test) print(" AUC test: ", auc_test)——#输出:# PR测试:0.9537894984523128 # AUC测试:0.998647996459481 # PR测试:0.9539170535377599 # AUC测试:0.9984378183482442
为了了解模型如何对结果进行错误分类,让我们使用matplotlib和pandas来可视化我们的混淆矩阵。
平衡类
我们看到该模型比原来的规则多识别了2421个案例。这并不像发现更多潜在的欺诈案件那样令人担忧,这可能是一件好事。然而,有58个病例没有被算法检测到,但最初被识别出来。我们将尝试通过使用欠抽样来平衡我们的类来进一步改进我们的预测。也就是说,我们将保留所有欺诈案例,然后对非欺诈案例进行抽样,以匹配该数字,从而获得平衡的数据集。当我们可视化我们的新数据集时,我们看到是和否的情况是50/50。
#重置无欺诈(' dfn ')和欺诈(' dfy ')的数据帧dfn = train.filter(火车。Label == 0) dfy = train.filter(火车。标签== 1) # Calculate summary metrics N = train.count() y = dfy.count() p = y/N # Create a more balanced training dataset train_b = dfn.sample(False, p, seed = 92285).union(dfy) # Print out metrics print(“Total count: %s, Fraud cases count: %s, Proportion of fraud cases: %s” % (N, y, p)) print(“Balanced training dataset count: %s” % train_b.count()) --- # Output: # Total count: 5090394, Fraud cases count: 204865, Proportion of fraud cases: 0.040245411258932016 # Balanced training dataset count: 401898 --- # Display our more balanced training dataset display(train_b.groupBy(“label”).count())
回顾结果
现在让我们看看新的混淆矩阵的结果。该模型只识别错了一起欺诈案。平衡类似乎改进了模型。
模型反馈和使用MLflow
一旦选择了用于生产的模型,我们希望持续收集反馈,以确保模型仍然识别出感兴趣的行为。由于我们从基于规则的标签开始,我们希望为未来的模型提供基于人类反馈的经过验证的真实标签。这一阶段对于在机器学习过程中保持信心和信任至关重要。由于分析人员不能审查每一个单独的案例,我们希望确保我们向他们展示了精心选择的案例,以验证模型输出。例如,模型的确定性较低的预测是分析人员检查的好对象。这种反馈的加入将确保模型随着环境的变化而不断改进和进化。
MLflow在我们训练不同模型版本时帮助我们完成这个循环。我们可以跟踪我们的实验,比较不同模型配置和参数的结果。例如,在这里,我们可以使用MLflow UI比较在平衡数据集和不平衡数据集上训练的模型的PR和AUC。数据科学家可以使用MLflow跟踪各种模型指标以及任何额外的可视化和工件,以帮助决定应该在生产中部署哪个模型。然后,数据工程师将能够轻松地检索所选择的模型以及用于培训的库版本,将其作为.jar文件部署到生产中的新数据上。因此,审查模型结果的领域专家、更新模型的数据科学家和在生产中部署模型的数据工程师之间的协作将在整个迭代过程中得到加强。
结论
我们已经回顾了如何使用基于规则的欺诈检测标签并使用Databricks和MLflow将其转换为机器学习模型的示例。这种方法允许我们构建一个可扩展的模块化解决方案,帮助我们跟上不断变化的欺诈行为模式。建立一个机器学习模型来识别欺诈,允许我们创建一个反馈循环,允许模型进化并识别新的潜在欺诈模式。我们已经看到,由于决策树模型的可解释性和出色的准确性,它是如何将机器学习引入欺诈检测程序的一个很好的起点。
使用Databricks平台的一个主要好处是,它允许数据科学家、工程师和业务用户bob体育客户端下载在整个过程中无缝地一起工作。准备数据、构建模型、共享结果以及将模型投入生产现在都可以在同一个平台上进行,从而实现前所未有的协作。bob体育客户端下载这种方法在以前孤立的团队之间建立信任,导致有效和动态的欺诈检测程序。
试试这个笔记本只需在几分钟内注册免费试用,就可以开始创建自己的模型。
联系我们为个性化的演示//www.neidfyre.com/company/contact