17、欺诈分析与人类活动识别中的机器学习技术

欺诈分析与人类活动识别中的机器学习技术

1. 欺诈分析相关技术

1.1 评估指标计算类

为了计算精度、召回率、灵敏度、特异性、真阳性、真阴性、假阳性和假阴性等指标,定义了三个 Scala 案例类:

case class r(precision: Double, recall: Double)
case class r2(sensitivity: Double, specificity: Double)
case class r3(tp: Double, fp: Double, tn: Double, fn: Double, th: Double)

1.2 超参数调整和特征选择

可以通过调整超参数来提高模型的准确性,例如隐藏层的数量、每个隐藏层中的神经元数量、训练轮数和激活函数。基于 H2O 的深度学习模型当前支持以下激活函数:
- ExpRectifier
- ExpRectifierWithDropout
- Maxout
- MaxoutWithDropout
- Rectifier
- RectifierWthDropout
- Tanh
- TanhWithDropout

除了 Tanh 激活函数外,其他激活函数可以尝试使用。使用基于 H2O 的深度学习算法的一个重要优势是可以获取相对变量/特征的重要性。如果模型表现不佳,可以考虑删除不太重要的特征并重新训练。例如,在某些实验中发现 Time、V21、V17 和 V6 是不太重要的特征,可以尝试删除它们并重新训练,观察准确性是否提高。此外,网格搜索或交叉验证技术也可以提高准确性。

1.3 欺诈分析总结

使用包含超过 284,807 个信用卡使用实例的数据集,其中只有 0.172% 的交易是欺诈性的。通过自编码器预训练分类模型,并应用异常检测技术从高度不平衡的数据中预测可能的欺诈交易。最终模型正确识别了 83% 的欺诈案例和几乎 100% 的非欺诈案例。同时,还介绍了使用异常值进行异常检测、超参数调整和特征选择的方法。

2. 循环神经网络(RNN)基础

2.1 RNN 概述

RNN 是一类人工神经网络,其中单元之间的连接形成有向循环。RNN 可以利用过去的信息,因此能够对具有高时间依赖性的数据进行预测。与传统神经网络不同,RNN 有一个循环,允许信息持久存在。在时间 t,输入 $x_t$ 并输出值 $h_t$,可以将 RNN 看作是同一网络的多个副本,每个副本将消息传递给后继者。

2.2 RNN 架构

RNN 的架构可以用以下公式表示:
- 前半部分:$Z(t) = X(t) * W_{in}$
- 后半部分:$Y(t)= Z(t) * W_{out}$
- 整体:$Y(t) = (X(t) * W_{in}) * W_{out}$

在每个时间 t,调用学习到的模型,但这种架构没有考虑到之前运行的知识。更好的方法是利用一周或几个月的数据中的总体模式。RNN 的另一种更明确的架构中,除了输入层的权重 $w_1$ 和输出层的权重 $w_3$ 外,还需要学习隐藏层的时间共享权重 $w_2$。

2.3 RNN 的应用

近年来,RNN 已被用于各种问题,如语音识别、语言建模、翻译和图像字幕等。

2.4 RNN 的长期依赖问题

RNN 虽然强大且流行,但在处理长期依赖问题时存在局限性。例如,在自然语言处理的语言建模中,当相关信息和需要该信息的位置之间的差距较小时,RNN 可以轻松学习使用过去的信息;但当差距较大时,RNN 就无法有效地学习这些信息。例如,在句子 “Asif grew up in Bangladesh… He studied in Korea… He speaks fluent Bengali” 中,要准确预测下一个单词,需要前面提到的 “Bangladesh” 的上下文信息,而 RNN 在这种情况下可能表现不佳。

2.5 LSTM 网络

LSTM 是 RNN 的一种改进变体,由 Hochreiter 和 Schmidhuber 在 1997 年提出。LSTM 网络可以避免梯度消失问题,在处理时间序列的预测和分类任务中表现出色,正逐渐取代许多传统的深度学习方法。

LSTM 网络由相互连接的单元(LSTM 块)组成,每个 LSTM 块包含输入门、输出门和遗忘门,分别实现写入、读取和重置单元内存的功能。这些门不是二进制的,而是模拟的,通常由映射在 (0, 1) 范围内的 Sigmoid 激活函数管理,其中 0 表示完全抑制,1 表示完全激活。

LSTM 单元的状态分为短期状态 $h(t)$ 和长期状态 $c(t)$。长期状态 $c(t - 1)$ 首先通过遗忘门丢弃一些记忆,然后通过加法操作添加一些新的记忆(由输入门选择),得到的 $c(t)$ 直接输出。经过加法操作后,长期状态被复制并通过 tanh 函数,然后结果由输出门过滤,产生短期状态 $h(t)$,它等于该时间步的单元输出 $y(t)$。

LSTM 单元的计算涉及以下权重矩阵和偏置项:
- 与输入向量 $x(t)$ 连接的四个层的权重矩阵:$W_{xi}$、$W_{xf}$、$W_{xo}$ 和 $W_{xg}$。
- 与前一个短期状态 $h(t - 1)$ 连接的四个层的权重矩阵:$W_{hi}$、$W_{hf}$、$W_{ho}$ 和 $W_{hg}$。
- 四个层的偏置项:$b_i$、$b_f$、$b_o$ 和 $b_g$。

下面是 LSTM 计算的流程 mermaid 图:

graph LR
    A[x(t), h(t-1)] --> B[四个全连接层]
    B --> C[输入门]
    B --> D[遗忘门]
    B --> E[输出门]
    B --> F[候选记忆]
    G[c(t-1)] --> D
    D --> H[丢弃部分记忆]
    H --> I[c(t)部分]
    C --> J[选择新记忆]
    J --> I
    I --> K[c(t)]
    K --> L[复制]
    L --> M[tanh函数]
    M --> E
    E --> N[过滤]
    N --> O[h(t)=y(t)]

3. 基于 LSTM 的人类活动识别

3.1 数据集描述

人类活动识别(HAR)数据库是基于 30 名研究参与者在携带装有惯性传感器的智能手机进行日常生活活动(ADL)时的记录构建的。目标是将活动分类为六种类型:步行、上楼、下楼、坐着、站立和躺下。

实验在 19 - 48 岁的 30 名志愿者中进行,每人佩戴三星 Galaxy S II 智能手机完成六种活动。使用加速度计和陀螺仪以 50 Hz 的恒定速率捕获 3 轴线性加速度和 3 轴角速度。传感器信号经过噪声滤波预处理,并在 2.56 秒的固定宽度滑动窗口中采样,重叠率为 50%,每个窗口有 128 个读数。通过 Butterworth 低通滤波器将传感器加速度信号中的重力和身体运动分量分离为身体加速度和重力。

数据集随机分为训练集和测试集,其中 70% 的志愿者用于生成训练数据,30% 用于测试数据。每个记录包含以下信息:
- 加速度计的三轴加速度和估计的身体加速度
- 陀螺仪传感器的三轴角速度
- 具有时间和频率域变量的 561 维特征向量
- 活动标签
- 进行实验的受试者的标识符

3.2 MXNet 配置

为了实现基于 MXNet 和 Scala 的 LSTM 模型,需要配置以下工具和库:
1. 安装构建工具和 git :在 Ubuntu 上执行以下命令:

sudo apt-get update
sudo apt-get install -y build-essential git
  1. 安装 OpenBLAS 和 ATLAS :用于 MXNet 执行线性代数运算,执行以下命令:
sudo apt-get install -y libopenblas-dev
sudo apt-get install -y libatlas-base-dev
  1. 安装 OpenCV :用于图像处理,执行以下命令:
sudo apt-get install -y libopencv-dev
  1. 克隆并构建 MXNet for Scala
git clone --recursive https://github.com/apache/incubator-mxnet.git mxnet --branch 0.12.0
cd mxnet
make -j $(nproc) USE_OPENCV=1 USE_BLAS=openblas
make scalapkg
make scalainsta

如果上述步骤顺利完成,将在 /home/$user_name/mxnet/scala-package/assembly/linux-x86_64-cpu (或在 Linux 上配置 GPU 时为 linux-x86_64-gpu ,在 macOS 上为 osx-x86_64-cpu )生成预构建的 MXNet 二进制文件。

在 Eclipse(或 IntelliJ)中编写 Scala 代码作为 Maven(或 SBT)项目之前,需要将生成的 JAR 文件包含在构建路径中。此外,还需要添加以下额外的依赖项:

<dependency>
    <groupId>org.sameersingh.scalaplot</groupId>
    <artifactId>scalaplot</artifactId>
    <version>0.0.4</version>
</dependency>
<dependency>
    <groupId>args4j</groupId>
    <artifactId>args4j</artifactId>
    <version>2.0.29</version>
</dependency>

配置完成后,就可以开始编码实现基于 LSTM 的人类活动识别模型了。

3.3 模型实现与训练

在完成 MXNet 的配置后,接下来我们可以开始使用 MXNet 和 Scala 实现基于 LSTM 的人类活动识别模型。以下是一个简单的实现步骤流程:

graph TD
    A[数据预处理] --> B[构建 LSTM 模型]
    B --> C[模型训练]
    C --> D[模型评估]
3.3.1 数据预处理

在进行模型训练之前,需要对 HAR 数据集进行预处理,以确保数据能够被模型正确使用。具体步骤如下:
1. 加载数据 :将训练集和测试集的数据加载到内存中。
2. 数据标准化 :对特征向量进行标准化处理,使数据具有零均值和单位方差,有助于模型的收敛。
3. 数据划分 :将加载的数据划分为输入特征和对应的活动标签。

以下是一个简单的数据加载和标准化的示例代码:

import org.apache.mxnet._
import scala.collection.mutable.ArrayBuffer

// 加载数据
def loadData(filePath: String): (NDArray, NDArray) = {
    // 读取文件并解析数据
    val data = scala.io.Source.fromFile(filePath).getLines().map(_.split(",").map(_.toFloat)).toArray
    val features = NDArray.array(data.map(_.dropRight(1)), Shape(data.length, data(0).length - 1))
    val labels = NDArray.array(data.map(_.last), Shape(data.length))
    (features, labels)
}

// 数据标准化
def normalizeData(data: NDArray): NDArray = {
    val mean = NDArray.mean(data, axis = 0)
    val std = NDArray.std(data, axis = 0)
    (data - mean) / std
}

// 加载训练集和测试集
val (trainFeatures, trainLabels) = loadData("train_data.csv")
val (testFeatures, testLabels) = loadData("test_data.csv")

// 数据标准化
val normalizedTrainFeatures = normalizeData(trainFeatures)
val normalizedTestFeatures = normalizeData(testFeatures)
3.3.2 构建 LSTM 模型

使用 MXNet 构建 LSTM 模型,定义模型的结构和参数。以下是一个简单的 LSTM 模型构建示例:

import org.apache.mxnet.Symbol

// 定义 LSTM 模型
def buildLSTMModel(inputShape: Shape, numClasses: Int): Symbol = {
    val input = Symbol.Variable("data")
    val lstmCell = Symbol.LSTMCell(name = "lstm_cell", input = input, numHidden = 128)
    val output = Symbol.FullyConnected(name = "fc", data = lstmCell, numHidden = numClasses)
    val softmaxOutput = Symbol.SoftmaxOutput(name = "softmax", data = output)
    softmaxOutput
}

// 构建模型
val model = buildLSTMModel(Shape(normalizedTrainFeatures.shape(1)), 6)
3.3.3 模型训练

使用训练集数据对构建好的 LSTM 模型进行训练。在训练过程中,需要定义优化器、损失函数和训练轮数等参数。以下是一个简单的模型训练示例:

import org.apache.mxnet.optimizer.SGD

// 定义优化器
val optimizer = new SGD(learningRate = 0.01, momentum = 0.9)

// 定义训练参数
val trainParams = new FitParams(
    optimizer = optimizer,
    numEpoch = 10,
    batchSize = 32
)

// 训练模型
val module = new Module(symbol = model, context = Context.cpu())
module.fit(
    dataIter = new NDArrayIter(normalizedTrainFeatures, trainLabels, batchSize = trainParams.batchSize),
    fitParams = trainParams
)
3.3.4 模型评估

使用测试集数据对训练好的模型进行评估,计算模型的准确率、召回率等指标,以评估模型的性能。以下是一个简单的模型评估示例:

// 预测测试集数据
val predictions = module.predict(new NDArrayIter(normalizedTestFeatures, batchSize = trainParams.batchSize))

// 计算准确率
val accuracy = NDArray.argmax_channel(predictions).toArray.zip(testLabels.toArray).count {
    case (pred, label) => pred == label
} / testLabels.shape(0).toDouble

println(s"模型准确率: $accuracy")

3.4 模型调优

在完成模型的初步训练和评估后,如果模型的性能不理想,可以对模型进行调优。常见的调优方法包括调整超参数、增加训练数据、改进模型结构等。以下是一些常见的调优策略:

调优策略 说明
调整超参数 例如调整学习率、训练轮数、批量大小等,通过网格搜索或随机搜索等方法找到最优的超参数组合。
增加训练数据 可以通过收集更多的数据或进行数据增强来增加训练数据的数量,提高模型的泛化能力。
改进模型结构 例如增加 LSTM 层的数量、调整隐藏单元的数量等,以提高模型的表达能力。

4. 总结

本文介绍了欺诈分析和人类活动识别两个领域的相关技术。在欺诈分析中,通过自编码器预训练分类模型,并应用异常检测技术从高度不平衡的数据中预测可能的欺诈交易。同时,介绍了超参数调整和特征选择的方法,以提高模型的准确性。

在人类活动识别方面,详细介绍了循环神经网络(RNN)及其改进变体长短期记忆网络(LSTM)的原理和架构。通过使用 MXNet 和 Scala 实现基于 LSTM 的人类活动识别模型,包括数据预处理、模型构建、训练和评估等步骤。最后,还介绍了模型调优的方法,以进一步提高模型的性能。

通过这些技术和方法,我们可以更好地处理具有时间依赖性的数据,实现更准确的欺诈检测和人类活动识别。未来,随着深度学习技术的不断发展,这些方法有望在更多领域得到应用和拓展。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值