基于决策树的大规模财务欺诈检测
Databricks上的MLflow
一个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可视化探索您的数据
- 对数据执行ETL代码
- 执行ML管道,包括模型调优XGBoost逻辑回归
探索数据
创建dataframe—现在我们已经将数据上传到数据库文件系统(DBFS),我们可以快速,轻松地创建DataFrames使用Spark SQL
#创建包含模拟金融欺诈检测数据集df = spark的df DataFrame。sql(" select step, type, amount, nameorigin, oldbalanceOrg, newbalanceorigin, 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) |——nameorigin: string (nullable = true) |——oldbalanceOrg: double (nullable = true) |——newbalanceorigin: double (nullable = true) |——nameDest: string (nullable = true) |——oldbalanceDest: double (nullable = true) |——newbalanceDest: double (nullable = true)
交易类型
让我们对数据进行可视化,以了解数据捕获的事务类型及其对总体交易量的贡献。
为了了解我们谈论的是多少钱,让我们根据交易类型及其对转移的现金量的贡献(即sum(amount))来可视化数据。
Rules-based-model
我们不太可能从已知欺诈案例的大型数据集开始训练我们的模型。在大多数实际应用中,欺诈检测模式是由领域专家建立的一组规则来识别的。在这里,我们创建了一个列标签基于这些规则。
#基于df = df识别已知欺诈的规则。withColumn(" label ");oldbalanceOrg <= 56900) & (df;type == " TRANSFER ") & (df;newbalanceDest <= 105)) | ((df;oldbalanceOrg > 56900) & (df;newbalanceorigin <= 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”,#使用决策树分类器模型dt = decisiontreecclassifier (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%的阳性病例组成,我们将使用Precision-Recall (PR)评估指标来解释不平衡分布。
从pyspark. ll .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)
模型的性能
我们通过比较训练集和测试集的Precision-Recall (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)—# Output: # PR train: 0.9537894984523128 # AUC train: 0.998647996459481 # PR test: 0.9539170535377599 # AUC test: 0.9984378183482442
为了了解模型是如何对结果进行错误分类的,让我们使用matplotlib和pandas来可视化混淆矩阵。
平衡课程
我们看到模型比原始规则多识别了2421个案例。这并不像发现更多潜在的欺诈案件那样令人担忧,这可能是一件好事。然而,有58例未被算法检测到,但最初被识别出来。我们将尝试通过使用欠采样平衡我们的类来进一步改进我们的预测。也就是说,我们将保留所有欺诈案例,然后对非欺诈案例进行抽样,以匹配该数字,以获得平衡的数据集。当我们可视化我们的新数据集时,我们看到是和不是的情况是50/50。
#重置dataframe为no fraud (' dfn ')和fraud (' dfy ') dfn = train.filter(train. filter)标签== 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