【译】如何用Apache Spark和LightGBM构建机器学习模型来预测信用卡欺诈

简介: 如何用Apache Spark和LightGBM构建机器学习模型来预测信用卡欺诈

如何用Apache Spark和LightGBM构建机器学习模型来预测信用卡欺诈

原文链接 https://towardsdatascience.com/how-to-perform-credit-card-fraud-detection-at-large-scale-with-apache-spark-and-lightgbm-61a982de8672


编译:抚月,阿里巴巴计算平台事业部 EMR 高级工程师,Apache HDFS Committer,目前从事开源大数据存储和优化方面的工作。


任何一家发行信用卡的金融机构,都要做防欺诈检测。他们平台上每天不断的成千上万的交易记录,他们用这些大规模的数据集来做检测。虽然在个人电脑上,在Jupyter notebook上面对小量的静态数据集做机器学习的模型训练,相对比较简单。 但是在金融机构的真实环境下,大量的交易数据存放在Hadoop或者数据湖里,这时部署机器学习模型就存在巨大挑战。这篇文章,我将向你们展示如何在Apache Spark环境下,利用LightGBM来构建和训练模型。 LightGBM被认为是Gradient Boosting算法的高效实现,在数据科学领域被广泛使用。

Apache Spark是一个in-memory的集群化的运行环境,用来存储和处理数据,比起从(单机)SSD或磁盘访问数据会快上千倍。假设数据集存在于Hadoop,S3,数据库或本地文件,第一步需要让Spark集群可以访问这些数据(将数据转为Spark dataframe)。在这个例子中,我将Machine Learning Group of ULB的数据,以CSV格式加载到Spark dataframe中。 Spark集群是6gb内存,部署了Databricks社区版。下面是用Spark加载数据的代码:

# File location and type
file_location = "/FileStore/tables/creditcard.csv"
file_type = "csv"

# CSV options
infer_schema = "true"
first_row_is_header = "true"
delimiter = ","

df = spark.read.format(file_type) \
  .option("inferSchema", infer_schema) \
  .option("header", first_row_is_header) \
  .option("sep", delimiter) \
  .load(file_location)

数据集包含了300,000条记录,31个变量,是关于欧洲信用卡持有者的交易记录。其中28个变量是数值型,是对一些未披露的原始参数进行主成分分析(PCA)得到的。剩下的3个变量是交易数量,交易时间(秒,相对于第一次交易),交易标签(表示是否真实或诈骗)。虽然数据集比较小,但是我们选择了Apache Spark来做训练,因此相同的代码同样适用于大规模的数据集。

数据集中,标记为真实的数据, 和标记为诈骗的数据相比,数量严重不平衡。其中只有492个样本是跟标记为诈骗的交易有关,比起整个数据集来说量很小。你可以访问这个数据集

下一步,是从dataframe中,选择我们想要作为输入变量和目标变量的列。当构建生产级的ML模型时,比较好的做法是做一些数据变换,比如用LabelEncoder或者OneHotEncoder的方式,将类目列转为数值列,作为整个pipeline当中的几个stage。这个pipeline可以用来变换训练、验证、或者测试数据,而不会将测试用例暴露给训练数据(当我们做standardized scaling的时候)。而且代码也好维护。可以参考Spark的pipeline接口文档

feature_cols = ["V" + str(i) for i in range(1,29)] + ["Amount"]
assembler = VectorAssembler(inputCols=feature_cols, outputCol="features")
stages = [assembler]

下一步,我们添加一个LightGBMClassifier实例到pipeline。LightGBMClassifier这个类包含在MMLSpark库中,是由Microsoft Azure团队维护的一个库。按照这个步骤,可以将其添加到集群中。我通过maven依赖引入了mmlspark这个包,使用版本0.17。然后,可以通过Python import LightGBMClassifier。

使用LightGBM的时候,对超参数(hyperparameters)进行调优非常重要,比如叶子数量、最大深度、迭代次数等。对相同数据训练出来的模型,性能差异可能会因为超参数的值的不同而非常大。

通常,这需要进行一个交叉验证实验,用一些超参数值空间搜索策略,比如全网格搜索、随机搜索、贝叶斯优化,或者树状结构Parzen估计方法(TPE)来找到超参数的最优值,从而使得验证数据集上模型的性能最大化。通过最小化一些预定义的错误量,比如二进制错误;或者最大化一些分数,比如ROC曲线下的面积或者F1分数。

根据我们想搜索的参数值空间的大小,以及我们期望得到的模型的性能的不同,这些搜索可能会跑很长时间。在这种情况下,我决定调优7个LightGBM模型的超参数。大多数参数是实值,意味着搜索的参数空间是非常深的。

我用了Kaggle执行环境里面的Hyperopt库。为了在有限的时间内搜索超参数空间,评估不同的超参数值的组合,我使用了一些优化策略来找到超参数的近乎最优值,只用了较少的几个评估回合。我用树状结构Parzen估计方法,在200次的超参数组合的评估之后, 我找到了超参数的最优值。 notebook里面,是我在Spark里训练这个模型时,用来确定超参数的代码。

我用Databricks的社区版,花了2个小时。如果你可以有更多的时间访问Spark集群,你也可以用Spark里面的ParamGridBuilder和CrossValidator这2个类来搜索和评估超参数值。下面是实例代码。

下面,是我在Kaggle的python环境中进行模型调优,得到的大多数最优超参数值,以及Spark例子中的lambda L2正则化参数。注意,我设置了LightGBMClassifier的一个值isUnbalance=True,从而可以处理之前提到的数据集不平衡的问题。

best_params = {        
    'bagging_fraction': 0.8,
         'bagging_freq': 1,
         'eval_metric': 'binary_error',
         'feature_fraction': 0.944714847210862,
    'lambda_l1': 1.0,
         'lambda_l2': 45.0,
         'learning_rate': 0.1,
         'loss_function': 'binary_error',
         'max_bin': 60,
         'max_depth': 58,
         'metric': 'binary_error',
         'num_iterations': 379,
         'num_leaves': 850,
    'objective': 'binary',
         'random_state': 7,
         'verbose': None
}
lgb = LightGBMClassifier(
     learningRate=0.1,
     earlyStoppingRound=100,
           featuresCol='features',
        labelCol='label',
        isUnbalance=True,
      baggingFraction=best_params["bagging_fraction"],
    baggingFreq=1,
    featureFraction=best_params["feature_fraction"],
    lambdaL1=best_params["lambda_l1"],
    # lambdaL2=best_params["lambda_l2"],
    maxBin=best_params["max_bin"],
    maxDepth=best_params["max_depth"],
    numIterations=best_params["num_iterations"],
    numLeaves=best_params["num_leaves"],
    objective="binary",
    baggingSeed=7                  
)
paramGrid = ParamGridBuilder().addGrid(
  lgb.lambdaL2, list(np.arange(1.0, 101.0, 10.0))
).build()
evaluator = BinaryClassificationEvaluator(labelCol="label",metricName="areaUnderROC")
crossValidator = CrossValidator(estimator=lgb,
                          estimatorParamMaps=paramGrid, 
                          evaluator=evaluator, 
                          numFolds=2)   
stages += [crossValidator]
pipelineModel = Pipeline(stages=stages)

下一步是将数据集分为训练集和测试集。我们会用训练集去拟合我们刚才创建的pipeline(调用Spark pipeline的fit方法),其中包含了特征装配和模型训练。然后我们用这个pipeline去变换测试集,来生成预测结果。

train, test = df.randomSplit([0.8, 0.2], seed=7)
model = pipelineModel.fit(train)
preds = model.transform(test)

一旦我们从测试数据集拿到预测结果,我们可以用它们衡量我们模型的性能。Spark提供了BinaryClassificationEvaluator,可以用来计算ROC曲线的面积。

为了计算其它相关的指标,比如精度、召回、F1分数,我们可以利用测试集的预测标签和实际标签。

binaryEvaluator = BinaryClassificationEvaluator(labelCol="label")
print ("Test Area Under ROC: " + str(binaryEvaluator.evaluate(preds, {binaryEvaluator.metricName: "areaUnderROC"})))
#True positives
tp = preds[(preds.label == 1) & (preds.prediction == 1)].count() 
#True negatives
tn = preds[(preds.label == 0) & (preds.prediction == 0)].count()
#False positives
fp = preds[(preds.label == 0) & (preds.prediction == 1)].count()
#Falsel negatives
fn = preds[(preds.label == 1) & (preds.prediction == 0)].count()
print ("True Positives:", tp)
print ("True Negatives:", tn)
print ("False Positives:", fp)
print ("False Negatives:", fn)
print ("Total", preds.count())  
r = float(tp)/(tp + fn)  
print ("recall", r)  
p = float(tp) / (tp + fp)
print ("precision", p)
f1 = 2 * p * r /(p + r)  
print ("f1", f1)

在这个例子里,AUC-ROC分数是0.93, F1分数是0.70. 在Kaggle notebook里,在训练之前,我还用了SMOTE来平衡数据集,结果AUC-ROC分数是0.98, F1分数是0.80。我对超参数值的组合做了200次的评估。如果我们想进一步提高模型的性能,那么下一步显然是在Spark里改进SMOTE,在拟合流水线之前先平衡一下训练集。我们还可以更深入地搜索超参数空间,通过执行更多次的超参数值组合的评估的方式。

除了在Spark上训练一个高性能的LightGBM模型,数据科学家遇到的另一个巨大挑战是管理这样一个生命周期----准备数据、选择模型、训练、调优、保存最优参数值、部署训练好的模型、通过API访问输出的预测值。MLFlow是一个开源的解决方案,可以解决这些问题。我建议感兴趣的读者去学习它。我可以写一篇关于如何如何将它整合进工作流里面。就像我上面展示的那样。

你可以参考上面的那些步骤,我放在了Github repo上。这是另一个notebook我用来进行参数调优实验。

我希望这篇文章对你开始在Apache Spark上用LightGBMClassifier实现机器学习算法带来帮助。如果在尝试过程中遇到什么问题,欢迎在评论区提问。

相关实践学习
数据湖构建DLF快速入门
本教程通过使⽤数据湖构建DLF产品对于淘宝用户行为样例数据的分析,介绍数据湖构建DLF产品的数据发现和数据探索功能。
快速掌握阿里云 E-MapReduce
E-MapReduce 是构建于阿里云 ECS 弹性虚拟机之上,利用开源大数据生态系统,包括 Hadoop、Spark、HBase,为用户提供集群、作业、数据等管理的一站式大数据处理分析服务。 本课程主要介绍阿里云 E-MapReduce 的使用方法。
目录
相关文章
|
18小时前
|
机器学习/深度学习 运维 持续交付
构建高效自动化运维体系:Ansible与Docker的完美结合构建高效机器学习模型的五大技巧
【4月更文挑战第30天】 在当今快速发展的云计算和微服务架构时代,自动化运维已成为维持系统稳定性和提高效率的关键。本文将探讨如何通过结合Ansible和Docker技术构建一个高效的自动化运维体系。文章不仅介绍了Ansible与Docker的基本原理和优势,还详细阐述了如何整合这两种技术以简化部署流程、加强版本控制,并提高整体运维效率。通过案例分析,我们将展示这一组合在实际环境中的应用效果,以及它如何帮助企业实现持续集成和持续部署(CI/CD)的目标。 【4月更文挑战第30天】 在数据驱动的时代,构建一个高效的机器学习模型是获取洞察力和预测未来趋势的关键步骤。本文将分享五种实用的技巧,帮助数
|
20小时前
|
机器学习/深度学习 数据采集 前端开发
【Python机器学习专栏】模型泛化能力与交叉验证
【4月更文挑战第30天】本文探讨了机器学习中模型泛化能力的重要性,它是衡量模型对未知数据预测能力的关键。过拟合和欠拟合影响泛化能力,而交叉验证是评估和提升泛化能力的有效工具。通过K折交叉验证等方法,可以发现并优化模型,如调整参数、选择合适模型、数据预处理、特征选择和集成学习。Python中可利用scikit-learn的cross_val_score函数进行交叉验证。
|
20小时前
|
机器学习/深度学习 算法 前端开发
【Python机器学习专栏】机器学习中的模型融合技术
【4月更文挑战第30天】模型融合,即集成学习,通过结合多个模型提升预测性能。常见方法包括:Bagging(如Random Forest)、Boosting(如AdaBoost、XGBoost)和Stacking。Python中可使用`scikit-learn`实现,例如BaggingClassifier示例。模型融合是机器学习中的强大工具,能提高整体性能并适应复杂问题。
|
20小时前
|
机器学习/深度学习 Python
【Python 机器学习专栏】模型选择中的交叉验证与网格搜索
【4月更文挑战第30天】交叉验证和网格搜索是机器学习中优化模型的关键技术。交叉验证通过划分数据集进行多次评估,如K折和留一法,确保模型性能的稳定性。网格搜索遍历预定义参数组合,寻找最佳参数设置。两者结合能全面评估模型并避免过拟合。Python中可使用`sklearn`库实现这一过程,但需注意计算成本、过拟合风险及数据适应性。理解并熟练应用这些方法能提升模型性能和泛化能力。
|
20小时前
|
机器学习/深度学习 数据可视化 TensorFlow
【Python 机器学习专栏】使用 TensorFlow 构建深度学习模型
【4月更文挑战第30天】本文介绍了如何使用 TensorFlow 构建深度学习模型。TensorFlow 是谷歌的开源深度学习框架,具备强大计算能力和灵活编程接口。构建模型涉及数据准备、模型定义、选择损失函数和优化器、训练、评估及模型保存部署。文中以全连接神经网络为例,展示了从数据预处理到模型训练和评估的完整流程。此外,还提到了 TensorFlow 的自动微分、模型可视化和分布式训练等高级特性。通过本文,读者可掌握 TensorFlow 基本用法,为构建高效深度学习模型打下基础。
|
1天前
|
机器学习/深度学习 Cloud Native 持续交付
构建高效机器学习模型的策略与实践构建未来:云原生技术在企业数字化转型中的关键作用
【4月更文挑战第30天】 在机器学习领域,构建一个高效的模型不仅需要深厚的理论基础,还需结合先进的技术手段和策略。本文将探讨一系列提升模型性能的方法,包括数据预处理、特征选择、模型调参以及集成学习等。通过具体案例分析,揭示这些方法如何在实际问题中得以应用,并讨论它们对模型性能的影响。文中还将涉及最新的研究进展,为读者提供前瞻性的指导意义。 【4月更文挑战第30天】随着企业加速其数字化转型之旅,云原生技术已成为推动创新和灵活性的核心。本文深入探讨了云原生架构的原则,包括微服务、容器化、持续集成/持续部署(CI/CD)、以及声明式APIs。分析了这些技术如何共同促进可伸缩性、敏捷性和容错性,同时
|
1天前
|
机器学习/深度学习 数据采集 监控
构建高效机器学习模型的策略与实践云端防御:融合云计算与网络安全的未来策略
【4月更文挑战第29天】 在数据驱动的时代,构建一个高效的机器学习模型对于解决复杂问题至关重要。本文将探讨一系列策略和最佳实践,旨在提高机器学习模型的性能和泛化能力。我们将从数据处理的重要性入手,进而讨论模型选择、训练技巧、超参数调优以及模型评估方法。通过这些策略的实施,读者将能够构建出更加健壮、准确的模型,并有效地避免过拟合和欠拟合问题。
|
2天前
|
机器学习/深度学习 存储 人工智能
人工智能平台PAI产品使用合集之是否可以在模型部署发布后以http接口形式提供给业务开发人员使用
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
2天前
|
机器学习/深度学习 人工智能 NoSQL
人工智能平台PAI产品使用合集之机器学习PAI EasyRec训练时,怎么去除没有意义的辅助任务的模型,用于部署
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
2天前
|
机器学习/深度学习 人工智能 分布式计算
人工智能平台PAI产品使用合集之如何配置DSSM模型负采样item表的schema
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。

推荐镜像

更多