预测模型开发与评估:基于机器学习的数据分析实践

news2025/12/18 4:24:24

在当今数据驱动的时代,预测模型已成为各行各业决策制定的核心工具。本文将分享我在COMP5310课程项目中开发预测模型的经验,探讨从数据清洗到模型优化的完整过程,并提供详细的技术实现代码。

## 研究问题与数据集

### 研究问题

我们的研究聚焦于信用卡欺诈检测,主要探讨以下问题:如何通过机器学习技术有效识别信用卡交易中的欺诈行为,并最大化检测准确率同时减少误报?

这一问题对金融机构和消费者都具有重大意义。对金融机构而言,能够及时识别欺诈交易可以减少经济损失;对消费者而言,则能保障个人财产安全并增强使用信用卡的信心。

### 数据集概述

我们使用的是信用卡交易数据集,包含了大量真实交易记录,其中少部分被标记为欺诈交易。数据集具有以下特点:

- 包含交易时间、金额及多个经PCA变换后的特征变量

- 存在严重的类别不平衡问题(欺诈交易占比不到1%)

- 原始数据中存在缺失值和异常值,需要进行预处理

## 建模准备

### 评估指标选择

考虑到欺诈检测的特殊性,我们选择以下评估指标:

1. **AUC-ROC曲线下面积**:能够全面评估模型在不同阈值下的表现

2. **精确率-召回率曲线及F1分数**:特别关注模型对少数类(欺诈交易)的识别能力

### 数据划分策略

我们采用了时间序列验证的方式划分数据:

- 训练集:70%(按时间顺序的前70%交易)

- 验证集:15%(用于超参数调优)

- 测试集:15%(用于最终评估)

这种划分方式能更好地模拟真实世界中欺诈检测的应用场景。

## 预测模型开发

### 模型选择:XGBoost算法

我选择了XGBoost作为主要模型,原因如下:

- 对类别不平衡数据集有较好的处理能力

- 能有效处理非线性关系

- 具有内置的特征重要性评估

- 在许多类似欺诈检测任务中表现优异

### 算法原理

XGBoost是梯度提升决策树(GBDT)的一种高效实现,其核心原理是通过构建多个弱学习器(决策树),每个新树都专注于修正前面树的预测误差。

XGBoost的主要算法步骤如下:

# XGBoost算法伪代码

def xgboost_training(data, labels, n_estimators, learning_rate):

    # 初始化预测为0

    predictions = [0 for _ in range(len(labels))]

   

    # 迭代构建决策树

    for i in range(n_estimators):

        # 计算当前预测的残差(梯度)

        gradients = compute_gradients(labels, predictions)

        hessians = compute_hessians(labels, predictions)

       

        # 基于梯度和Hessian矩阵构建新树

        tree = build_tree(data, gradients, hessians)

       

        # 更新预测值

        tree_predictions = tree.predict(data)

        predictions = [pred + learning_rate * tree_pred

                      for pred, tree_pred in zip(predictions, tree_predictions)]

   

    return final_model

### 模型开发过程

首先,我进行了深入的数据预处理:



# 数据预处理代码

import pandas as pd

import numpy as np

from sklearn.preprocessing import StandardScaler

from sklearn.model_selection import train_test_split



# 加载数据

df = pd.read_csv('credit_card_fraud.csv')



# 处理缺失值

df.fillna(df.median(), inplace=True)



# 特征缩放

scaler = StandardScaler()

df[['Amount', 'Time']] = scaler.fit_transform(df[['Amount', 'Time']])



# 时间序列划分

df = df.sort_values('Time')

train_size = int(0.7 * len(df))

val_size = int(0.15 * len(df))



train_data = df.iloc[:train_size]

val_data = df.iloc[train_size:train_size+val_size]

test_data = df.iloc[train_size+val_size:]



X_train, y_train = train_data.drop('Class', axis=1), train_data['Class']

X_val, y_val = val_data.drop('Class', axis=1), val_data['Class']

X_test, y_test = test_data.drop('Class', axis=1), test_data['Class']

```



接下来,我训练了初始XGBoost模型:



```python

# XGBoost模型训练

import xgboost as xgb

from sklearn.metrics import roc_auc_score, f1_score, precision_recall_curve



# 创建DMatrix数据结构

dtrain = xgb.DMatrix(X_train, label=y_train)

dval = xgb.DMatrix(X_val, label=y_val)



# 设置初始参数

params = {

    'objective': 'binary:logistic',

    'eval_metric': 'auc',

    'max_depth': 6,

    'eta': 0.1,

    'subsample': 0.8,

    'colsample_bytree': 0.8,

    'scale_pos_weight': sum(y_train == 0) / sum(y_train == 1)  # 处理类别不平衡

}



# 训练模型

watchlist = [(dtrain, 'train'), (dval, 'eval')]

model = xgb.train(params, dtrain, num_boost_round=100,

                  evals=watchlist, early_stopping_rounds=10)

```

## 模型评估与优化

### 模型评估

我使用了ROC曲线和精确率-召回率曲线进行全面评估:

# 模型评估代码

import matplotlib.pyplot as plt

from sklearn.metrics import roc_curve, precision_recall_curve, auc



# 在测试集上进行预测

dtest = xgb.DMatrix(X_test)

y_pred_prob = model.predict(dtest)



# 计算ROC曲线

fpr, tpr, _ = roc_curve(y_test, y_pred_prob)

roc_auc = auc(fpr, tpr)



# 计算PR曲线

precision, recall, _ = precision_recall_curve(y_test, y_pred_prob)

pr_auc = auc(recall, precision)



# 计算最佳阈值下的F1分数

f1_scores = []

thresholds = np.arange(0.1, 0.9, 0.05)

for threshold in thresholds:

    y_pred = (y_pred_prob >= threshold).astype(int)

    f1_scores.append(f1_score(y_test, y_pred))

   

best_threshold = thresholds[np.argmax(f1_scores)]

y_pred_optimized = (y_pred_prob >= best_threshold).astype(int)

```

初始模型评估结果:

- AUC-ROC: 0.975

- PR-AUC: 0.856

- 最佳阈值下F1分数: 0.823

### 模型优化

通过网格搜索进行超参数优化:

# 超参数调优代码

from sklearn.model_selection import GridSearchCV



# 设置超参数搜索空间

param_grid = {

    'max_depth': [3, 5, 7, 9],

    'learning_rate': [0.01, 0.05, 0.1, 0.2],

    'n_estimators': [50, 100, 200],

    'subsample': [0.6, 0.8, 1.0],

    'colsample_bytree': [0.6, 0.8, 1.0],

    'min_child_weight': [1, 3, 5]

}



# 创建XGBoost分类器

xgb_clf = xgb.XGBClassifier(objective='binary:logistic',

                           scale_pos_weight=sum(y_train == 0) / sum(y_train == 1))



# 执行网格搜索

grid_search = GridSearchCV(

    estimator=xgb_clf,

    param_grid=param_grid,

    scoring='f1',

    cv=5,

    verbose=1,

    n_jobs=-1

)



grid_search.fit(X_train, y_train)



# 获取最佳参数

best_params = grid_search.best_params_

print(f"最佳参数: {best_params}")



# 使用最佳参数训练最终模型

final_model = xgb.XGBClassifier(**best_params)

final_model.fit(X_train, y_train)

```

优化后模型评估结果:

- AUC-ROC: 0.991

- PR-AUC: 0.912

- 最佳阈值下F1分数: 0.887

## 结论与讨论

通过本次项目,我成功开发了一个高效的信用卡欺诈检测模型。XGBoost算法在处理类别不平衡数据集方面展现出优异性能,特别是经过超参数优化后,模型在测试集上取得了令人满意的结果。

模型的主要优势在于:

1. 高准确率:减少误报同时保持高检出率

2. 可解释性:通过特征重要性分析,了解哪些因素对欺诈检测最为关键

3. 计算效率:相比复杂的神经网络,XGBoost在实际应用中更具部署优势

未来工作方向包括:

- 融合多模型集成学习,进一步提升性能

- 探索深度学习方法在欺诈检测中的应用

- 研究基于异常检测的无监督学习方法,用于发现新型欺诈模式

通过本项目,我不仅掌握了预测模型开发的完整流程,更深入理解了在现实业务场景中应用机器学习技术的挑战与策略。

## 参考资料

1. Chen, T., & Guestrin, C. (2016). XGBoost: A Scalable Tree Boosting System.

2. Brownlee, J. (2020). Imbalanced Classification with Python.

3. Pozzolo, A. D., et al. (2015). Calibrating Probability with Undersampling for Unbalanced Classification.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2377766.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【更新】全国省市县-公开手机基站数据集(2006-2025.3)

手机基站是现代通信网络中的重要组成部分,它们为广泛的通信服务提供基础设施。随着数字化进程的不断推进,手机基站的建设与布局对优化网络质量和提升通信服务水平起着至关重要的作用,本分享数据可帮助分析移动通信网络的发展和优化。本次数据…

基于MNIST数据集的手写数字识别(CNN)

目录 一,模型训练 1.1 数据集介绍 1.2 CNN模型层结构 1.3 定义CNN模型 1.4 神经网络的前向传播过程 1.5 数据预处理 1.6 加载数据 1.7 初始化 1.8 模型训练过程 1.9 保存模型 二,模型测试 2.1 定义与训练时相同的CNN模型架构 2.2 图像的预处…

idea Maven 打包SpringBoot可执行的jar包

背景&#xff1a;当我们需要坐联调测试的时候&#xff0c;需要对接前端同事&#xff0c;则需要打包成jar包直接运行启动服务 需要将项目中的pom文件增加如下代码配置&#xff1a; <build><plugins><plugin><groupId>org.springframework.boot</gr…

HarmonyOs开发之——— ArkWeb 实战指南

HarmonyOs开发之——— ArkWeb 实战指南 谢谢关注!! 前言:上一篇文章主要介绍HarmonyOs开发之———合理使用动画与转场:CSDN 博客链接 一、ArkWeb 组件基础与生命周期管理 1.1 Web 组件核心能力概述 ArkWeb 的Web组件支持加载本地或在线网页,提供完整的生命周期回调体…

国标GB/T 12536-90滑行试验全解析:纯电动轻卡行驶阻力模型参数精准标定

摘要 本文以国标GB/T 12536-90为核心框架&#xff0c;深度解析纯电动轻卡滑行试验的完整流程与数据建模方法&#xff0c;提供&#xff1a; 法规级试验规范&#xff1a;从环境要求到数据采集全流程详解行驶阻力模型精准标定&#xff1a;最小二乘法求解 ( FAv^2BvC ) 的MATLAB实…

初识——QT

QT安装方法 一、项目创建流程 创建项目 入口&#xff1a;通过Qt Creator的欢迎页面或菜单栏&#xff08;文件→新建项目&#xff09;创建新项目。 项目类型&#xff1a;选择「Qt Widgets Application」。 路径要求&#xff1a;项目路径需为纯英文且不含特殊字符。 构建系统…

kkFileView文件文档在线预览镜像分享

kkFileView为文件文档在线预览解决方案&#xff0c;该项目使用流行的spring boot搭建&#xff0c;易上手和部署&#xff0c;基本支持主流办公文档的在线预览&#xff0c;如doc,docx,xls,xlsx,ppt,pptx,pdf,txt,zip,rar,图片,视频,音频等等 开源项目地址 https://gitee.com/kek…

实例分割AI数据标注 ISAT自动标注工具使用方法

文章目录 🌕ISAT安装和启动方法🌕下载和使用AI分割模型🌙SAM模型性能排行🌙手动下载sam模型 & sam模型下载路径🌕使用方法🌙从file中导入图片🌙点击左上角的图标进入分割模式🌙鼠标左键点击画面中的人则自动标注🌙点击右键该区域不标注🌙一个人一个人的…

Qt图表绘制(QtCharts)- 性能优化(13)

文章目录 1 批量替换代替追加1.1 测试11.2 测试21.3 测试3 2 开启OpenGL2.1 测试12.2 测试22.3 测试32.4 测试4 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;Qt开发 &#x1f448;&#x1f449;QtCharts绘图 &#x1f448;&#x1f449;python开发 &#x1f…

如何在 Windows 10 或 11 上使用命令提示符安装 PHP

我们可以在 Windows 上从其官方网站下载并安装 PHP 的可执行文件,但使用命令提示符或 PowerShell 更方便。 PHP 并不是一种新的或不为人知的脚本语言,它已经存在并被全球数千名网络开发人员使用。它以开源许可并分发,广泛用于 LAMP 堆栈中。然而,与 Linux 相比,它在 Wind…

RK3588 ADB使用

安卓adb操作介绍 adb&#xff08;Android Debug Bridge&#xff09;是一个用于与安卓设备进行通信和控制的工具。adb可以通过USB或无线网络连接安卓设备&#xff0c;执行各种命令&#xff0c;如安装和卸载应用&#xff0c;传输文件&#xff0c;查看日志&#xff0c;运行shell命…

Please install it with pip install onnxruntime

无论怎么安装都是 Please install it with pip install onnxruntime 我python 版本是3.11 &#xff0c;我换成3.10 解决了

低损耗高效能100G O Band DWDM 10km光模块 | 支持密集波分复用

目录 前言 一、产品概述 100G QSFP28 O Band DWDM 10km光模块核心特点包括&#xff1a; 二、为何选择O Band DWDM方案&#xff1f; 1.低色散损耗&#xff0c;传输更稳定 2.兼容性强 三、典型应用场景 1.数据中心互联&#xff08;DCI&#xff09; 2.企业园区/智慧城市组网 3.电信…

第二十六天打卡

全局变量 global_var 全局变量是定义在函数、类或者代码块外部的变量&#xff0c;它在整个程序文件内都能被访问。在代码里&#xff0c; global_var 就是一个全局变量&#xff0c;下面是相关代码片段&#xff1a; print("\n--- 变量作用域示例 ---") global_var …

阿里云ECS部署Dify

一&#xff1a;在ECS上面安装Docker 关防火墙 sudo systemctl stop firewalld 检查防火墙状态 systemctl status firewalld sudo yum install -y yum-utils device-mapper-persistent-data lvm2 设置阿里镜像源&#xff0c;安装并启动docker [base] nameCentOS-$releas…

日志与策略模式

什么是设计模式 IT⾏业 ,为了让 菜鸡们不太拖⼤佬的后腿, 于是⼤佬们针对⼀些经典的常⻅的场景, 给定了⼀些对应的解决⽅案, 这个就是 设计模式 日志认识 计算机中的⽇志是记录系统和软件运⾏中发⽣事件的⽂件&#xff0c;主要作⽤是监控运⾏状态、记录异常信 息&#xff…

Jenkins 最佳实践

1. 在Jenkins中避免调度过载 过载Jenkins以同时运行多个作业可能导致资源竞争、构建速度变慢和系统性能问题。分配作业启动时间可以防止瓶颈&#xff0c;并确保更顺畅的执行。如何实现&#xff1f; 在Cron表达式中使用H&#xff1a;引入抖动&#xff08;jitter&#xff09;&a…

天能股份SAP系统整合实战:如何用8个月实现零业务中断的集团化管理升级

目录 天能股份SAP系统整合案例&#xff1a;技术驱动集团化管理的破局之路 一、企业背景&#xff1a;新能源巨头的数字化挑战 二、项目难点&#xff1a;制造业的特殊攻坚战 1. 生产连续性刚性需求 2. 数据整合三重障碍 3. 资源限制下的技术突围 三、解决方案&#xff1a;S…

uniapp-商城-59-后台 新增商品(属性的选中,进行过滤展示,filter,some,every和map)

前面讲了属性的添加&#xff0c;添加完成后&#xff0c;数据库中已经存在数据了&#xff0c;这时再继续商品的添加时&#xff0c;就可以进行属性的选择了。 在商品添加过程中&#xff0c;属性选择是一个关键步骤。首先&#xff0c;界面需要展示嵌套的属性数据&#xff0c;用户通…

B2C 商城转型指南:传统企业如何用 ZKmall模板商城实现电商化

在数字化浪潮席卷全球的当下&#xff0c;传统企业向电商转型已不再是选择题&#xff0c;而是关乎生存与发展的必答题。然而&#xff0c;缺乏技术积累、开发成本高、运营经验不足等问题&#xff0c;成为传统企业转型路上的 “拦路虎”。ZKmall模板商城以其低门槛、高灵活、强适配…