ML.NET库学习001:基于PCA的信用卡异常检查之样本处理与训练
文章目录
- (文末提供数据集下载)ML.NET库学习001:基于PCA的信用卡异常检查之样本处理与训练
- 目标
- 项目概述
- 代码结构概述
- 1. **主要类和文件**
- 2. **命名空间和使用指令**
- 3. **数据类 (`TransactionObservation`)**
- 4. **主程序入口 (`Main` 方法)**
- 5. **数据预处理 (`DataPreprocessing` 方法)**
- 6. **模型训练 (`TrainModel` 方法)**
- 7. **模型评估 (`EvaluateModel` 方法)**
- 8. **文件操作 (`FileHandling` 方法)**
- 代码功能详解
- **1. 数据加载与预处理**
- **2. 模型训练**
- **3. 模型评估**
- **4. 文件操作**
- 代码依赖
- 示例用法
- **数据文件 (`transaction_data.txt)`**
- **运行程序**
- 输出结果
- 代码优势
- 总结
- 数据集
(文末提供数据集下载)ML.NET库学习001:基于PCA的信用卡异常检查之样本处理与训练
目标
-
AnomalyDetectCreditCardFraudDetection.Solution
-
CreditCardFraudDetection.Trainer
-
学习知识点:PCA、表格数据的预处理方法、模型训练步骤;ML库的学习初体验
项目概述
-
项目概述:
- 这是一个使用ML.NET进行异常检测的C#控制台应用程序,目标是检测欺诈交易。
-
数据加载与预处理:
- 使用
LoadData方法从CSV文件加载交易数据。 - 将文本数据转换为数值型特征向量,并构建包含这些特征的数据集。
- 使用
-
模型训练:
- 构建了一个管道,包括特征拼接、归一化和PCA变换。
- 使用随机化PCA算法进行异常检测模型的训练,设置主成分数量(Rank=28)和过采样率(Oversampling=20)。
-
模型评估:
- 在测试数据集上评估模型性能,计算准确率、召回率和其他相关指标。
- 使用
ConsoleHelper.PrintAnomalyDetectionMetrics方法输出评估结果。
-
文件处理:
- 通过相对路径获取绝对路径,确保程序能够正确定位数据文件。
- 解压ZIP文件到指定目录,以便访问和处理数据集。
-
参数选择与优化:
- Rank设置为28可能是因为数据中有28个特征,或者基于其他理论选择。
- Oversampling=20意味着在训练过程中每个样本会被过采样20次,以增强模型的泛化能力。
-
数据平衡性处理:
- 在训练数据中使用过滤变换,仅保留标签为0(正常交易)的数据,可能是因为欺诈交易较少,通过减少正常交易的数量来平衡数据集。
- 也可以考虑其他方法如过采样欺诈交易或使用调整类别权重的方法。
-
潜在改进点:
- 实现更复杂的特征工程,例如提取时间序列特征或使用统计聚合特征。
- 调整PCA参数,进行网格搜索以找到最佳的主成分数量和过采样率。
- 使用交叉验证评估模型性能,确保模型在不同数据子集上的泛化能力。
-
代码实现步骤:
- 编写
LoadData方法,读取CSV文件并解析数据字段。 - 实现特征向量的构建,可能需要将文本类型转换为数值型。
- 配置和训练模型管道,包括所有必要的变换步骤。
- 解压数据集到指定目录,并确保程序能够正确访问这些文件。
- 编写
-
运行环境与依赖:
- 确保项目引用了ML.NET库。
- 安装必要的NuGet包,如
Microsoft.ML和Microsoft.ML.Transforms.
通过以上步骤,可以全面理解并实现这个欺诈交易检测系统。
代码结构概述
1. 主要类和文件
Program.cs: 包含主程序入口,数据处理逻辑,模型训练和评估。
2. 命名空间和使用指令
using Microsoft.ML;
using Microsoft.ML.Data;
using Microsoft.ML.Transforms;
using Microsoft.ML.AnomalyDetection;
using System;
using System.Collections.Generic;
using System.IO;
3. 数据类 (TransactionObservation)
定义了事务观测的结构,包含以下字段:
Id: 事务ID。Features: 特征向量(长度为28)。Label: 标签(0表示正常,1表示异常)。
public class TransactionObservation : ITransformableTo<RowItem>
{public float[] Features;public float Label;public void PrintToConsole(){Console.WriteLine($"ID: {Id}, Label: {(Label == 1 ? "Fraud" : "Not Fraud")}");// 打印特征向量Console.WriteLine($"Features: [{string.Join(", ", Features)}]");Console.WriteLine();}
}
4. 主程序入口 (Main 方法)
public static void Main(string[] args)
{var mlContext = new MLContext();// 加载数据集IDataView data = mlContext.Data.LoadFromTextFile<TransactionObservation>(@"data\transaction_data.txt",separatorChar: '\t',useHeader: true);// 数据预处理和训练ITransformer model = TrainModel(mlContext, data);// 评估模型EvaluateModel(mlContext, model, data);
}
5. 数据预处理 (DataPreprocessing 方法)
private static ITransformer PreprocessData(MLContext mlContext, IDataView data)
{var preprocessPipeline = mlContext.Transforms.Concatenate("Features", new[] { nameof(TransactionObservation.Features) }).Append(mlContext.Transforms.NormalizeLpNorm(outputColumnName: "NormalizedFeatures",inputColumnName: "Features"));return preprocessPipeline;
}
6. 模型训练 (TrainModel 方法)
private static ITransformer TrainModel(MLContext mlContext, IDataView data)
{var options = new RandomizedPcaTrainer.Options{FeatureColumnName = "NormalizedFeatures",Rank = 28,Oversampling = 20,EnsureZeroMean = true,Seed = 1};IEstimator<ITransformer> trainer = mlContext.AnomalyDetection.Trainers.RandomizedPca(options);var trainingPipeline = preprocessPipeline.Append(trainer);return trainingPipeline.Fit(data);
}
7. 模型评估 (EvaluateModel 方法)
private static void EvaluateModel(MLContext mlContext, ITransformer model, IDataView testData)
{var predictions = model.Transform(testData);AnomalyDetectionMetrics metrics = mlContext.AnomalyDetection.Evaluate(predictions);Console.WriteLine("Precision: {0}", metrics.Precision);Console.WriteLine("Recall: {0}", metrics.Recall);Console.WriteLine("F1-Score: {0}", metrics.F1Score);
}
8. 文件操作 (FileHandling 方法)
private static string GetAbsolutePath(string relativePath)
{FileInfo _dataRoot = new FileInfo(typeof(Program).Assembly.Location);string assemblyFolderPath = _dataRoot.Directory.FullName;return Path.Combine(assemblyFolderPath, relativePath);
}private static void UnZipDataSet(string zipDataSet, string destinationFile)
{if (!File.Exists(destinationFile)){ZipFile.ExtractToDirectory(zipDataSet, Path.GetDirectoryName(destinationFile));}
}
代码功能详解
1. 数据加载与预处理
- 数据加载: 使用
MLContext.Data.LoadFromTextFile方法从文件加载事务数据。 - 数据预处理: 包括特征向量拼接和归一化处理,确保模型输入格式一致。
2. 模型训练
- PCA异常检测器: 使用随机化 PCA 算法进行异常检测,设置参数如主成分数量、过采样率等。
- 模型拟合: 通过
Fit方法在预处理后的数据上训练模型。
3. 模型评估
- 预测与评估: 在测试数据上应用训练好的模型,并使用
AnomalyDetectionMetrics计算精度、召回率和 F1 分数等指标。
4. 文件操作
- 路径获取: 使用反射获取程序集目录,构造绝对路径。
- 文件解压: 解压事务数据文件到指定位置。
代码依赖
- Microsoft.ML 包: 需要安装
Microsoft.ML和相关组件包(如Microsoft.ML.AnomalyDetection)。 - 文本文件格式: 数据文件应为制表符分隔的文本文件,包含标题行。
示例用法
数据文件 (transaction_data.txt)
Id Features Label
1 0.5,0.6,...,0.3 0
2 0.7,0.8,...,0.4 1
...
运行程序
dotnet run --project ./AnomalyDetection.csproj
输出结果
模型训练完成后,将在控制台输出以下信息:
- 训练完成: 显示训练耗时。
- 评估结果: 显示 Precision、Recall 和 F1-Score。
代码优势
- 高效处理: 使用 ML.NET 进行高效的机器学习任务处理。
- 模块化设计: 代码结构清晰,功能模块独立,便于扩展和维护。
- 易用性: 提供了完整的文件操作和数据预处理逻辑,方便用户直接使用。
总结
该代码实现了一个基于随机化 PCA 的异常检测系统,适用于金融事务等场景中的欺诈 detection。通过 ML.NET 框架,实现了从数据加载、预处理、模型训练到评估的完整流程。
数据集
数据集下载地址
相关文章:
ML.NET库学习001:基于PCA的信用卡异常检查之样本处理与训练
文章目录 (文末提供数据集下载)ML.NET库学习001:基于PCA的信用卡异常检查之样本处理与训练目标项目概述代码结构概述1. **主要类和文件**2. **命名空间和使用指令**3. **数据类 (TransactionObservation)**4. **主程序入口 (Main 方法)**5. **数据预处理 (DataPrepr…...
【华为OD机考】华为OD笔试真题解析(1)--AI处理器组合
一、题目描述 某公司研发了一款高性能AI处理器,每台物理设备具备8颗AI处理器,编号分别为0、1、2、3、4、5、6、7。 编号0~3的处理器处于同一链路中,编号4~7的处理器处于另外一个链路中,不同链路中的处理器不能通信,如…...
edu小程序挖掘严重支付逻辑漏洞
edu小程序挖掘严重支付逻辑漏洞 一、敏感信息泄露 打开购电小程序 这里需要输入姓名和学号,直接搜索引擎搜索即可得到,这就不用多说了,但是这里的手机号可以任意输入,只要用户没有绑定手机号这里我们输入自己的手机号抓包直接进…...
力扣 279. 完全平方数
🔗 https://leetcode.cn/problems/perfect-squares 题目 给你一个整数 n ,返回 和为 n 的完全平方数的最少数量完全平方数可以拆解为两个相同数的乘积 思路 dp 公式,就是从看用哪个完全平方数 1 2 4 9…… 到当前 sum 的数量最少 代码 …...
鸿蒙生态潮起:开发者的逐浪之旅
鸿蒙生态潮起:开发者的逐浪之旅 在全球科技的澎湃浪潮中,鸿蒙生态宛如一座正在崛起的新大陆,熠熠生辉,吸引着无数开发者扬帆起航,探寻其中蕴藏的无限机遇,也直面诸多挑战。 鸿蒙生态的机遇,首先…...
Diskgenius系统迁移之后无法使用USB启动
前言 本文用于记录系统迁移中遇到的问题及解决方法,如有不对请指出,谢谢! 现象 使用DiskGenius进行系统迁移后,使用USB启动失败,反复在品牌logo和黑屏之间切换,期间还会在左上角显示”reset system“报错…...
Kafka 可靠性探究—副本刨析
Kafka 的多副本机制提升了数据容灾能力。 副本通常分为数据副本与服务副本。数据副本是指在不同的节点上持久化同一份数据;服务副本指多个节点提供同样的服务,每个节点都有能力接收来自外部的请求并进行相应的处理。 1 副本刨析 1.1 相关概念 AR&…...
我的博文天地测试报告
我的博文天地测试报告 文章目录 我的博文天地测试报告 一.项目背景 二.项目功能 2.1 功能介绍 三.测试分类 3.1 功能测试 3.1.1 测试用例 3.1.2 实际执行测试的部分操作步骤/结果的截图 3.2 自动化测试 3.3 性能测试 3.1.2 用户登录 jmeter性能测试结果 性能测试遇到的困难 …...
EtherCAT主站IGH-- 35 -- IGH之pdo_list.h/c文件解析
EtherCAT主站IGH-- 35 -- IGH之pdo_list.h/c文件解析 0 预览一 该文件功能`pdo_list.c` 文件功能函数预览二 函数功能介绍`pdo_list.c` 中主要函数的作用1. `ec_pdo_list_init`2. `ec_pdo_list_clear`3. `ec_pdo_list_clear_pdos`4. `ec_pdo_list_total_size`5. `ec_pdo_list_a…...
嵌入式开发神器:Buildroot的介绍和使用方法
目录 引言**Buildroot 能做什么?****1. 生成交叉编译工具链(Toolchain)****2. 生成嵌入式 Linux 根文件系统(RootFS)****3. 编译 Linux 内核和设备树文件****4. 编译 Bootloader(U-Boot)****5. …...
JavaScript系列(61)--边缘计算应用开发详解
JavaScript边缘计算应用开发详解 🌐 今天,让我们深入探讨JavaScript的边缘计算应用开发。边缘计算是一种将计算和数据存储分布到更靠近数据源的位置的架构模式,它能够提供更低的延迟和更好的实时性能。 边缘计算基础架构 🌟 &am…...
【LeetCode】day15 142.环形链表II
142. 环形链表 II - 力扣(LeetCode) 题目描述 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则…...
代理对象与目标对象
1. 定义:代理对象和目标对象 1.1 目标对象(Target Object) 目标对象是指 被增强的原始对象,即需要通过 AOP 切面(Aspect)增强功能的业务对象(原始类)。增强逻辑(Advice…...
【Kubernetes Pod间通信-第3篇】Kubernetes中Pod与ClusterIP服务之间的通信
引言 我们之前了解了在不同场景下,Kubernetes中Pod之间的通信是如何路由的。 【Kubernetes Pod间通信-第1篇】在单个子网中使用underlay网络实现Pod到Pod的通信【Kubernetes Pod间通信-第2篇】使用BGP实现Pod到Pod的通信现在,我们来看看在集群中,Pod与服务之间的通信是如何…...
DNN(深度神经网络)近似 Lyapunov 函数
import torch import torch.nn as nn import torch.optim as optim import matplotlib.pyplot as plt # from torchviz import make_dot import torchviz# 1. Lyapunov 函数近似器(MLP 结构) class LyapunovNet(nn.Module):def __init__(self, input_dim…...
128陷阱
首先我们了解一下关于包装器类型 java是面向对象的语言,但基本类型并不是面向对象的,从而出现了包装器类型,并且包装器添加了更多的属性和方法。如我们在使用集合类型Collection的时候就一定要使用包装类型而非基本类型,它相当于将…...
PromptSource和LangChain哪个更好
目录 1. 设计目标与定位 PromptSource LangChain 2. 功能对比 3. 优缺点分析 PromptSource LangChain 4. 如何选择? 5. 总结 PromptSource 和 LangChain 是两个在自然语言处理(NLP)领域非常有用的工具,但它们的设计目标和…...
构成正方形的数量:算法深度剖析与实践
目录 引言算法核心概念 定义正方形的构成条件数据结构与输入形式算法数学原理 几何关系的数学表达坐标运算与判定逻辑Python 实现 代码展示代码解析Python 实现的优势与局限C 语言实现 代码展示代码解析C 语言实现的性能特点性能分析与优化 性能分析 时间复杂度空间复杂度优化思…...
Redis持久化-秒杀系统设计
在构建高性能、高可用的系统时,Redis 作为缓存和消息队列的角色越来越重要。在一些场景下,我们还需要将 Redis 的数据进行持久化,以确保数据的安全性和恢复能力。除此之外,秒杀系统也越来越成为电商、抢购等平台的核心功能之一。本…...
音视频入门基础:RTP专题(8)——使用Wireshark分析RTP
一、引言 通过Wireshark可以抓取RTP数据包,该软件可以从Wireshark Go Deep 下载。 二、通过Wireshark抓取RTP数据包 首先通过FFmpeg将一个媒体文件转推RTP,生成RTP流: ffmpeg -re -stream_loop -1 -i input.mp4 -vcodec copy -an -f rtp …...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...
Sklearn 机器学习 缺失值处理 获取填充失值的统计值
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...
FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...
