低代码AI:使用自动机器学习(AutoML)来检测欺诈交易

在本章中,您将构建一个Vertex AI AutoML模型,用于预测金融交易是否为欺诈交易。在创建托管数据集之前,您将在Google Colab笔记本环境中对数据集进行清洗和探索,就像在第三章中所做的那样。一旦您创建了托管数据集,您将使用AutoML创建一个分类模型,以预测交易是否为欺诈交易。在本章的过程中,还会讨论一般的分类模型以及常用于评估它们的相应指标。

本章的整体工作流程与您在第四章中处理广告媒体渠道销售预测问题时所经历的过程非常相似。因此,在本章的许多地方,您会看到更为简洁的细节,其中的讨论会非常相似。如果您在这些部分遇到困难,请参考第四章获取更多详细信息。

业务用例:金融交易的欺诈检测

正如前文提到的,本章中的任务是构建一个模型,用于预测金融交易是否为欺诈交易或合法交易。您的新公司是一家移动支付服务公司,为数十万用户提供服务。欺诈交易相对较少,通常会被其他保护措施捕获。然而,不幸的事实是,有一些欺诈交易却漏网而过,对您的用户产生负面影响。您的公司可以事后纠正这些问题,但由于用户需要报告这些交易,存在失去客户的风险。目标是通过利用机器学习(ML)构建一个定制模型,以改进您的公司正在使用的欺诈检测软件。

一个复杂因素将是相关数据集将高度不平衡。绝大多数交易将是合法交易,因此一个简单的模型,预测所有交易都是合法的,虽然准确但毫无用处。您需要利用其他指标来更好地了解您的模型在实际中的性能。

通常,这项任务可能需要由数据科学家来创建一些高级模型(如自编码器),但您的任务是迅速建立一个可用于原型设计欺诈检测系统其他部分的基准模型。这可能看起来像一项无望的任务,但请记住,在先前的项目中,您能够迅速使用AutoML创建这样的原型,用于媒体渠道销售预测。因此,您应该有信心能够应对这一挑战!

项目工作流程

本章的项目工作流程如图5-1所示,与上一章类似。因此,为避免重复,某些流程细节将被省略,但可以根据需要随时参考上一章。

既然您已经了解了业务用例和目标,您可以按照以前的项目进行数据提取和分析。在完成数据提取和分析步骤后,您将上传数据集到AutoML平台。各种特征(即将介绍)将被输入到模型中。您将评估AutoML的结果,然后部署模型以进行预测。完成这项活动后,您将拥有基准模型,供工程团队开始开发更好的欺诈检测流程。谁知道,也许这个模型实际上会投入生产。

项目数据集

项目数据集包括经过模拟的交易数据,以复制用户行为和欺诈交易。这是使用PaySim完成的。PaySim是由一组研究人员开发的开源工具,当时他们正在研究用于大数据分析的可扩展、资源高效的系统。

由于金融交易数据可能难以在不暴露用户信息的情况下使用,您的公司决定使用这些模拟数据。您公司的数据分析师已经确认,已分享的数据集在分布上与您公司应用程序中看到的实际数据非常相似,因此您可以继续假设这些数据代表了您公司在预测时想要利用的真实世界数据。

数据集已作为CSV文件提供在Google Cloud Storage(可通过oreil.ly/n1y1X 下载)。在您的数据集版本中,有10列。表5-1列出了列名称、数据类型以及有关这些列可能值的一些信息。

使用Pandas、Matplotlib和Seaborn探索数据集

本节中的所有代码,包括一些额外的示例,都包含在GitHub上的low-code-ai存储库中的一个Jupyter笔记本中。您将从头开始学习如何创建这个笔记本,但GitHub上的笔记本对于以后的独立工作或在遇到困难时使用都非常有用。

与第4章一样,您将在Jupyter Notebook环境中加载一个CSV文件,并使用Pandas、Matplotlib和Seaborn来分析和探索数据,以更好地了解您的特征。您将使用从此过程中获得的信息来选择AutoML模型中最佳的特征集。

在Google Colab笔记本中将数据加载到Pandas DataFrame中

首先,前往colab.research.google.com,打开一个新的笔记本,按照第2章和第4章中讨论的在 Colab中创建笔记本的流程进行操作。您可以通过单击名称并用新名称替换当前名称,例如Fraud_Detection_Model.ipynb,来为这个笔记本命名更有意义的名称。

接下来,在第一个代码块中键入以下代码,以导入分析和可视化金融交易数据集所需的包,并执行该单元格:

kotlin 复制代码
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns

%matplotlib inline

现在,已经导入了所需的包,下一步是将数据加载到一个Pandas DataFrame 中:

ini 复制代码
url = ('https://storage.googleapis.com/' +
'low-code-ai-book/financial_transactions.csv')

transaction_df = pd.read_csv(url)

现在,您的数据已加载到DataFrame中。在继续之前,查看一下数据的前几行总是个好主意。要查看数据的前几行,请在一个新的单元格中添加以下代码并执行该单元格:

scss 复制代码
transaction_df.head()

现在看一下DataFrame中的前五行数据。这将让您对不同列的数据有一些了解。您对数据有什么发现?表5-2和表5-3显示了此行代码的输出。

请注意,到目前为止,"step"列在您查看的所有行中都具有值1。有很多原因可以导致这种情况。例如,所有行可能具有相同的值,数据可能以某种方式按"step"进行分组,或者这只是一个巧合,因为我们只查看了五行数据。在这种情况下,实际上是数据按升序的方式按"step"进行排序,尽管从只查看五行数据根本看不出来。

您还可能注意到"type"列与"oldbalanceDest"和"newbalanceDest"列之间存在一种模式。在这些行中,每当出现"PAYMENT"或"TRANSFER"交易类型时,"oldbalanceDest"和"newbalanceDest"列都为零。这可能是巧合,但这是您以后在数据集中需要探讨的事项。

在DataFrame中的最后一列,您应该注意到一些奇怪的地方。有一列名为"isFlaggedFraud",这是您在原始模式中没有看到的列。可能有很多原因导致这种情况,但这也是为什么基本的数据探索可以很有用的另一个原因。如果在实际工作中遇到这种情况,您可能需要与分享数据的人或团队联系,以验证是否应该存在该列,以及它代表了什么。

在这种情况下,您了解到这是一列,它给出了先前模型对交易是合法还是欺诈的预测输出。为什么这对您的模型使用来说可能不是一个好的特征呢?因为您在预测时可能没有"isFlaggedFraud"。理想情况下,这是来自一个模型的输出,一旦部署了新的更好的模型,您将停用该模型。然而,这一发现仍然有用。您可以使用先前的模型作为基准进行比较,以确保您的新模型显示出改进。

探索数据集

正如您在第4章中看到的,AutoML将在训练模型之前做大部分特征描述和特征工程的工作,但仍然很重要,您要花时间去了解用于训练模型的数据。机器学习对数据的质量非常敏感。如果数据存在问题,它们不会在使用AutoML的过程中神奇地消失。

描述性分析

首先,使用DataFrame的.info()方法来快速了解您正在处理的数据量和列的数据类型。将以下代码添加到一个单元格中并执行以执行此操作:

scss 复制代码
transaction_df.info()

您应该看到有6,362,620行交易数据,其中包含了您期望的11列。数据类型都与期望的类型匹配(对象类型对应于Pandas DataFrame中的字符串数据类型)。

与之前一样,在Pandas中快速查看数据集的描述统计信息的最简单方法是使用.describe()方法。在您的笔记本中创建一个新的单元格,添加以下代码,并执行该单元格以查看描述性统计信息(如图5-2所示)。

scss 复制代码
transaction_df.describe()

通过查看每一行的计数,似乎没有空值。"step"字段在1和743之间变化相当均匀。"amount"、"oldbalanceOrg"、"newbalanceOrig"、"oldbalanceDest"和"newbalanceDest"在一个较大的范围内变化,但这在金融交易中是可以理解的。

"isFraud"列显示了数据集的一个有趣特点。一个字段的平均值,其值只有0和1,对应于等于1的值的比例。在这种情况下,大约0.129%的交易确实是欺诈交易,或者说大约每800笔交易中就有1笔是欺诈的。这代表了一个相当不平衡的数据集,可能在构建分类模型时会出现问题。您将在后面的部分探讨这些问题和可能的解决方案,但现在继续探索数据。

与实际欺诈交易相比,"isFlaggedFraud"列中有大约两倍数量的行被标记为欺诈交易。这是一个坏事吗?不一定。您希望确保您捕获到了欺诈交易,如果您标记了一些额外的交易,并在进一步考虑后认定它们是合法交易,那么这是捕获欺诈交易所付出的小代价。然而,如果您标记了太多额外的交易,那么您将浪费大量时间和资源来探索合法交易。这都是您在不久的将来评估模型时需要考虑的事情。

不过,您的描述性分析中还缺少一些列。请注意,您只对数字特征(整数和浮点数类型的列)进行了统计,但缺少了"type"、"nameOrig"和"nameDest"列的数据。如果存在数字和分类特征的混合,describe()方法将只返回数值特征的统计信息。要查看分类特征的描述性统计信息,将范围限定在那些列中。为此,将以下代码添加到一个新单元格并执行该单元格:

ini 复制代码
cols = ['type', 'nameOrig', 'nameDest']
transaction_df[cols].describe()

您正在定义一个要查看描述性统计信息的列的列表,然后使用记法transaction_df[cols],仅考虑这些列用于.describe()方法(如图5-3所示)。

再次通过将计数与DataFrame中的行数进行比较,我们看到这些列的每一行都有一个值。正如预期的那样,"type"列有五个唯一值,但请注意"nameOrig"列几乎与交易呈一对一的关系。具体来说,"nameOrig"有6,353,307个值,而总共有6,362,620笔交易。这对于构建一个好模型来说不是一个好迹象。为什么呢?因为如果有一个特征可以识别一行,或几乎可以识别一行,那么模型有可能只关注该值,而不学习特征之间更复杂的关系。对于"nameDest"列来说,似乎不是这个问题,但考虑到唯一值的数量众多,仍然存在风险。

探索性分析

在可视化数据的某些特征之前,值得探讨一下先前模型的性能如何。一个简单的方法是创建一个新列,您可以称之为"isCorrect",如果"isFraud"和"isFlaggedFraud"相同,那么"isCorrect"为1,否则为0。要计算这个新列,并计算旧模型正确预测欺诈交易的次数,请在一个新的单元格中执行以下代码:

css 复制代码
transaction_df['isCorrect'] = (
    transaction_df['isFraud'] == transaction_df['isFlaggedFraud']
)
transaction_df['isCorrect'].sum()

您应该看到的结果是6354423,但这实际上代表了什么意思呢?在Python中,布尔数据类型有两个可能的值:True和False。当您使用sum函数时,它将True值视为1,将False值视为0。因此,您看到的结果是语句transaction_df['isFraud'] == transaction_df['isFlaggedFraud'] 中True值的数量。这个语句在列具有相同值时返回True,否则返回False。回想一下,总共有6362620行数据,这意味着99.87%的交易被正确标记。

那么,旧模型是一个非常好的模型,对吧?大多数交易都不是欺诈交易,而这些交易是您最担心的。但再考虑另一个相关的问题:它正确预测了多少个欺诈交易?您可以通过查询"isFraud"列的值为1且"isCorrect"列的值也为1的地方来弄清楚。在一个新单元格中执行以下代码以查看结果:

css 复制代码
(transaction_df['isFraud']*transaction_df['isCorrect']).sum()

为什么这行代码告诉您成功标记的欺诈交易的数量?"isFraud"列的值只有在交易是欺诈交易时才为1,而"isCorrect"列为True(在算术中视为1),如果预测是正确的话。因此,将这些列的值相乘只会在两个列都为1时得到1,否则该乘积为0。将1的数量相加就得到了总的正确标记的欺诈交易数量。

正确标记的欺诈交易的数量是16。通过使用代码transaction_df['isFraud'].sum(),您可以看到欺诈交易的总数为8,213。这意味着只有0.19%的欺诈交易被成功标记。这个模型在我们看到总体准确性时似乎表现很好,但当我们提出了一个稍微不同、也许更相关的问题时,它表现得非常差。这是一个称为召回率的度量标准示例。在选择模型目标和考虑本章后面的评估指标时,您将探讨如何解释AutoML中可用的不同度量标准。

下一种可视化数据的方法是创建用于理解按值计算的欺诈交易百分比的分类特征的条形图。例如,对于"type"特征,有五个值。要创建这样的条形图,请在一个新单元格中使用以下代码来创建可视化:

scss 复制代码
transaction_df.groupby('type')['isFraud'].mean().plot.bar()

这行代码将行按"type"的值分组,并取"isFraud"列的均值。请记住,由于"isFraud"的值为1或0,这相当于值为1的百分比。然后,使用plot.bar()方法将结果绘制为条形图,如图5-4所示。

您应该立即注意到一些有趣的事情。在您的数据集中,只有两种交易类型存在欺诈交易:CASH_OUT 和 TRANSFER。您可以使用以下代码来确认这一点:

scss 复制代码
transaction_df.groupby('type')['isFraud'].value_counts()

这会输出每个值组合出现的次数。您应该看到的输出将类似于表5-4。

在这种情况下,您可以确认欺诈交易只出现在所提到的交易类型中。这意味着,只要这个数据集确实代表了您公司看到的交易,这可能是一个非常有用的特征。然而,如果新类型的欺诈交易开始出现,您的模型几乎肯定会错过它们,因为它从未见过这种情况的示例。

可视化具有分类标签的数据的另一种有用方法是将数值特征进行分桶,并查看每个桶中欺诈与合法交易的行数的百分比。分桶,或离散化,是将数值变量分割为值范围或"桶"的过程,并将每个元素分配给其中一个桶。在第4章创建直方图时,您也使用了这种方法。您可以使用此方法来探索交易金额以及发起方和目标帐户的新旧余额特征。

例如,假设您想可视化不同金额特征范围的百分比:

scss 复制代码
transaction_df['amountBkts'] = pd.qcut(transaction_df['amount'], 10)
transaction_df.groupby('amountBkts')['isFraud'].mean().plot.bar()

在查看输出之前,花点时间解析一下第一行代码。您正在在DataFrame中创建一个新列"amountBkts",其中包含桶信息。pd.qcut()函数根据分位数分配桶。您将"amount"列分成了10个桶。第一个桶包含0到10百分位数的数据,第二个包含10到20百分位数的数据,以此类推(参见图5-5)。

您可以看到一个一般趋势,这提示了您可能已经有直觉地考虑过的事情。交易金额越大,交易欺诈的可能性越大。特别是,您可以看到在交易金额在90百分位数以上的情况下,欺诈交易率增加了七倍。

要查看"oldbalanceOrg"列的相同可视化效果,将以下代码添加到一个新单元格并执行该单元格:

scss 复制代码
transaction_df['oldbalanceOrgBkts'] = pd.qcut(transaction_df['oldbalanceOrg'],
                                              10, duplicates='drop')
transaction_df.groupby('oldbalanceOrgBkts')['isFraud'].mean().plot.bar()

pd.qcut()函数中有一个新参数,duplicates='drop'。此参数用于合并重复的桶为一个单一的桶。在这种情况下,"oldbalanceOrg"列的第30百分位数为0,所以前三个桶将是相同的。这些桶被合并为30到40百分位数的桶。

如图5-6所示,"oldbalanceOrg"和"isFraud"之间肯定存在某种关系。总体趋势是,发起方帐户中的旧余额越高,欺诈的机会越高,但只限于某个点。一旦值在90到100百分位数的桶中,欺诈的机会就会减少。

作为练习,以类似的方式探索其他数值特征与标签之间的关系。这些示例的代码可以在GitHub的笔记本中找到,相应的可视化结果可以在图5-7、5-8和5-9中找到。

还有其他探索交易的方法。例如,您知道历史上只有两种类型的交易是欺诈的。您可以为其中一种类型,比如CASH_OUT,创建一个散点图,其中您绘制"newbalanceDest"与"oldbalanceDest",然后根据它们是否欺诈来着色。使用以下代码创建这个可视化效果:

ini 复制代码
cashout_df = transaction_df.query("type == 'CASH_OUT' & newbalanceDest < 1e8")
cashout_df.plot.scatter(x='oldbalanceDest',
                        y='newbalanceDest',
                        c='isFraud',
                        colormap='YlOrRd',
                        alpha=0.1)

第一行应用了两个筛选条件。第一个筛选条件提取出类型为CASH_OUT以及所有"newbalanceDest"小于1e8或100,000,000的交易。第二行是用于构建散点图的。我们设置x和y列,用于着色点的列(isFraud),以及一个颜色映射YlOrRd,以便更容易看到点。这个特定的颜色映射将较暗的颜色(红色)分配给isFraud=1,而将较浅的颜色(黄色)分配给isFraud=0。有关其他颜色映射,请参阅Matplotlib的文档。最后,由于您正在绘制许多点,您将alpha设置为0.1,以使点略微透明。这使可视化更容易解释(见图5-10)。

似乎存在一个区域,其中点更接近红色而不是黄色,或者存在更多的欺诈交易而不是合法交易。这是表明这两列之间存在某种交叉相关性的一个良好迹象。这种关系可以通过多种方式来捕捉,比如特征交叉,AutoML将在特征选择和工程过程中使用特征交叉。特征交叉是通过连接两个或多个预先存在的分类特征来创建合成特征的过程。在第8章中,当使用自定义代码模型时,您将探讨手动执行这个过程。

作为练习,继续使用本章和上一章中学到的工具来视觉化探索数据集。看看是否能发现一些意想不到的有趣见解。

导出数据集

在探索数据集后,您已准备好将其导出为最终可供Vertex AI AutoML使用的形式。在这里,您将看到如何执行此操作的提醒,但请注意,数据已经存储在Google Cloud Storage的CSV文件中,并存储在BigQuery的表中,因此在接下来的部分中,您无需加载已导出的数据集。如果您有兴趣了解如何将数据加载到BigQuery,这将是您在第6章中的项目中要完成的步骤之一。

要从Pandas DataFrame导出数据到CSV文件,您可以使用以下代码:

ini 复制代码
transaction_df.to_csv('transactions.csv', encoding='utf-8', index=False)

在将CSV文件写入后,检查文件的内容始终是一个好的做法,您可以使用!head命令来执行此操作:

bash 复制代码
!head transactions.csv

要下载文件,请按照第4章的流程操作。此外,Google Colab还在google.colab包中提供了一个函数,可以帮助您下载文件。要使用这个函数,请从google.colab包中导入该函数,并将文件下载到您的本地计算机:

javascript 复制代码
from google.colab import files
files.download('transactions.csv')

分类模型和度量标准

在开始训练模型之前,让我们先了解一下分类模型到底是什么,以及如何正确评估它们。更多的数学细节将在第7章中介绍,但至少对于分类模型的基本理解,可以帮助您理解模型的结果,并检测模型可能存在的问题。

分类模型是一种返回分类输出的模型,比如猫、狗、鱼或欺诈。在分类模型中,您事先知道要区分哪些类别。这些类别也可以是数字,例如评级或使用数值标签代替分类标签的问题。在本章的问题中,这些类别分别是0和1,代表合法和欺诈交易。

实际上,分类模型并不直接返回预测的类别,而是为所有可能的类别返回概率。通常,预测的类别只是最有可能的类别。在二元分类的情况下,有两个可能的类别,情况可能不一样。例如,假设只有在模型的输出中有至少50%的概率是欺诈交易时,您才将一笔交易分类为欺诈交易。这可能会导致错过一些欺诈案例。另一方面,如果将阈值设置得太低,比如5%,那么可能会将太多交易标记为欺诈,从而浪费太多资源来进一步研究这些交易。正如您可能猜到的,确定阈值应该放在何处既是一个建模问题,也是一个业务问题。

为了确定在哪里设置这个阈值,您可以利用不同的评估指标,根据您的业务需求来做出决策。准确度是一种简单易懂的评估指标,通常用于分类模型。然而,您已经看到了在将准确度作为主要评估指标时存在的问题。毕竟,原始模型的准确度非常高,超过了99%,但几乎没有捕获到任何欺诈交易。尽管准确度仍然是一个重要的指标,但它并不总能提供完整的图像。

这些问题往往出现在类别不平衡的情况下,也就是一个类别比其他类别要常见得多的情况。在您这里的情况下,回想一下,只有0.129%的交易是欺诈的。欺诈与合法的比例接近1:800。这种情况意味着某些问题很容易被准确度等指标所掩盖。在欺诈检测等情况下,其中正类非常稀缺,准确度很快就会变得不可靠。

您可以使用召回率和精度等指标以及准确度来更清晰地了解模型的性能。召回率可以被视为真正例率。在欺诈交易的示例中,召回率表示模型成功预测的欺诈交易所占的百分比。精度可以被视为模型在预测正类时的正确率。在欺诈交易问题中,精度代表了被预测为欺诈交易的交易中真正是欺诈的百分比。如果您的目标是积极标记欺诈交易以供审核,召回率将是一个非常重要的指标。您可能愿意牺牲一点准确度或精度来提高召回率。当然,这仍然是需要权衡的,因为审核大量交易会有资源成本。

通常,召回率和精度是根据混淆矩阵来计算的。混淆矩阵将预测分解成一个基于预测类别和实际类别的表格。示例如表5-5所示。

召回率定义为 <math xmlns="http://www.w3.org/1998/Math/MathML"> T P / ( F N + T P ) T P / (F N + T P) </math>TP/(FN+TP),或者实际正例中被预测为正例的百分比。精度定义为 <math xmlns="http://www.w3.org/1998/Math/MathML"> T P / ( F P + T P ) T P / (F P + T P) </math>TP/(FP+TP),或者被预测为正例中实际为正例的百分比。正如您所期望的,实际情况中需要在精度和召回率之间进行权衡。对于正类别(例如欺诈交易)采用较低的阈值将导致更多的假阳性和更少的假阴性,因此精度较低,召回率较高。另一方面,采用较高的阈值将导致更多的假阴性和较少的假阳性,因此精度较高,召回率较低。

如何确定精度和召回率之间的平衡是否正确?一个衡量标准是F1分数,它是精度和召回率的调和平均值。一般而言,调和平均数通常被认为是比率的"最佳平均数"。对于两个数字,这很容易写出。让P表示精度,R表示召回率。然后,F1分数可以使用以下公式计算:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> F 1 − s c o r e = 2 ∗ ( P ∗ R ) / ( P + R ) F1-score=2 * (P * R) / (P + R) </math>F1−score=2∗(P∗R)/(P+R)

F1分数往往更偏向于较小的精度和召回率。因此,这可以作为一个良好的度量标准,以确保您不会牺牲太多一个度量标准来优化另一个。

精度和召回率严重依赖于设置的阈值,但也取决于基础模型。在度量标准(包括准确度)如此严重依赖于阈值的情况下,如何确定基础模型呢?有一些仅依赖于基础模型的度量标准,例如接收器操作特征曲线下面积(ROC AUC)和精确度-召回曲线下面积(PR AUC)。这两个度量标准在0和1之间变化。度量标准的值越接近1,模型就越好。关于这些度量标准的深入讨论超出了本章的范围,但直观的理解在实践中将很有帮助。

ROC曲线绘制召回率(或真正例率)与假正例率的曲线,假正例率定义为被分类为正例的负例示例的百分比。此曲线上的不同点对应不同的阈值,因此整个曲线看到了所有可能的阈值。该曲线下面积,即ROC AUC,可以被认为是模型(独立于阈值)在给出正例实际上为正例的概率较高,相对于负例的概率的机会。这是一个非常有用的分类问题度量标准,但通常在数据集不平衡或假阴性的代价大于假阳性的情况下,它并不那么有用。你可以合理地争辩说,这就是你所处的情况,错过一个欺诈交易可能会比检查一个合法交易更昂贵。

另一个度量标准是PR曲线。其思想与ROC曲线相同,但在此你绘制精度与召回率。在数据集不平衡的情况下,PR曲线往往是更强的度量标准。为什么呢?嗯,精度和召回率都集中在正类别上,如果将正类别设置为较稀有的类别,那么您的度量标准将基于成功预测该类别而不是整个数据集。

在下一节中,当评估您在AutoML中训练的模型时,您将看到ROC曲线和PR曲线的示例。

使用AutoML训练分类模型

现在,您已经探索了您的数据,可以使用AutoML训练模型了。与第4章类似,您将在Vertex AI上创建一个托管数据集,然后探索数据集统计信息。然后,您将训练模型并检查模型性能。由于一般来说,分类指标可能对您来说较新,您将花一些时间来学习这些指标,然后继续了解特征重要性以及如何使用模型进行预测。

这些步骤在第4章中针对回归问题进行了详细介绍。因此,在本章中,您将看到对某些主题的较轻松的处理,并被引导回第4章以获取更多详细信息。

创建托管数据集并选择模型目标

请访问 console.cloud.google.com,然后进入 Vertex AI(可以使用侧边菜单或搜索栏)。在那里,选择"数据集",然后在"数据集"页面上点击"创建"按钮。将自动生成的名称替换为"fraud_detection"。与第四章的项目类似,您首先需要选择数据类型和目标。由于您正在处理表格数据并希望解决分类问题,您应该选择"表格"然后选择"回归/分类",如图5-11所示。

点击"创建"按钮,您将进入下一页,可以在此处指定数据源。在这里,您有两个选择:Google Cloud Storage中的CSV文件,您在笔记本中使用过,或者包含与您预先准备的完全相同数据的BigQuery中的表格。存储在BigQuery中的数据将附带附加的模式信息,例如每列的数据类型,而CSV文件中不包含此信息,因此您将使用此方法。

在"选择数据源"下,点击"从BigQuery中选择表格或视图"的单选按钮,然后输入以下BigQuery路径,点击"继续"按钮:

css 复制代码
ma-low-code-ai.low_code_ai.financial_transactions

数据加载和预处理大约需要15-20分钟的时间。AutoML会进行大量额外的预处理工作,以分析和准备数据,以供即将进行的训练作业使用。之后,您将准备好在Vertex AI数据集UI中探索数据。

探索数据集统计信息

一旦数据加载并准备好,您可以继续分析数据集。单击"生成统计信息"按钮。生成统计信息可能需要几分钟的时间。一旦生成,您可以单击各个列并查看统计信息。根据之前的分析,不应该有任何令人意外的发现,但在继续之前,额外查看总是值得的。例如,如果单击"type"列,您将看到如图5-12所示的统计信息。您会看到没有缺失值;有您之前看到的五个不同的值以及每个值出现的次数的细分。这里的新部分应该是良好的可视化,使您能够快速地视觉化分析每个值包含的总值的部分。

在继续下一部分之前,检查每一列,确保一切都与您之前的分析相符。注意数据类型和统计信息,并确保没有令人意外的内容。这一次您不会发现任何令人意外的情况,但养成这个习惯是很好的,而且在开始使用AutoML进行任何培训之前确认是最佳实践。

训练模型

为了训练您的模型,点击"Train New Model"按钮,然后选择"Other"选项(如图5-13所示)。确保选择"Classification"作为目标,选择"AutoML"作为模型训练方法,然后点击"Continue"按钮。

接下来,在"Model details"页面上,选择"Train new model",将模型名称设置为"fraud_detection"。同时,选择"isFraud"作为目标列。您的输入应如图5-14所示。点击"Continue"按钮进入下一页。

在"训练选项"页面上,选择用于训练的特征并确保特征被正确处理为分类或数值。在屏幕右侧,点击isFlaggedFraud、nameDest和nameOrig特征旁边的减号,将这些特征从训练过程中移除。确保step特征也被视为分类特征。这很重要,因为它代表了一个时间段而不是一个数值。特别是,step为10不应该被认为对模型的影响是step为5的两倍。请参考图5-15,确认您的页面在点击"继续"按钮之前应该是什么样子。

在最后的"计算和定价"页面上,您将设置训练预算。请注意,价格是按照进行的训练小时计算的。有关最新价格信息,请参阅Vertex AI文档。考虑到这一点,将预算设置为一小时。确保选择了"早停"选项,因为它会在不再看到改进时终止模型训练过程。如果您设置了更高的预算但最终不需要那么多时间,这将非常有用。完成后,点击"开始训练"。

完成模型训练后,您将收到一封电子邮件通知,该模型将被注册到模型注册表中。

评估模型性能

在你的模型完成训练后,你可以查看评估指标。通过侧边菜单或搜索栏,导航到Vertex AI模型注册表。点击你的模型"fraud_detection",然后点击你要查看的相应版本,如果你正在阅读本章,那就是版本1。

因为你最关心尝试预测欺诈交易,点击1类别(如图5-16所示)以查看你的模型在AutoML设置的测试数据集上的性能。请注意,你的模型的评估指标可能会因模型训练过程中的随机性而与本章中显示的指标不同。

请注意置信度阈值的滑块。你可以移动它以查看它对精确度和召回率的影响。例如,假设你的公司愿意让高达50%的标记交易是合法的,以便尽可能多地捕获欺诈行为,同时仍能够有资源来检查标记的交易。对于图5-16中表示的模型,与50%精确度相对应的阈值为0.06。也就是说,如果模型预测存在超过6%的欺诈几率,你将希望将其标记为欺诈并进行检查。请注意,在这种情况下,召回率为95.2% - 换句话说,在这种情况下,只有20笔欺诈交易中预计会漏掉1笔。

最佳置信度阈值将取决于你的业务需求和目标,因此在这里没有一个单一的正确答案。

模型特征重要性

如果你点击界面侧边的"所有标签",然后滚动到页面底部,你可以看到模型的特征重要性。回想一下第四章,特征重要性度量了特征对模型预测的影响。请注意,与本章中显示的重要性相比,你在模型中看到的确切重要性可能会有所不同。

这个模型的特征重要性如图5-17所示。oldbalanceOrg和newbalanceOrig特征最重要,amount和type分别排在第三和第四位。回顾一下,在笔记本环境中探索数据时,这些特征似乎在特征值和欺诈交易百分比之间有着明显的模式。一般来说,检查这些特征重要性是为了确保模型学到的内容没有任何问题。模型可能会注意到你没有注意到的模式,这很常见,但如果你的模型似乎学到了一些荒谬的东西,这应该引起你的警惕。例如,如果一个用于预测出租车费用的模型学到了乘车距离是最不重要的特征,这可能是一个更深入探究数据的原因。特征重要性对于利益相关者来说非常有用,以了解模型如何进行预测,对于数据科学家和机器学习工程师来说,它有助于理解如何调试模型,以便在出现令人惊讶或荒谬的预测时了解如何解决问题。

从模型获取预测

既然您已经看到了模型的评估指标,您可以开始部署模型进行预测。如果在部署模型的过程中遇到困难,可以参考第4章,因为本章的流程将与第4章相同。 完成以下步骤来部署您的模型,将所有未提及的选项保留为默认值:

  1. 在"定义端点"页面上,将端点命名为fraud_endpoint。
  2. 在"模型设置"页面上,选择n1-standard-2,2个vCPU,7.5GiB内存作为机器类型。使用较小的机器类型将降低已部署模型的成本,并满足本示例的需求。
  3. 在"模型设置"页面上,在可解释性选项下,勾选"为该模型启用特征归因"复选框。
  4. 在"模型监控"页面上,禁用模型监控,因为您在此不需要它。
  5. 完成这些步骤后,单击"部署"。模型将需要几分钟来完成部署。一旦模型完成部署,您可以在页面底部测试模型。 使用以下值来测试您的模型,注意您的确切结果将与图5-18中显示的模型不同:

(接下来的测试值,您可以将它们添加到代码单元中,并运行以获得模型的预测结果。)

请按照这些步骤完成模型的部署,然后您将能够测试模型的性能。如果需要进一步的帮助或有其他问题,请随时提问。

完成后,单击"预测"按钮。要查看您的模型对欺诈交易的预测概率,请将"选定的标签"更改为1。

对于图5-18中显示的模型,"置信度分数"是预测的概率。在这种情况下,它给出了交易有91%的概率是欺诈交易。根据之前的评估指标和阈值的讨论,这笔交易将被标记为欺诈交易。您还可以查看局部特征重要性。最高的特征重要性值对应于oldbalanceOrg特征。在这种情况下,帐户中有100万美元的CASH_OUT交易的余额完全一致。根据您的模型,这笔交易很可能是欺诈交易。

作为练习,尝试不同的特征值组合,查看预测的概率和相应的特征归因是什么。

总结

您已经在过去两章中使用AutoML培训了一个回归模型和一个分类模型!在本章中,您在Google Colab环境中探索了数据,然后将该数据上传到Vertex AI的托管数据集中,然后使用AutoML训练了分类模型。原始模型的召回率明显低于新模型的召回率,这意味着新模型最终将更好地标记交易并保护客户的帐户。

不过,这只是您的机器学习之旅的开始。在许多情况下,您可能希望对模型训练过程拥有更多的控制。在实践中,这意味着朝着更低代码和自定义代码解决方案迈进。下一章将介绍如何在BigQuery中使用SQL探索数据,以及如何使用BigQuery ML在SQL中训练机器学习模型。

相关推荐
Jeremy_lf10 分钟前
【生成模型之三】ControlNet & Latent Diffusion Models论文详解
人工智能·深度学习·stable diffusion·aigc·扩散模型
桃花键神1 小时前
AI可信论坛亮点:合合信息分享视觉内容安全技术前沿
人工智能
野蛮的大西瓜1 小时前
开源呼叫中心中,如何将ASR与IVR菜单结合,实现动态的IVR交互
人工智能·机器人·自动化·音视频·信息与通信
CountingStars6192 小时前
目标检测常用评估指标(metrics)
人工智能·目标检测·目标跟踪
tangjunjun-owen2 小时前
第四节:GLM-4v-9b模型的tokenizer源码解读
人工智能·glm-4v-9b·多模态大模型教程
冰蓝蓝2 小时前
深度学习中的注意力机制:解锁智能模型的新视角
人工智能·深度学习
橙子小哥的代码世界2 小时前
【计算机视觉基础CV-图像分类】01- 从历史源头到深度时代:一文读懂计算机视觉的进化脉络、核心任务与产业蓝图
人工智能·计算机视觉
新加坡内哥谈技术3 小时前
苏黎世联邦理工学院与加州大学伯克利分校推出MaxInfoRL:平衡内在与外在探索的全新强化学习框架
大数据·人工智能·语言模型
fanstuck3 小时前
Prompt提示工程上手指南(七)Prompt编写实战-基于智能客服问答系统下的Prompt编写
人工智能·数据挖掘·openai
lovelin+v175030409663 小时前
安全性升级:API接口在零信任架构下的安全防护策略
大数据·数据库·人工智能·爬虫·数据分析