大岭山网站,阿里云服务器管理,《网站设计与建设》电子书,全球装修公司前十强【机器学习实战】kaggle 欺诈检测---如何解决欺诈数据中正负样本极度不平衡问题https://blog.csdn.net/2302_79308082/article/details/145177242 本篇文章是基于上次文章中提到的对抗生成网络#xff0c;通过对抗生成网络生成少数类样本#xff0c;平衡欺诈数据中正类样本极… 【机器学习实战】kaggle 欺诈检测---如何解决欺诈数据中正负样本极度不平衡问题https://blog.csdn.net/2302_79308082/article/details/145177242 本篇文章是基于上次文章中提到的对抗生成网络通过对抗生成网络生成少数类样本平衡欺诈数据中正类样本极少的问题。 本人主页机器学习小小白 机器学习专栏机器学习实战 PyTorch入门专栏PyTorch入门 深度学习实战深度学习 ok话不多说我们进入正题吧 1. 引言
生成对抗网络Generative Adversarial Networks简称GAN是由Ian Goodfellow等人于2014年提出的一种深度学习模型。它在计算机视觉、自然语言处理、音频生成等领域得到了广泛应用。GAN的核心思想是通过两个神经网络之间的博弈关系来生成新的、仿真的数据。自从GAN提出以来它已经成为生成模型领域的突破性进展深刻改变了生成式模型的研究和应用。 2. GAN的基本原理
生成对抗网络的结构包括两个主要部分生成器Generator和判别器Discriminator。这两个网络分别充当“对手”并在训练过程中互相博弈 生成器Generator该网络的目的是通过学习数据分布来生成尽可能接近真实数据的虚假样本。生成器从一个随机的噪声通常是高维的向量出发逐步生成样本。 判别器Discriminator该网络的任务是判断一个样本是真实的来自训练数据还是虚假的来自生成器。判别器输出一个概率值表示输入样本为真实数据的概率。
3. GAN的训练过程
GAN的训练过程是一个“博弈”过程生成器和判别器不断互相对抗从而提升各自的性能。这个过程可以通过以下的数学公式来表示
判别器的目标判别器的目标是最大化其对于真实数据的判断概率即预测为1的概率同时最小化对生成数据的错误分类即预测为0的概率。可以通过以下的交叉熵损失函数表示 其中 是从真实数据分布中采样的数据。 是生成器生成的样本是从潜在空间中采样的噪声。 是判别器对样本 的判别输出表示其为真实数据的概率。 生成器的目标生成器的目标是使判别器无法区分生成数据与真实数据因此它通过最大化判别器对生成数据为真实的概率来进行训练 其中 是生成器生成的虚假样本是判别器对生成样本的输出表示其为真实数据的概率。
在训练过程中生成器和判别器会交替优化这两个损失函数。理想的结果是生成器能够生成与真实数据分布相似的样本而判别器则无法有效地区分生成数据与真实数据。
4. GAN的应用
GAN具有强大的生成能力广泛应用于多个领域以下是一些典型的应用场景 图像生成GAN可以用于生成高度逼真的图像如人脸、风景或艺术作品。典型的例子包括DeepArt和StyleGAN后者能够生成几乎无法与真实人脸区分的图像。 图像到图像的转换例如利用GAN进行图像风格转换如将照片转化为油画风格、超分辨率重建如提高图像的分辨率、图像修复如填补丢失部分等任务。 文本生成结合自然语言处理技术GAN也可用于生成文本数据如诗歌、故事生成等尤其是文本生成和对话系统中的对抗训练。 音频生成GAN被广泛应用于音频生成如音乐生成、语音合成等。 数据增强GAN可以用于数据增强特别是在医疗图像领域生成具有一定变异的图像样本以增强训练数据集。 模型训练中的对抗样本生成GAN可以生成对抗样本即通过对训练数据进行微小扰动生成能够误导模型的样本这对提升模型的鲁棒性非常重要。
5. GAN的变种
GAN作为一种框架已经发展出了多种变种以满足不同应用的需求。以下是几种常见的GAN变种 CGANConditional GAN在生成器和判别器中都加入了条件变量使得生成的样本可以根据某些条件如标签信息进行控制。 WGANWasserstein GAN解决了传统GAN在训练过程中可能出现的梯度消失和模式崩溃问题。WGAN使用了Wasserstein距离作为生成器和判别器的损失函数。 DCGANDeep Convolutional GAN使用卷积神经网络CNN来构建生成器和判别器增强了GAN在图像生成任务中的表现。 CycleGAN用于无监督学习场景特别是在图像到图像的转换中例如将一张照片转换成另一种风格如马到斑马转换。
6. 使用生成对抗网络GAN生成欺诈数据中少数类数据
1. 数据预处理与特征提取
import pandas as pd
import numpy as nptrain_df pd.read_csv(/kaggle/input/credit-card-fraud-prediction/train.csv)
test_df pd.read_csv(/kaggle/input/credit-card-fraud-prediction/test.csv)def time_feature(df):df[Time] pd.to_datetime(df[Time], units) # 将时间戳转为 datetime 格式# 提取时间特征df[hour] df[Time].dt.hourdf[minute] df[Time].dt.minute return df train_df time_feature(train_df)
test_df time_feature(test_df)在欺诈检测任务中时间特征如交易发生的小时和分钟通常是重要的因为欺诈交易往往具有不同的时间模式。例如欺诈交易可能集中在某些特定的时间段。
这里我们通过pd.to_datetime()将Time列从Unix时间戳格式转换为日期时间格式。然后我们提取了小时和分钟作为新的特征用于训练模型。
train_feature train_df.drop(columns[id,IsFraud,Time])
test_feature test_df.drop(columns[id,Time])label train_df[IsFraud]train_feature 是用于训练的特征数据删除了 id, IsFraud 和 Time 列。IsFraud 是标签列表示交易是否为欺诈交易而 id 和 Time 列不包含有用的特征信息因此可以去掉。
2. 标准化数据
from sklearn.preprocessing import StandardScaler# 标准化特征数据
scaler StandardScaler()
train_feature_scaled scaler.fit_transform(train_feature)标准化Standardization是机器学习中常用的预处理步骤。它通过减去均值并除以标准差使特征数据具有零均值和单位方差。标准化能够加速模型的收敛过程尤其是在使用像神经网络这样的梯度优化模型时。 这里使用 StandardScaler 来对训练数据进行标准化以确保所有特征在同一个量级。
3. 生成器与判别器的构建
生成器Generator
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LeakyReLU, BatchNormalization, Inputdef build_generator(latent_dim, input_dim):model Sequential()model.add(Input(shape(latent_dim,))) # 使用 Input 层来指定输入维度model.add(Dense(256))model.add(LeakyReLU(0.2))model.add(BatchNormalization(momentum0.8))model.add(Dense(512))model.add(LeakyReLU(0.2))model.add(BatchNormalization(momentum0.8))model.add(Dense(1024))model.add(LeakyReLU(0.2))model.add(BatchNormalization(momentum0.8))model.add(Dense(input_dim, activationtanh)) # 输出层与原数据同维度return model生成器Generator是GAN的核心部分它通过接收随机噪声向量潜在空间中的点然后经过一系列的全连接层和激活函数生成与原始数据分布相似的虚假数据。
在此我们使用了 LeakyReLU 激活函数它允许梯度通过负半轴流动解决了传统ReLU可能出现的“死神经元”问题。BatchNormalization 用于加速网络的训练并帮助改善模型的稳定性。
判别器Discriminator
def build_discriminator(input_dim):model Sequential()model.add(Input(shape(input_dim,))) # 使用 Input 层来指定输入维度model.add(Dense(1024))model.add(LeakyReLU(0.2))model.add(Dense(512))model.add(LeakyReLU(0.2))model.add(Dense(256))model.add(LeakyReLU(0.2))model.add(Dense(1, activationsigmoid)) # 输出真假判定return model判别器Discriminator的任务是判断输入数据是真实的还是由生成器生成的。它是一个二分类模型输出是一个概率值表示输入数据为真实的概率。
这里使用 sigmoid 激活函数输出一个概率值。判别器学习将真实数据和生成数据区分开来。
4. GAN模型的组合与训练
def build_gan(generator, discriminator):discriminator.trainable False # 在训练GAN时冻结判别器model Sequential()model.add(generator)model.add(discriminator)return model# 定义优化器
optimizer Adam()# 定义输入维度和潜在维度
latent_dim 100 # 随机噪声的维度
input_dim 31 # 输入数据的维度例如欺诈检测数据的特征数# 创建并编译模型
generator build_generator(latent_dim, input_dim)
discriminator build_discriminator(input_dim)
gan build_gan(generator, discriminator)# 编译判别器和GAN模型
discriminator.compile(lossbinary_crossentropy, optimizeroptimizer, metrics[accuracy])
gan.compile(lossbinary_crossentropy, optimizeroptimizer)生成对抗训练Adversarial Training是GAN的关键。生成器和判别器在一个博弈过程中互相优化。在训练过程中生成器通过“欺骗”判别器来优化其生成数据的能力而判别器则不断学习区分真实和生成数据。 在训练过程中我们冻结判别器的参数只训练生成器这样可以避免在训练生成器时更新判别器的权重。
5. GAN训练函数
def train_gan(generator, discriminator, gan, fraud_data_scaled, epochs10000, batch_size64):valid np.ones((batch_size, 1)) # 真数据标签fake np.zeros((batch_size, 1)) # 假数据标签for epoch in range(epochs):# 随机选择真实欺诈数据idx np.random.randint(0, fraud_data_scaled.shape[0], batch_size)real_data fraud_data_scaled[idx]# 生成虚拟数据noise np.random.normal(0, 1, (batch_size, latent_dim))generated_data generator.predict(noise)# 训练判别器d_loss_real discriminator.train_on_batch(real_data, valid)d_loss_fake discriminator.train_on_batch(generated_data, fake)d_loss 0.5 * np.add(d_loss_real, d_loss_fake)# 训练生成器noise np.random.normal(0, 1, (batch_size, latent_dim))g_loss gan.train_on_batch(noise, valid)# 输出训练过程的损失if epoch % 1000 0:print(f{epoch}/{epochs} [D loss: {d_loss[0]}] [G loss: {g_loss}])训练过程在每个训练周期中首先更新判别器的权重通过训练它区分真实数据和生成数据然后训练生成器通过训练它欺骗判别器。 损失函数我们使用了 binary_crossentropy 损失函数它用于二分类任务。在判别器的训练中我们分别计算真实数据和生成数据的损失然后平均得到判别器的总损失。生成器的损失则是通过GAN模型进行计算的。
6. 生成虚拟数据
def generate_fake_data(generator, num_samples):noise np.random.normal(0, 1, (num_samples, latent_dim)) # 随机噪声generated_data generator.predict(noise) # 生成虚拟数据# 将生成的数据转换回原始空间generated_data_original scaler.inverse_transform(generated_data)# 获取原始负样本数据的列名去除 id, IsFraud, Time 列feature_columns [col for col in train_df.columns if col not in [id, IsFraud, Time]]# 将生成的数据与原始负样本数据即非欺诈数据结合作为新的训练数据augmented_data np.concatenate([train_df[train_df[IsFraud] 0].drop(columns[id, IsFraud, Time]),generated_data_original], axis0)augmented_label np.concatenate([np.zeros(train_df[train_df[IsFraud] 0].shape[0]), np.ones(generated_data_original.shape[0])], axis0)# 创建包含生成数据和标签的 DataFrameaugmented_df pd.DataFrame(augmented_data, columnsfeature_columns)augmented_df[IsFraud] augmented_labelreturn augmented_df在这个函数中我们使用训练好的生成器来生成新的虚拟欺诈数据并将它们与真实的非欺诈数据结合以增强数据集。然后我们通过逆标准化将生成的数据转换回原始数据空间。
本次例子为了缩短训练时间只生成了100条虚拟的正样本数据。