DeepSeek-R1+ML混合欺诈检测

本文介绍如何将传统ML与DeepSeek-R1推理引擎结合以提高欺诈检测效率。

DeepSeek-R1+ML混合欺诈检测

在数字交易占主导地位的时代,欺诈已成为一种复杂且无处不在的威胁。到2026年,全球欺诈损失预计将达到430亿美元,仅在美国,每14秒就发生一起身份盗窃案。随着犯罪分子利用人工智能(AI)发起前所未有的攻击,企业面临一个紧迫的问题:他们如何才能在这场高风险竞赛中保持领先?

今天,我们将探讨当配备传统的机器学习模型和推理大型语言模型引擎时,AI代理如何使欺诈检测更加可解释和稳健。

欺诈挑战的日益增长

请考虑这些惊人的统计数据:

这是一场军备竞赛:欺诈者正在利用AI驱动的卡测试扩大业务规模,逃避检测,并利用零日漏洞,而防御者(好人)需要同样或更好的自适应工具来保持领先一步。

问题在于,欺诈者正在以比机构更快的速度进行调整,而遗留系统正努力跟上步伐。这些系统的主限制是:

  • 基于规则的引擎:僵化的“如果-则”逻辑无法应对新颖的攻击模式。
  • 机器学习:虽然ML模型擅长检测已知的欺诈模式,但它们是“黑盒”,无法解释决策。更糟糕的是,它们在数据漂移——交易行为的变化使得历史数据过时时表现不佳。

1、自主AI的兴起

AI代理是能够推理学习行动的自主系统,使用API和数据库等工具。与静态ML模型不同,它们可以:

  • 分析上下文:交叉引用交易与用户历史记录、位置和市场趋势。
  • 自我改进:使用强化学习(RL)来适应新威胁。
  • 解释决策:生成易于理解的报告(例如,“凌晨2点在用户家34英里外的城市花费316美元购买杂货是可疑的”)。
  • 行为分析:检测微妙的红旗(例如,仓促的结账流程,账单地址与发货地址不匹配)。

对于本文,我们将为代理配备一个传统的ML模型以及一个推理引擎,以便更好地解释交易。

什么是AI代理

2、训练机器学习模型

为了训练我们的ML模型,我们将使用Kaggle上公开的信用卡交易数据。该数据集包含超过一百万笔欺诈和非欺诈信用卡交易。

接下来,我们将简要解释训练ML模型的步骤:

  • 第一步是删除任何不必要的特征,如名字、姓氏、出生日期等。
  • 接下来,我们标记并编码文本特征,如商户名称、类别和街道。
  • 最后,我们缩放特征,定义预测标签(is_fraud=0或1),将数据拆分为训练集和测试集,并训练机器学习模型孤立森林。

确保在最后保存模型,以便稍后由我们的代理作为工具使用。

# 导入必要的库  
import pandas as pd  
from sklearn.model_selection import train_test_split  
from sklearn.preprocessing import StandardScaler  
from sklearn.preprocessing import LabelEncoder  
import joblib  
from sklearn.metrics import classification_report  
  
# 保存训练好的模型到文件  
  
# 加载数据集  
data = pd.read_csv('Fraud/fraudTrain.csv')  
data.head()  
data.drop_duplicates()  
# 删除任何无用的列(例如,交易ID)  
data = data.drop(columns=["Unnamed: 0", "first", "last", "state", "city_pop", "job", "dob"])  
# 对分类变量进行编码  
# 标签编码二进制分类特征(例如,性别)  
  
encoder = LabelEncoder()  
data["merchant"] = encoder.fit_transform(data["merchant"])  
data["category"] = encoder.fit_transform(data["category"])  
data["street"] = encoder.fit_transform(data["street"])  
data["trans_num"] = encoder.fit_transform(data["trans_num"])  
data["city"] = encoder.fit_transform(data["city"])  
data["gender"] = encoder.fit_transform(data["gender"])  
data["trans_date_trans_time"] = encoder.fit_transform(data["trans_date_trans_time"])  
  
  
# 保存编码器(这将在预测期间允许加载它)  
joblib.dump(encoder, 'label_encoder.pkl')  
  
# 将特征(X)和目标变量(y)分开  
X = data.drop(columns=['is_fraud'])  
y = data['is_fraud']  
  
# 将数据拆分为训练集和测试集(70%训练,30%测试)  
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)  
  
# 缩放数值特征  
scaler = StandardScaler()  
X_train_scaled = scaler.fit_transform(X_train)  
joblib.dump(scaler, 'scaler.pkl')  
  
X_test_scaled = scaler.transform(X_test)  
  
from sklearn.ensemble import IsolationForest  
  
# 训练孤立森林模型(假设1%的欺诈案例,因此设置污染率)  
model = IsolationForest(contamination=0.03, random_state=42)  
model.fit(X_train_scaled)  
# 在测试集上进行预测  
# 孤立森林返回-1表示异常(欺诈),1表示正常交易  
y_pred = model.predict(X_test_scaled)  
  
# 转换预测(-1表示欺诈 -> 1,1表示非欺诈 -> 0)  
y_pred = [1 if x == -1 else 0 for x in y_pred]  
print(classification_report(y_test, y_pred))  
  
joblib.dump(model, 'fraud_model.pkl')

让我们测试一下模型在一个样本交易上的效果:

# 导入必要的库  
import pandas as pd  
from sklearn.model_selection import train_test_split  
from sklearn.preprocessing import StandardScaler  
from sklearn.preprocessing import LabelEncoder  
import joblib  
import json  
from sklearn.metrics import classification_report  
  
  
# 从文件加载保存的模型  
model = joblib.load('fraud_model.pkl')  
# 加载数据集  
  
transaction = '''{  
        "trans_date_trans_time": "2019-12-09 03:23:21",  
        "cc_num": 2266735643685262,  
        "merchant": "Koepp-Parker",  
        "category": "grocery_pos",  
        "amt": 316.82,  
        "first": "Carlos",  
        "last": "Chung",  
        "gender": "M",  
        "street": "8957 Russell Key",  
        "city": "Grant",  
        "state": "AL",  
        "zip": 35747,  
        "lat": 34.4959,  
        "long": -86.259,  
        "city_pop": 5901,  
        "job": "Curator",  
        "dob": "1972-07-25",  
        "trans_num": "1e787b206a1a9154a5f397dfaa6f6b40",  
        "unix_time": 1355023401,  
        "merch_lat": 35.177042,  
        "merch_long": -86.942305  
    }  
    '''  
  
# 将JSON字符串转换为字典  
transaction_data = json.loads(transaction)  
  
transaction_data = {key: value for key, value in transaction_data.items() if key not in ["first", "last", "state", "city_pop", "job", "dob","is_fraud"]}  
  
df = pd.DataFrame([transaction_data])  
  
# 应用与训练期间相同的预处理:  
encoder = joblib.load('label_encoder.pkl')  
#encoder = LabelEncoder()  
# 对分类变量进行编码  
df["merchant"] = encoder.fit_transform(df["merchant"])  
df["category"] = encoder.fit_transform(df["category"])  
df["street"] = encoder.fit_transform(df["street"])  
df["trans_num"] = encoder.fit_transform(df["trans_num"])  
df["city"] = encoder.fit_transform(df["city"])  
df["gender"] = encoder.fit_transform(df["gender"])  
df["trans_date_trans_time"] = encoder.fit_transform(df["trans_date_trans_time"])  
  
  
scaler = joblib.load('scaler.pkl')  
# 缩放数值特征(使用与训练期间相同的缩放器)  
df_scaled = scaler.transform(df)  
  
# 使用训练好的模型预测交易是否欺诈  
y_pred = model.predict(df_scaled)  
#print(y_pred)  
# 转换预测(-1表示欺诈 -> 1,1表示非欺诈 -> 0)  
is_fraud = 1 if y_pred[0] == -1 else 0  
  
print(f"欺诈交易: {is_fraud}")

欺诈交易: 0

3、设置用于分析交易的LLM

接下来我们要为代理配备一个推理LLM,该LLM将根据交易细节和以前的购买历史分析交易并确定其是否欺诈。

我们将使用Deepseek模型作为LLM,因为它具有较长的思维链和先进的推理能力(有关更多信息,请参阅此基准测试:检查此基准测试):

基准测试Deepseek

为了本教程,我们将使用UbiAI平台上的DeepSeek-R1-Distill-Llama-70B API。使用UbiAI,我们可以记录和评估每个查询的LLM响应,这对于稍后使用强化学习改进模型至关重要。

UbiAI API用于使用Deepseek

确保设置monitor_model: True以便能够跟踪每个查询的模型响应。

让我们在UbiAI游乐场中测试一下模型:

看起来工作正常,以下是Deepseek模型的完整响应:

<think>  
好吧,我需要分析这笔信用卡交易以确定其是否欺诈。让我一步一步地分析。  
  
首先,交易日期和时间是2019年12月8日,00:26:16。这是很晚的时间,几乎是午夜。我想知道持卡人通常是否会在这样的时间购物。如果Carlos Chung通常在白天购物,这可能是一个红旗。  
  
信用卡号是2266735643685262。我不知道这张卡是否被报告为被盗或与任何先前的欺诈相关联,但这值得检查。也许看看最近是否有任何未经授权的交易在这张卡上。  
  
商户是"Bogisich Inc",类别是"grocery_pos",我假设这意味着一家杂货店的销售点。283.51美元的杂货店购买并不太不寻常,但取决于Carlos的通常消费习惯。如果他通常在杂货店花费大约这个金额,这可能是正常的,但如果他通常花费较少,这可能是可疑的。  
  
查看位置详情,交易地点在Grant, AL,邮政编码为35747。纬度和经度是34.4959, -86.259。商户的位置是35.189602, -86.344231。我应该检查这些位置是否合理。如果Carlos在或接近Grant, AL附近的时间进行交易,这可能是合法的。但如果他在其他地方,特别是在远离的地方,那就有问题了。  
  
持卡人的个人信息:Carlos Chung,男性,生于1972年7月25日。他的工作是策展人,这可能意味着他有稳定的收入,但这不一定意味着不是欺诈。他的地址是8957 Russell Key,Grant, AL。我应该验证这是否与存档的账单地址相符。  
  
交易编号是"1dac0908859f67f9d27638bc11df5119",Unix时间是1354926376。我可以将其Unix时间转换为日期以进行交叉验证。让我快速做一下。Unix时间1354926376对应于2012年12月8日。等等,这很奇怪,因为交易日期是2019-12-08。这里有一个不一致。Unix时间来自2012年,但交易日期是2019年。这没有意义。可能是数据输入错误,但值得注意。  
  
城市人口是5901,这是一个相当小的数字。如果Carlos住在小镇上并且在当地购物,交易可能是正常的。但如果他来自一个更大的城市,这可能会显得异常。  
  
综合来看,主要的红旗是交易时间较晚和Unix时间不匹配。金额不是太高,但时间和位置需要检查。如果Carlos不在Grant, AL,或者如果Unix时间正确但与交易日期不符,这可能表明欺诈。我也应该检查卡片的历史,看看是否有任何其他可疑活动。  
  
我认为我会给这次交易一个欺诈分数为3。有一些可疑点,但在没有更多背景信息的情况下,这不是一个明确的欺诈。值得进一步调查,特别是时间和地点的不一致性。  
</think>  
  
**欺诈分析和建议**  
  
**交易概述:**  
- **日期和时间:** 2019年12月8日,00:26:16(深夜)  
- **商户:** Bogisich Inc(杂货店)  
- **金额:** 283.51美元  
- **位置:** Grant, AL(邮政编码35747)  
- **持卡人:** Carlos Chung  
  
**识别出的红旗:**  
1. **交易时间较晚:** 购买发生在午夜附近,如果持卡人通常在白天购物,这可能是红旗。  
2. **Unix时间不匹配:** Unix时间对应于2012年12月8日,而不是2019年,表明可能存在错误或操纵。  
  
**调查建议:**  
- 验证持卡人在交易日期的位置。  
- 检查卡片历史记录中是否有类似的深夜交易。  
- 调查Unix时间不匹配的原因。  
- 将交易地点与持卡人的已知行踪进行交叉核对。  
  
**欺诈评分:** 3/5  
- 交易有一些可疑元素,特别是时间和日期不一致,需要进一步调查。然而,在没有更多背景信息的情况下,这并不明确是欺诈。  
  
**结论:**  
尽管交易引起了一些担忧,特别是关于时间和日期的一致性问题,但需要进一步调查以确定其是否欺诈。

交易分析详细地识别了交易时间较晚、比较商户位置和持卡人位置以及金额。然而,我们需要提供其历史交易以提高分析质量。

4、设置欺诈检测AI代理

有几个平台可以让您构建AI代理,例如crewai、relevance.ai、n8n、langflow等。但对于本教程,我们将使用Kudra AI创建代理,因为它能够处理多种文档类型(PDF、TXT、HTML等)并允许用户上传创建文档数据库,供代理使用:

在Kudra上传的交易

第一步是上传历史交易,代理可以使用这些交易进行分析。在Kudra中,我们可以通过上传txt文件到代理项目中来实现这一点,如图所示。

接下来,我们需要创建两个工具:

  • Fraud_detector_ML: 传统ML模型API,用于预测交易是否欺诈
  • Transaction_explanator: LLM推理引擎API,用于根据当前交易和购买历史判断交易是否欺诈。

在Kudra中,我们将这两个API连接为工具到代理。我们可以添加其他工具来帮助代理进一步调查,例如Google地图API来定位商户位置,网站抓取器来获取有关商户的信息等。但为了本教程的目的,我们只给它两个工具。

5、可解释性的力量

为了测试代理,我们将测试这个特定交易及其10个最近的购买记录:

{ “trans_date_trans_time”: “2019–12–09 03:23:21”, “cc_num”: 2266735643685262, “merchant”: “Koepp-Parker”, “category”: “grocery_pos”, “amt”: 316.82, “first”: “Carlos”, “last”: “Chung”, “gender”: “M”, “street”: “8957 Russell Key”, “city”: “Grant”, “state”: “AL”, “zip”: 35747, “lat”: 34.4959, “long”: -86.259, “city_pop”: 5901, “job”: “Curator”, “dob”: “1972–07–25”, “trans_num”: “1e787b206a1a9154a5f397dfaa6f6b40”, “unix_time”: 1355023401, “merch_lat”: 35.177042, “merch_long”: -86.942305}

以下是AI代理输出的截图:

我们可以看到代理首先调用了第一个工具 Fraud_detector_ML 然后是第二个工具 Transaction_explanator.

以下是预测ML模型的输出:{‘is_fraud’: 0}。这意味着交易不是欺诈。

然而,如果你查看LLM推理器的输出,我们会看到不同的故事:

欺诈分析报告

交易详情:

日期与时间: 2019年12月9日,3:23:21

商户: Koepp-Parker

类别: 杂货

金额: $316.82

位置: 35.177042, -86.942305(距离家约34英里)

分析: *1.*交易时间: *交易发生在清晨,可能不寻常,但没有额外的背景信息,不能作为欺诈的确凿证据。 2.*金额: *金额显著高于普通交易,大多数低于100美元。
前一次大额购买为311.70美元,属于娱乐类别,使这次杂货购买显得特别。 3.*商户类别: *类别不同于前一次大额交易,引发了关于购买性质的疑问。 4.*位置: 商户位于持卡人家34英里之外,这是一个显著的距离,与过去交易地点不符。

结论: 高金额、不同的商户类别和远距离位置的组合表明可能存在欺诈活动。
虽然可能有正当理由,但这些异常情况值得进一步调查。

建议: 标记为潜在欺诈。

LLM的报告包括:

  • 时间分析(“交易发生在清晨,可能不寻常”)。
  • 地理位置差异(分析商户和持卡人之间的距离约为34英里)。
  • 金额(高于普通交易的金额)。

分析非常详尽,将当前交易细节与已知交易进行比较,并找出差异。

最终建议标记交易为欺诈,这与传统的黑盒ML模型的结果相矛盾

此时,我们有两个相互矛盾的信息,可以借助更多的工具或引入人工审核来解决这一矛盾。

通过在传统ML模型中加入推理LLM引擎,我们已经:

  • 减少了传统ML模型的黑盒特性
  • 添加了额外的LLM推理验证层
  • 提高了系统的整体效率

下一步,我们可以甚至添加多个代理协同工作,以提供更精确的建议,因为多代理系统的表现优于单个代理已被证明。

需要注意的是,通用LLM由于其生成性质而不一致且不可靠(与传统的预测ML相反)。例如,我将相同的交易输入10次,其中两次输出为“未欺诈”。这是生成AI领域常见的问题,需要通过强化学习进行微调,我们将在下一节讨论。

6、LLM追踪、评估和强化学习

持续监控

由于其生成性质,LLM以其不一致性和不可靠性著称。从可靠性的角度来看,记录和监控LLM交互至关重要,原因如下:

  • 分析输入/输出以测量任何数据漂移
  • 查找输出中的任何异常
  • 使用人类或其他LLM作为裁判对LLM响应进行评级,收集奖励数据,用于通过强化学习训练改进模型。

使用UbIAI,每个API调用都会在“监控”部分中记录输入/输出。

UbIAI监控仪表板
UbIAI LLM查询评估

用户可以根据输入/输出对LLM响应进行准确或不准确的评级。使用UbIAI的LLM作为裁判功能,我们可以创建提示并设置输出轨道,以自动设置我们关心的任何指标,如“幻觉”、“真实性”、“事实性”等。

LLM作为裁判配置页面

使用另一个LLM评估LLM响应具有显著优势:

  1. 可扩展性:LLM可以迅速处理大量数据,使其成为大规模评估的理想选择,而这对人类审查员来说是不切实际或不可能的。
  2. 成本效益:与人类评估相比,LLM裁判更具经济性,尤其是在进行广泛的评估任务时。
  3. 灵活性:提示可以轻松调整以评估各种标准,从有用性到品牌语音一致性,无需重新训练模型。
  4. 多语言能力:LLM裁判可以轻松跨多种语言进行评估。

强化学习

使用人类或LLM收集的奖励数据,我们可以使用强化学习(RL)来调整LLM的行为以实现期望的目标,平衡多个目标,如准确性、真实性和时效性。

这将是下一篇文章的主题。

7、结束语

虽然传统的机器学习模型在检测已知欺诈模式方面非常有效,但它们往往作为黑盒操作,缺乏解释决策的能力。通过将基于推理的LLM与传统ML模型相结合,AI代理提供了更透明、适应性强和高效的欺诈检测方法。

我们的探索展示了这种混合方法如何在几个关键方面增强欺诈检测:

  • 提高可解释性:LLM组件增加了背景和推理,使欺诈检测决策更容易被调查人员和合规团队理解。
  • 提高准确性:AI代理交叉引用交易细节与历史数据,发现单独ML模型可能忽略的异常。
  • 持续适应:通过实施强化学习和监控LLM性能,企业可以微调其欺诈检测系统以应对不断演变的威胁。
  • 人工参与集成:能够将模糊案件标记给人类审核,确保自动化与专家监督之间的平衡。

尽管取得了进展,但仍存在挑战——LLM的响应变化无常,需要持续监控和微调以确保一致性。多代理系统和强化学习可以进一步提高欺诈检测的准确性,同时减少误报。


原文链接:AI Agents in Fraud Detection: Bridging the Gap Between Traditional Machine Learning and Human Reasoning

汇智网翻译整理,转载请标明出处