26、高级分析与机器学习:构建随机切割森林模型

高级分析与机器学习:构建随机切割森林模型

1. 数据清理与存储

在处理事件数据时,我们需要对事件的 JSON 数据进行清理。具体操作是向 JSON 中添加转换后的值,并添加当前类型,同时去除一些不必要的值,如旧的字节字符串和类型元素。以下是清理后的 JSON 示例:

final json (event): <class 'dict'> {'id': 'ReadCurrent', 
'datetime': '2022-10-07T07:50:24Z', 'current': 250}

清理后的 JSON 数据简洁易读,可用于后续操作。我们可以将格式化后的最终 JSON 存储到格式化数据湖中,过程如下:

### store transformed message into formatted data lake
bucket_name = "s3-datalake-iot-formatted"
file_name = str(minute) + ":" + str(second) + ".json" 
folder_path = "modbus/conveyer/" + str(eui) + "/current/" + 
str(year) + "/" + str(month) + "/" + str(day) + "/" + str(hour) 
+ "/" + file_name 
s3.put_object(Bucket=bucket_name, Key=folder_path, 
Body=json.dumps(event))

此外,我们还在代码中添加了用于模型集成的占位符,以便后续构建模型后进行实时异常检测:

### placeholder for model integration ###
### finish
return event

2. 选择模型算法

在使用 Amazon SageMaker 开发机器学习模型之前,需要进行一些数据工程工作。SageMaker 提供了许多内置算法和预训练模型,我们选择随机切割森林(Random Cut Forest,RCF)算法作为示例。

RCF 是一种无监督学习算法,用于检测数据集中偏离正常结构的数据点,即异常值。它适用于处理时间序列数据,能够检测数据中的峰值、延迟或因生产、季节问题导致的异常波动。由于我们的原始数据结构较为规整,假设模拟器生成的值恒定或仅有微小变化,RCF 可以分析这些数据,确定数据点是否超出给定目标范围。

2.1 RCF 算法参数

RCF 算法只有几个可配置的参数,包括模型定义的树的数量和每棵树的随机样本数量,但无法控制特定特征进入哪棵树。由于参数较少,RCF 模型通常具有较高的偏差和较低的方差:
- 偏差(Bias) :模型的平均预测值与正确值预测之间的差异,即模型预测值与实际值之间的差距。
- 方差(Variance) :给定值的预测变化程度以及不同数据集之间的变化量。

偏差和方差呈反比关系,我们的目标是为模型找到两者之间的良好平衡,使用 RCF 时,我们希望在测试数据中实现更高的准确性和更低的偏差。

2.2 构建和测试模型的步骤

构建和测试模型的步骤如下:
1. 转换训练数据
2. 设置并训练模型
3. 部署和测试模型

3. 转换训练数据

为了便于将数据输入到 SageMaker 中进行模型训练,我们需要对数据进行转换和格式化。SageMaker 的内置算法支持多种标准数据格式,我们可以使用 Pipe 模式直接从 S3 流式传输数据,这样可以节省训练实例的磁盘空间。

在本示例中,我们将训练数据以 CSV 格式提供。具体做法是收集单个 JSON 输出文件,并将它们合并为一个 CSV 文件。我们希望生成一个简化的、无标题的 CSV 文件,并确保目标值(即当前测量值)位于列表的首位。

3.1 使用 AWS Glue DataBrew

AWS Glue DataBrew 是 AWS 提供的用于清理和格式化数据的工具,它可以简单高效地完成数据转换任务,并且允许我们根据需要对数据进行少量或大量的操作。使用 DataBrew 将数据从格式化数据湖移动和转换到策划数据湖的步骤如下:
1. 格式化数据湖数据 :格式化数据湖中的数据是一组解码后的单个 JSON 文件,每个文件包含单个测量值。这种文件存储格式不是最优的,因为大量小数据文件在 S3 中移动和存储的成本较高。
2. 创建数据集 :创建一个数据集,收集格式化 S3 存储桶中的数据。我们可以确定收集的数据量和特定时间段,这在后续使用最新数据重新训练模型时会很有用。
3. 创建项目 :项目连接到数据集,允许我们直观地处理数据,将其转换为所需的格式。我们可以为项目添加一个配方,对数据进行细微的操作和转换。在本示例中,我们只需要将数据聚合为一个 CSV 文件,无需进行根本性的转换。
4. 创建作业 :创建一个作业,将处理后的数据移动到策划 S3 存储桶中,供数据科学团队使用。

以下是 DataBrew 处理数据的流程图:

graph LR
    A[格式化数据湖] --> B[创建数据集]
    B --> C[创建项目]
    C --> D[添加配方]
    D --> E[创建作业]
    E --> F[策划数据湖]

4. 设置和训练模型

4.1 选择 SageMaker 环境

Amazon SageMaker 提供了多种用于机器学习和模型构建的工具,首次启动 SageMaker 时,需要设置一个域,该域用于存储所有持久的 SageMaker 资源,包括文件存储、用户和安全信息以及 VPC 配置。设置完成后,将显示可用的机器学习环境列表,不同环境适用于不同经验、技能和需求的从业者:
| 环境名称 | 特点 | 适用人群 |
| ---- | ---- | ---- |
| Studio | 功能齐全的工作空间,集成了 Python SDK,可用于构建、测试、部署和监控模型 | 熟悉 Python 编程的开发者或工程师 |
| Studio Lab | 免费应用程序,无需 AWS 账户,可用于测试 ML 场景 | 关注成本且想学习 ML 的用户 |
| Canvas | 无代码界面,可使用 ML 生成预测,创建的模型可导入 Amazon SageMaker 进行进一步协作和使用 | 非技术人员 |
| RStudio | R 语言的集成开发环境,R 中的统计包通常比 Python 更强大 | 有经验的专业数据科学家 |

我们选择 SageMaker Studio 进行工作,启动后将直接进入工作室工作区。从启动器页面可以获取各种示例或可用模型,还可以启动 SageMaker JumpStart,其中包含许多示例,包括本示例借鉴的《SageMaker 随机切割森林简介》教程。

4.2 使用 Jupyter 笔记本

从文件菜单中可以启动一个新的 Jupyter 笔记本。Jupyter 笔记本允许我们将文档、代码和终端输出组合在一个页面上,便于学习和理解数据,并对数据转换进行注释和说明。

以下是在 Jupyter 笔记本中构建和部署模型的代码示例:

import boto3
import botocore
import sagemaker
import sys
from time import gmtime, strftime

# S3 bucket where training input and output will be stored.
bucket = sagemaker.Session().default_bucket()  
prefix = "sagemaker/rcf-modbus"
execution_role = sagemaker.get_execution_role()
region = boto3.Session().region_name

# S3 bucket where the original testing data is stored.
downloaded_data_bucket = f"s3-datalake-iot-curated"
downloaded_data_prefix = "trainingdata/modbus/current/modbus-
conveyer-current-databrew-job_09Oct2022_1665313856936"

# Output the data locations for reference. 
print(f"Training input/output will be stored in: s3://{bucket}/
{prefix}")
print(f"Downloaded training data will be read from s3://
{downloaded_data_bucket}/{downloaded_data_prefix}")

%%time
import pandas as pd
import urllib.request
data_filename = "modbus-conveyer-current-databrew-
job_09Oct2022_1664007637220_part00000.csv.gz"
s3 = boto3.client("s3")
s3.download_file(downloaded_data_bucket, f"{downloaded_data_
prefix}/{data_filename}", data_filename)
current_data = pd.read_csv(data_filename, delimiter=",")

current_data.head()
current_data.info

%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
matplotlib.rcParams["figure.dpi"] = 100
current_data[500:700].plot("datetime", "current")
plt.ylim(0, 30)

from sagemaker import RandomCutForest
session = sagemaker.Session()
# specify general training job information
rcf = RandomCutForest(
    role=execution_role,
    instance_count=1,
    instance_type="ml.m4.xlarge",
    data_location=f"s3://{bucket}/{prefix}/",
    output_path=f"s3://{bucket}/{prefix}/output",
    num_samples_per_tree=512,
    num_trees=50,
    base_job_name = f"modbus-current-randomforest-
{strftime('%Y-%m-%d-%H-%M-%S', gmtime())}"
)
# automatically upload the training data to S3 and run the 
training job
rcf.fit(rcf.record_set(current_data.current.to_numpy().
reshape(-1, 1)))

print(f"Training job name: {rcf.latest_training_job.job_name}")

在上述代码中,我们首先导入必要的库,定义 S3 存储位置,然后使用 pandas 库下载并读取训练数据。接着,我们使用 matplotlib 库对数据进行可视化,最后使用 SageMaker 的 RandomCutForest 类设置模型参数并进行训练。训练完成后,打印出训练作业的名称。

通过以上步骤,我们完成了从数据清理、模型选择、数据转换到模型训练的整个过程,为后续的异常检测和模型部署奠定了基础。

5. 模型训练过程分析

5.1 代码执行时间监控

在使用 Jupyter 笔记本运行代码时,我们使用了 %%time 魔法命令来监控代码的执行时间。这个命令会打印出 CPU 时间和实际运行时间,让我们了解代码执行的效率。例如,在下载数据文件并读取样本数据到 pandas DataFrame 的过程中,输出如下:

CPU times: user 36.6 ms, sys: 0 ns, total: 36.6 ms
Wall time: 161 ms

这表明该代码块在 CPU 上花费了 36.6 毫秒的用户时间,系统时间为 0 毫秒,总共花费了 36.6 毫秒的 CPU 时间,而实际运行时间为 161 毫秒。

5.2 数据查看与可视化

我们可以使用 pandas DataFrame 的多种方法来查看数据。 current_data.head() 方法返回数据对象的前几行,默认返回五行,也可以根据需要调整行数。 current_data.info 方法提供了数据对象的摘要信息,包括前五行(头部)和后五行(尾部)的数据,以及每行的行数和元素概述。

为了更直观地了解数据,我们使用 matplotlib 库进行数据可视化。以下是代码示例:

%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
matplotlib.rcParams["figure.dpi"] = 100
current_data[500:700].plot("datetime", "current")
plt.ylim(0, 30)

在这个代码中,我们只选取了第 500 到 700 行的数据进行绘图,因为数据量较大,如果不进行筛选,可能会导致图形显示不清晰。通过设置 plt.ylim(0, 30) ,我们限定了 y 轴的范围,使图形更易于观察。

5.3 模型训练过程

使用 SageMaker 的 RandomCutForest 类设置模型参数并进行训练时,会输出一系列的训练信息。以下是训练过程的部分输出示例:

Defaulting to the only supported framework/algorithm version: 
1. Ignoring framework/algorithm version: 1.
2022-09-26 06:33:56 Starting - Starting the training job...
2022-09-26 06:34:24 Starting - Preparing the instances for 
trainingProfilerReport-1664174036: InProgress
.........
2022-09-26 06:35:48 Downloading - Downloading input data...
2022-09-26 06:36:08 Training - Downloading the training 
image...............
2022-09-26 06:38:50 Training - Training image download 
completed. Training in progress..Docker entrypoint called with 
argument(s): train
Running default environment configuration script
… lots of stuff going on here …
2022-09-26 06:39:29 Uploading - Uploading generated training 
model
2022-09-26 06:39:29 Completed - Training job completed
Training seconds: 227
Billable seconds: 227

从这些输出中,我们可以看到训练作业的各个阶段,包括启动、准备实例、下载输入数据、下载训练镜像、开始训练和上传生成的模型等。最终,如果看到 Training job completed 输出,说明训练作业已成功完成。

6. 模型部署与应用

6.1 模型部署流程

训练完成的模型可以进行部署,以便在实际应用中进行异常检测。以下是模型部署的一般流程:
1. 选择部署环境 :根据实际需求选择合适的部署环境,如 SageMaker 提供的不同实例类型。
2. 配置部署参数 :设置部署所需的参数,如实例数量、实例类型等。
3. 启动部署 :使用 SageMaker 的 API 或控制台启动模型部署。

6.2 异常检测应用

部署后的模型可以实时接收新的数据,并进行异常检测。以下是一个简单的异常检测示例:

# 假设已经部署了模型,获取模型的端点名称
endpoint_name = rcf.latest_training_job.job_name + '-endpoint'

# 创建 SageMaker 运行时客户端
runtime = boto3.client('runtime.sagemaker')

# 准备要检测的数据
new_data = [250, 255, 260]  # 示例数据
new_data_bytes = ','.join(map(str, new_data)).encode('utf-8')

# 调用模型端点进行预测
response = runtime.invoke_endpoint(
    EndpointName=endpoint_name,
    ContentType='text/csv',
    Body=new_data_bytes
)

# 解析预测结果
result = response['Body'].read().decode('utf-8')
anomaly_scores = [float(score) for score in result.split(',')]

# 判断是否为异常值
threshold = 0.5  # 异常阈值
for i, score in enumerate(anomaly_scores):
    if score > threshold:
        print(f"数据点 {new_data[i]} 是异常值,异常分数: {score}")
    else:
        print(f"数据点 {new_data[i]} 是正常值,异常分数: {score}")

在这个示例中,我们首先获取训练作业对应的端点名称,然后创建 SageMaker 运行时客户端。准备好要检测的新数据后,调用模型端点进行预测,解析预测结果并根据设定的阈值判断数据点是否为异常值。

7. 总结

通过以上步骤,我们完成了从数据清理、模型选择、数据转换、模型训练到模型部署和应用的整个流程。以下是整个流程的 mermaid 流程图:

graph LR
    A[数据清理] --> B[选择模型算法]
    B --> C[转换训练数据]
    C --> D[设置和训练模型]
    D --> E[模型部署]
    E --> F[异常检测应用]

在实际应用中,我们可以根据具体需求调整模型参数、优化数据处理流程,以提高模型的性能和准确性。同时,不断收集新的数据并重新训练模型,以适应数据分布的变化,确保模型始终保持良好的性能。

总之,使用随机切割森林(RCF)算法结合 Amazon SageMaker 平台,可以有效地进行数据异常检测,为业务决策提供有力支持。

内容概要:本文介绍了一个基于Matlab的综合能源系统优化调度仿真资源,重点实现了含光热电站、有机朗肯循环(ORC)和电含光热电站、有机有机朗肯循环、P2G的综合能源优化调度(Matlab代码实现)转气(P2G)技术的冷、热、电多能互补系统的优化调度模型。该模型充分考虑多种能源形式的协同转换利用,通过Matlab代码构建系统架构、设定约束条件并求解优化目标,旨在提升综合能源系统的运行效率经济性,同时兼顾灵活性供需不确定性下的储能优化配置问题。文中还提到了相关仿真技术支持,如YALMIP工具包的应用,适用于复杂能源系统的建模求解。; 适合人群:具备一定Matlab编程基础和能源系统背景知识的科研人员、研究生及工程技术人员,尤其适合从事综合能源系统、可再生能源利用、电力系统优化等方向的研究者。; 使用场景及目标:①研究含光热、ORC和P2G的多能系统协调调度机制;②开展考虑不确定性的储能优化配置经济调度仿真;③学习Matlab在能源系统优化中的建模求解方法,复现高水平论文(如EI期刊)中的算法案例。; 阅读建议:建议读者结合文档提供的网盘资源,下载完整代码和案例文件,按照目录顺序逐步学习,重点关注模型构建逻辑、约束设置求解器调用方式,并通过修改参数进行仿真实验,加深对综合能源系统优化调度的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值