0

0

怎样用Python构建信用卡欺诈检测系统?交易特征工程

星夢妙者

星夢妙者

发布时间:2025-07-22 11:39:01

|

739人浏览过

|

来源于php中文网

原创

构建信用卡欺诈检测系统的核心在于交易特征工程,其关键作用是将原始交易数据转化为揭示异常行为的信号,通过特征工程提取“历史行为”和“实时异常”信息,主要包括基础交易特征、时间窗聚合特征、用户维度、商户维度、卡片维度、频率与速度、比率与差异特征及历史统计特征。实现方法包括使用pandas的groupby()和rolling()进行滑动窗口聚合、扩展窗口聚合、时间差特征、比率与变化率特征等操作,以捕捉短期行为模式和长期累积行为,从而为模型提供清晰的欺诈信号。

怎样用Python构建信用卡欺诈检测系统?交易特征工程

构建一个信用卡欺诈检测系统,特别是用Python并专注于交易特征工程,其核心在于将看似普通的交易记录转化为能揭示异常行为的信号。简单来说,就是把数据“翻译”成模型能理解的“欺诈语言”。没有这一步,再强大的机器学习模型也无从下手。

怎样用Python构建信用卡欺诈检测系统?交易特征工程

解决方案

当我着手构建一个信用卡欺诈检测系统时,我发现真正的挑战和乐趣都集中在特征工程上。原始的交易数据,比如金额、时间、商户ID,它们本身的信息量是有限的。我们需要做的是,从这些点状信息中,提取出行为模式和上下文信息。

立即学习Python免费学习笔记(深入)”;

怎样用Python构建信用卡欺诈检测系统?交易特征工程

我的核心思路是围绕“历史行为”和“实时异常”来构建特征。这通常意味着要大量使用时间窗聚合。想象一下,一个账户在过去5分钟内发生了3笔交易,总金额突然激增,或者在短时间内尝试了多个不同的商户。这些都是潜在的危险信号。

具体来说,我会构建以下几类特征:

怎样用Python构建信用卡欺诈检测系统?交易特征工程
  1. 基础交易特征: 交易金额、交易时间(可以分解为小时、星期几、是否周末)、商户类别。这些是起点,但远不够。
  2. 时间窗聚合特征: 这是重头戏。
    • 用户维度: 对于每个用户,计算其在过去1小时、3小时、6小时、1天、7天内的交易笔数、总金额、平均金额、最大金额、最小金额、标准差。这能捕捉到用户消费习惯的突然变化。
    • 商户维度: 类似地,对于每个商户,计算其在特定时间窗内的交易笔数、总金额。这有助于识别异常高频或高额的商户交易。
    • 卡片维度: 某张卡在短时间内是否在不同地理位置进行了多笔交易?这通常通过计算经纬度距离或IP地址变化来判断。
    • 频率与速度: 例如,过去10分钟内,该卡片的交易笔数;或者当前交易金额与该卡片过去N笔交易平均金额的比率。
  3. 比率与差异特征: 比如,当前交易金额占用户过去24小时总交易金额的比例;当前交易与上一笔交易的时间间隔。这些特征能放大异常行为的信号。
  4. 历史统计特征: 用户过去所有交易的平均金额、最大金额、最常消费的商户类别等。这为当前交易提供了一个“正常”的基准线。

实现这些,Pandas的groupby()rolling()函数是我的利器。它们能高效地在时间序列数据上进行聚合操作。关键在于,你得确保数据是按时间排序的,并且要小心处理每个时间窗的边界,避免数据泄露(即用未来的信息来预测现在)。

举个例子,要计算用户在过去1小时的交易笔数:

import pandas as pd

# 假设df是你的交易DataFrame
# df['transaction_datetime'] = pd.to_datetime(df['transaction_datetime'])
# df = df.sort_values(by='transaction_datetime')

# 假设df已经按用户和时间排序,并且'transaction_datetime'是datetime类型
# df['user_tx_count_last_1h'] = df.groupby('user_id')['transaction_datetime'].rolling('1H', closed='right').count().reset_index(level=0, drop=True) - 1 # 减去当前交易本身

这只是一个简单的开始,实际操作中,你可能需要创建几十甚至上百个这样的特征,然后通过特征选择来筛选出最有用的。

为什么交易特征工程是信用卡欺诈检测的核心?

说实话,当我第一次接触欺诈检测时,我以为只要把数据扔给一个复杂的模型就行了。后来才明白,模型再智能,也只能从你喂给它的数据中学习。原始的信用卡交易数据,它本身是“平坦”的,缺乏深度。它告诉你一笔交易发生了,金额是多少,时间是什么,但它无法直接告诉你这笔交易是否“异常”。

ImgCleaner
ImgCleaner

一键去除图片内的任意文字,人物和对象

下载

欺诈行为往往不是孤立的事件,它通常表现为一系列异常的模式:比如短时间内的高频小额交易,或者突然出现的大额境外消费,又或者是与持卡人日常消费习惯格格不入的商品类别。这些“模式”和“上下文”信息,并不会直接出现在原始数据的一行里。

特征工程的作用,就是把这些隐藏在时间序列、用户行为、商户特征甚至地理位置数据中的“模式”挖掘出来,并以数字化的方式呈现给模型。我们通过聚合、比率、时间差等操作,将“一笔交易”变成了一个包含其历史背景、行为上下文的“事件描述”。没有这些经过精心设计的特征,模型就像一个近视眼,只能看到模糊的轮廓,而无法分辨出欺诈的细微之处。它不仅仅是数据的转换,更是我们对欺诈行为理解的具象化。

构建时间序列和聚合特征的具体方法有哪些?

构建时间序列和聚合特征,这几乎是欺诈检测中特征工程的灵魂所在。我的经验告诉我,这里的关键在于“窗口”的选择和“聚合函数”的应用。

首先,确保你的交易数据是按时间戳严格排序的。这是所有时间序列操作的基础。一旦数据准备好,你就可以开始玩转Pandas的groupby()rolling()了。

  1. 滑动窗口聚合 (Rolling Window Aggregations):

    • 目的: 捕捉短期的行为模式变化。
    • 方法: df.groupby('user_id').rolling(window='X', on='timestamp').agg(...)
    • 例子:
      • 过去X分钟的交易数量: df.groupby('card_id')['transaction_id'].rolling('5min').count()
      • 过去X小时的交易总金额: df.groupby('card_id')['amount'].rolling('1H').sum()
      • 过去X天的平均交易金额: df.groupby('card_id')['amount'].rolling('7D').mean()
    • 思考: window参数可以接受时间字符串(如'5min', '1H', '7D')或整数(代表行数)。选择合适的窗口大小至关重要,它取决于你认为欺诈模式可能持续的时间。我通常会尝试多个窗口大小,比如5分钟、15分钟、1小时、24小时、7天,因为不同的欺诈策略会有不同的时间特征。
  2. 扩展窗口聚合 (Expanding Window Aggregations):

    • 目的: 捕捉从开始到当前时刻的累积行为模式。
    • 方法: df.groupby('user_id')['amount'].expanding().sum()
    • 例子:
      • 用户历史累计交易总额: 这能反映用户的总消费能力或历史活跃度。
      • 用户历史交易平均金额: 这为判断当前交易是否异常提供了一个长期的基准。
  3. 时间差特征 (Time Difference Features):

    • 目的: 衡量交易发生的速度和间隔。
    • 方法: df.groupby('card_id')['timestamp'].diff()
    • 例子:
      • 当前交易与上一笔交易的时间间隔: 短间隔可能意味着连环欺诈。
      • 当前交易与该卡片第一次交易的时间间隔: 衡量卡片使用时长。
  4. 比率与变化率特征 (Ratio and Rate of Change Features):

    • 目的: 归一化金额,或捕捉行为的突然变化。
    • 例子:
      • 当前交易金额 / 过去24小时平均交易金额: 突出大额异常交易。
      • 过去1小时交易笔数 / 过去24小时交易笔数: 捕捉短时高频。

这些方法听起来可能有点像流水线作业,但实际上,每个特征的生成都需要对业务逻辑和欺诈模式有深刻的理解。比如,你可能需要考虑不同商户类型下的交易特征

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

56

2025.12.04

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

198

2023.11.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

298

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1500

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

623

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

613

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

588

2024.04.29

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

31

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.3万人学习

Django 教程
Django 教程

共28课时 | 3.6万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号