基于信用卡交易欺诈非均衡数据的处理

目录

一、数据处理

 二、不做处理建模

 三、under_sampling建模

3.1under_sampling NearMiss 

3.2under_sampling RandomUnderSampler

评价 

四、 over_sampling建模

4.1over_sampling SMOTETomek

 4.2over_sampling RandomOverSampler

评价

import numpy as np
import pandas as pd
import sklearn
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.metrics import classification_report,accuracy_score
from sklearn.metrics import confusion_matrix
import warnings
warnings.filterwarnings("ignore")from sklearn.svm import OneClassSVM
from pylab import rcParams
from sklearn.metrics import precision_score
rcParams['figure.figsize'] = 14, 8
RANDOM_SEED = 42
LABELS = ["Normal", "Fraud"]

一、数据处理

data = pd.read_csv('creditcard.csv',sep=',')

data.info()
'''结果:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 284807 entries, 0 to 284806
Data columns (total 31 columns):#   Column  Non-Null Count   Dtype  
---  ------  --------------   -----  0   Time    284807 non-null  float641   V1      284807 non-null  float642   V2      284807 non-null  float643   V3      284807 non-null  float644   V4      284807 non-null  float645   V5      284807 non-null  float646   V6      284807 non-null  float647   V7      284807 non-null  float648   V8      284807 non-null  float649   V9      284807 non-null  float6410  V10     284807 non-null  float6411  V11     284807 non-null  float6412  V12     284807 non-null  float6413  V13     284807 non-null  float6414  V14     284807 non-null  float6415  V15     284807 non-null  float6416  V16     284807 non-null  float6417  V17     284807 non-null  float6418  V18     284807 non-null  float6419  V19     284807 non-null  float6420  V20     284807 non-null  float6421  V21     284807 non-null  float6422  V22     284807 non-null  float6423  V23     284807 non-null  float6424  V24     284807 non-null  float6425  V25     284807 non-null  float6426  V26     284807 non-null  float6427  V27     284807 non-null  float6428  V28     284807 non-null  float6429  Amount  284807 non-null  float6430  Class   284807 non-null  int64  
dtypes: float64(30), int64(1)
memory usage: 67.4 MB
'''Y = data['Class']
'''结果:
0         0
1         0
2         0
3         0
4         0..
284802    0
284803    0
284804    0
284805    0
284806    0
Name: Class, Length: 284807, dtype: int64
'''X = data.drop('Class',axis=1,inplace=False)print(X.shape)
print(Y.shape)
#结果:(284807, 30)
#结果:(284807,)
count_classes = pd.value_counts(data['Class'], sort = True)count_classes.plot(kind = 'bar', rot=0)plt.title("Transaction Class Distribution")plt.xticks(range(2), LABELS)plt.xlabel("Class")plt.ylabel("Frequency")

## Get the Fraud and the normal dataset fraud = data[data['Class']==1]#欺诈信息normal = data[data['Class']==0]print(fraud.shape,normal.shape)
#结果:(492, 31) (284315, 31)
#两类数据差距较大

 二、不做处理建模

from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_scoreX_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.3, random_state=1)model = XGBClassifier()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)accuracy = accuracy_score(y_test, y_pred)
print("Accuracy: %.2f%%" % (accuracy * 100.0))
#结果:Accuracy: 99.95%confusion_matrix(y_true=y_test, y_pred=y_pred)
'''结果:
array([[85297,    11],[   31,   104]], dtype=int64)
'''precision_score(y_test, y_pred)
#结果:0.9043478260869565#对于预测结果为0的较为准确,但是我们需要预测的是为1,欺诈数据
#不做处理建模的数据,对于0的准确,对于1的相对而言更不准确
from matplotlib import pyplot as pltconf_mat = confusion_matrix(y_true=y_test, y_pred=y_pred)
print('Confusion matrix:\n', conf_mat)labels = ['Class 0', 'Class 1']
fig = plt.figure()
ax = fig.add_subplot(111)
cax = ax.matshow(conf_mat, cmap=plt.cm.Blues)
fig.colorbar(cax)
ax.set_xticklabels([''] + labels)
ax.set_yticklabels([''] + labels)
plt.xlabel('Predicted')
plt.ylabel('Expected')
plt.show()#对于预测结果为0的较为准确,但是我们需要预测的是为1,欺诈数据
#不做处理建模的数据,对于0的准确,对于1的相对而言更不准确

 三、under_sampling建模

Under-sampling是一种用于处理不平衡数据集的技术,主要用于解决分类问题中类别不平衡的情况。当一个类别的样本数量明显少于其他类别时,模型往往会对多数类别进行过度拟合,从而导致对少数类别的预测效果较差。

Under-sampling通过随机删除多数类别样本的方式来减少多数类别的样本数量,以使其与少数类别的样本数量相近。这样可以有效降低多数类别的影响,提高模型对少数类别的分类性能。

常见的Under-sampling方法包括:

  1. 随机欠采样(Random Under-Sampling):随机从多数类别中删除一些样本,使其数量与少数类别相等。
  2. 附近欠采样(NearMiss):根据距离度量选择多数类别样本的子集,以保留与少数类别样本最近的样本。
  3. Tomek链接(Tomek Links):删除多数类别样本和少数类别样本的Tomek链接,这些链接定义为在欧氏距离下最近邻关系中属于不同类别的样本对。
  4. Edited Nearest Neighbors(ENN):删除多数类别样本中被它们的最近邻分错的样本。

Under-sampling方法可以帮助提高模型的预测性能,但也会导致信息的损失,因此需要根据实际问题进行权衡和选择。

3.1under_sampling NearMiss 

from imblearn.under_sampling import NearMissnm = NearMiss()
X_res,y_res=nm.fit_resample(X,Y)X_res.shape,y_res.shape
#结果:((984, 30), (984,))from collections import Counter
print('Original dataset shape {}'.format(Counter(Y)))
print('Resampled dataset shape {}'.format(Counter(y_res)))
'''结果:
Original dataset shape Counter({0: 284315, 1: 492})
Resampled dataset shape Counter({0: 492, 1: 492})
将不平衡数据进行处理,将多的类数据减少到与少的数据一样
'''X_train, X_test, y_train, y_test = train_test_split(X_res, y_res, test_size=0.3, random_state=1)model = XGBClassifier()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)accuracy = accuracy_score(y_test, y_pred)
print("Accuracy: %.2f%%" % (accuracy * 100.0))
#结果:Accuracy: 95.61%confusion_matrix(y_true=y_test, y_pred=y_pred)
'''结果:
array([[140,   2],[ 11, 143]], dtype=int64
'''precision_score(y_test, y_pred)
#结果:0.986206896551724

3.2under_sampling RandomUnderSampler

from imblearn.under_sampling import RandomUnderSamplerrus = RandomUnderSampler(random_state=0)
rus.fit(X, Y)
X_res, y_res = rus.fit_resample(X, Y)X_res.shape,y_res.shape
#结果:((984, 30), (984,))from collections import Counter
print('Original dataset shape {}'.format(Counter(Y)))
print('Resampled dataset shape {}'.format(Counter(y_res)))
'''结果:
Original dataset shape Counter({0: 284315, 1: 492})
Resampled dataset shape Counter({0: 492, 1: 492})
'''X_train, X_test, y_train, y_test = train_test_split(X_res, y_res, test_size=0.3, random_state=1)model = XGBClassifier()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)accuracy = accuracy_score(y_test, y_pred)
print("Accuracy: %.2f%%" % (accuracy * 100.0))
#结果:Accuracy: 94.93%confusion_matrix(y_true=y_test, y_pred=y_pred)
'''结果:
array([[139,   3],[ 12, 142]], dtype=int64)
'''precision_score(y_test, y_pred)
#结果:0.9793103448275862

评价 

accuracy_score和precision_score是评估分类模型性能的指标,主要用于衡量模型的预测准确性和精确性。

accuracy_score(准确率)是指模型正确预测的样本数占总样本数的比例。它是一个简单直观的度量,适用于类别平衡的情况。然而,在类别不平衡的情况下,accuracy_score可能会产生误导性的结果,因为模型可能会倾向于预测多数类别。

precision_score(精确率)是指模型预测为正例的样本中,实际为正例的比例。它衡量了模型在将负例误判为正例时的错误率。precision_score适用于模型需要准确判断正例的任务,比如疾病诊断或垃圾邮件过滤。

区别总结如下:

  • accuracy_score衡量了模型整体的准确性,precision_score衡量了模型在预测为正例时的准确性。
  • accuracy_score对多数类别和少数类别的预测结果都一视同仁,而precision_score更注重少数类别(正例)的预测准确性。
  • 在类别不平衡的情况下,accuracy_score可能不是一个合适的度量标准,而precision_score可以更好地评估模型的性能。

在实际应用中,我们通常需要综合考虑多个指标来评估模型的性能,以更全面地了解模型的表现。

我们可以看到通过under_sampling建模后,accuracy_score值虽然有所降低,但是precision_score值升高了,而accuracy_score对多数类别和少数类别的预测结果都一视同仁,而precision_score更注重少数类别(正例)的预测准确性。我们所测的交易欺诈为少数类别,所以更加准确,适合用under_sampling。

四、 over_sampling建模

4.1over_sampling SMOTETomek

SMOTETomek是一种结合了SMOTE(Synthetic Minority Over-sampling Technique)和Tomek Links的方法,用于处理不平衡数据集的一种采样技术。

在不平衡数据集中,少数类别的样本数量较少,导致模型在预测时可能倾向于预测多数类别,从而影响模型的性能。为了解决这个问题,可以使用过采样(over-sampling)和欠采样(under-sampling)的技术来平衡数据集。

SMOTE是一种过采样技术,它通过合成(synthesizing)新的少数类别样本来增加其数量。它基于少数类别样本之间的相似性,生成新的样本来扩充数据集。然而,SMOTE可能会生成过多的噪声样本,使得模型过拟合。

Tomek Links是一种欠采样技术,它通过检测少数类别样本之间的Tomek Links(即两个不同类别的样本之间的最近邻对)来删减样本。Tomek Links可以帮助剔除类别之间重叠的样本,从而提升模型的分类性能。

SMOTETomek结合了SMOTE和Tomek Links的方法,首先使用SMOTE生成合成样本来增加少数类别的数量,然后使用Tomek Links来删除类别之间的重叠样本,从而达到平衡数据集的目的。通过结合过采样和欠采样的技术,SMOTETomek能够有效处理不平衡数据集,并提升模型的性能。

from imblearn.combine import SMOTETomek# Implementing Oversampling for Handling Imbalanced 
smk = SMOTETomek(random_state=42)
X_res,y_res=smk.fit_resample(X,Y)X_res.shape,y_res.shape
#结果:((567562, 30), (567562,))from collections import Counter
print('Original dataset shape {}'.format(Counter(Y)))
print('Resampled dataset shape {}'.format(Counter(y_res)))
'''结果:
Original dataset shape Counter({0: 284315, 1: 492})
Resampled dataset shape Counter({0: 283781, 1: 283781})欺诈类数据,较少的数据增多到与多的那类数据一样
'''X_train, X_test, y_train, y_test = train_test_split(X_res, y_res, test_size=0.3, random_state=1)model = XGBClassifier()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)accuracy = accuracy_score(y_test, y_pred)
print("Accuracy: %.2f%%" % (accuracy * 100.0))
#结果:Accuracy: 99.98%confusion_matrix(y_true=y_test, y_pred=y_pred)
'''结果:
array([[85257,    36],[    0, 84976]], dtype=int64)
'''precision_score(y_test, y_pred)
#结果:0.9995765303721827

 4.2over_sampling RandomOverSampler

from imblearn.over_sampling import RandomOverSampleros =  RandomOverSampler(random_state=10)
X_res, y_res = os.fit_resample(X, Y)
X_res.shape,y_res.shape
#结果:((568630, 30), (568630,))print('Original dataset shape {}'.format(Counter(Y)))
print('Resampled dataset shape {}'.format(Counter(y_res)))
'''结果:
Original dataset shape Counter({0: 284315, 1: 492})
Resampled dataset shape Counter({0: 284315, 1: 284315})
'''X_train, X_test, y_train, y_test = train_test_split(X_res, y_res, test_size=0.3, random_state=1)model = XGBClassifier()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)accuracy = accuracy_score(y_test, y_pred)
print("Accuracy: %.2f%%" % (accuracy * 100.0))
#结果:Accuracy: 99.99%confusion_matrix(y_true=y_test, y_pred=y_pred)
'''结果:
array([[85412,    16],[    0, 85161]], dtype=int64)
'''precision_score(y_test, y_pred)
#结果:0.9998121558636721

评价

明显用over_sampling来建模,不仅precision_score的值提高了,accuracy_score的值还没有降低,说明在预测交易欺诈这个数据集类型时,用over_sampling会更好

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git项目分支管理规范

一、分支管理 创建项目时&#xff0c;会针对不同环境创建两个常设分支(也可以算主分支&#xff0c;永久不会删除) master&#xff1a;生产环境的稳定分支&#xff0c;生产环境基于该分支构建。仅用来发布新版本&#xff0c;除了从release测试分支或 hotfix-*Bug修复分支进行m…

基于D2-NET的图像配准(基于PYQT的可运行界面)

这是之前对D2-NET的一个封装。D2-NET在图像配准领域还是占有一席之地的。 我们在D2-NET的基础上进行了一些小小的改动&#xff0c;也增加了FLANNRANSAC的提纯策略&#xff0c;同时增加了PYQT的一个界面。 参考的代码&#xff1a;代码1 代码2 首先介绍一下这个界面&#x…

计算机网络课程设计-网络聊天程序的设计与实现

目录 前言 1 实验题目 2 实验目的 3 实验内容 3.1 客户端 3.1.1 步骤 3.1.2 关键代码 3.2 服务器 3.2.1 步骤 3.2.2 关键代码 4 实验结果与分析 5 代码 5.1 客户端 5.2 服务器 前言 本实验为计算机网络课程设计内容&#xff0c;基本上所有代码都是根据指导书给的附…

RDMA编程实践-SEND-RECEICVE原语应用

RDMA编程实践 本文描述了RDMA编程过程中的SEND-RECEIVE双边原语的代码实现。包含多个版本&#xff0c;1、client向server发送消息&#xff0c;server回复client收到消息(ACK)&#xff0c;然后两边断开连接。2、server端循环等待客户端建立连接&#xff0c;client发送一次消息后…

【Android】为什么在子线程中更新UI不会抛出异常

转载请注明来源&#xff1a;https://blog.csdn.net/devnn/article/details/135638486 前言 众所周知&#xff0c;Android App在子线程中是不允许更新UI的&#xff0c;否则会抛出异常&#xff1a; android.view.ViewRootImpl$CalledFromWrongThreadException: Only the origin…

NumPy 中数组拼接、合并详解

1、np.append() 1.1、语法 将值添加到数组的末端&#xff0c;返回一个新的数组&#xff0c;而原数组不变。 numpy.append(arr, values, axisNone)参数描述arr : 类数组输入的数组values : 类数组向数组 arr 添加的元素&#xff0c;需要与 arr 维度相同axis : 整型添加操作的…

python对自动驾驶进行模拟

使用了 Pygame 库来创建一个简单的游戏环境,模拟了一辆自动驾驶汽车在道路上行驶。汽车的位置和速度通过键盘控制&#xff0c;可以左右移动和加速减速。道路的宽度和颜色可以根据需要进行调整。 import pygame import random # 游戏窗口大小 WINDOW_WIDTH 800 WINDOW_HEIG…

git 删除 submodule 子模块的步骤

实验有效&#xff0c;这里删除了两个 submodule。 1, 执行删除 submodule mkdir tmp1 && cd tmp1 && git clone --recursive ssh://gitaaa.bbb.ccc.git \ && cd ccc/ && git checkout -b abranch_01 \ && git submodule deinit -f…

我终于学会的前端技能——代码调试、打断点

在技术的世界里&#xff0c;要用魔法来打败魔法 说来惭愧我做前端已近三年了竟然还没有学会如何调试代码&#xff0c;也就是给自己的代码打上断点一步步看它的运行状态以达到理清代码运行逻辑、排查问题提升开发效率的目的。直到最近我才学会了这一技能&#xff0c;在这之前我…

Neos的渗透测试靶机练习——DarkHole-1

DarkHole-1 一、实验环境二、开始渗透1. 搜集信息2. sql注入4. 提权 三、总结 一、实验环境 虚拟机软件&#xff1a;VirtualBox 攻击机&#xff1a;kali linux&#xff08;网卡初始为仅主机模式&#xff0c;要有安全意识&#xff09; 靶机&#xff1a;DarkHole-1&#xff08;网…

磁盘位置不可用怎么修复?

磁盘位置不可用是计算机使用中经常遇到的问题。造成磁盘位置不可用的原因有多种&#xff0c;其中最常见的是磁盘文件系统损坏。当文件系统损坏时&#xff0c;操作系统无法正常访问磁盘上的数据&#xff0c;导致磁盘位置不可用。 磁盘位置不可用怎么修复&#xff1f; 当磁盘位置…

2024年北京市安全员-C3证证模拟考试题库及北京市安全员-C3证理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年北京市安全员-C3证证模拟考试题库及北京市安全员-C3证理论考试试题是由安全生产模拟考试一点通提供&#xff0c;北京市安全员-C3证证模拟考试题库是根据北京市安全员-C3证最新版教材&#xff0c;北京市安全员-C…