作者:禅与计算机程序设计艺术
1.简介
概览
Azure ML Studio是一个基于云的机器学习服务,它提供完整的端到端机器学习解决方案,包括数据准备、特征工程、模型训练、部署管理等。它支持各种类型的机器学习模型,如决策树、线性回归、逻辑回归、随机森林、支持向量机等。此外还集成了用于分析和预测的数据流工具包,可以实现实时预测。另外,Azure Functions也是一个无服务器计算平台,可以在云中快速运行代码片段,并且可以绑定到ML Studio上,用于进行机器学习模型的自动化处理。本文将详细介绍如何利用Stream Analytics作为事件源,触发Azure Function,并通过Azure ML Studio调用机器学习模型进行预测,从而构建一个实时预测系统。
阅读对象
本文适合数据科学家、开发人员或AI领域的技术人员阅读。阅读本文,你需要具备以下背景知识:
- 有一定的数据分析基础,熟悉Azure Blob Storage、EventHubs、Stream Analytics等技术;
- 对机器学习模型有基本了解,掌握一些机器学习相关术语和基本模型。
- 熟悉Azure Function、C#语言,熟练使用Visual Studio Code等工具;
- 有Azure ML Studio账户及权限。
2.基本概念术语说明
Azure ML Studio
Azure Machine Learning Studio是一种基于云的机器学习工作室,使您能够在数据中发现模式并创建预测模型。通过Studio,您可以使用算法、模块、数据集、试验等资源创建机器学习解决方案。它提供了自动化的机器学习功能,包括数据准备、特征工程、模型训练、部署管理等。除此之外,它还集成了用于分析和预测的数据流工具包,可以实现实时预测。Azure ML Studio可用于各种场景,如分类、异常检测、预测建模、推荐系统等。
EventHubs
EventHubs是一种完全托管的多用途消息传递平台。它可帮助您实时收集、处理和转送大量数据。该服务提供高级分发、容错和持久性保证,因此它非常适合用于机器学习预测系统。Azure ML Studio可以与Event Hubs集成,用于接收实时数据流。
Stream Analytics
Stream Analytics 是一种分布式流式处理引擎,可以从大量数据源提取实时事件,对其进行分析、处理、聚合和输出结果。Azure ML Studio可以与Stream Analytics集成,用于进行实时预测。
Azure Functions
Azure Functions 是一种无服务器计算平台,它让您在不需管理任何服务器的情况下运行代码片段。它可与其他Azure 服务集成,例如Event Hubs、Azure SQL数据库、Cosmos DB等,也可以用来执行机器学习模型的自动化处理。本文主要介绍如何结合Azure Functions、Stream Analytics和Azure ML Studio一起使用,实现实时预测。
3.核心算法原理和具体操作步骤以及数学公式讲解
数据预处理
由于Azure ML Studio的模型需要处理结构化数据,因此首先要对原始数据进行预处理。一般来说,数据预处理过程包括清洗、转换、规范化、拆分、合并等操作。清洗通常是指删除重复项、缺失值、异常值和无效记录。转换是指将非法字符替换为标准符号。规范化通常是指对数据进行标准化,使所有数据都位于同一量纲范围内,方便进行比较。拆分和合并则是将数据划分为子集,例如训练集和测试集,或将不同时间段的数据整合为一个表格。在Azure ML Studio中,数据预处理可以通过“导入数据”模块完成。
模型训练
模型训练可以理解为训练数据集上的参数估计。一般情况下,有两种方式可以对模型进行训练:交叉验证和超参数优化。交叉验证是一种评价模型泛化能力的方法,通过将数据集划分为多个子集(称为折叠)并训练各个子集上的模型,来评估模型在新数据上的性能。超参数优化是寻找最优超参数值的过程,例如学习率、正则化系数等。在Azure ML Studio中,模型训练可以通过“训练模型”模块完成。
模型评估
模型评估是确定模型预测效果的过程。一般来说,有多种方法可以对模型进行评估,例如准确度、精度、查准率、查全率、F1值、AUC值等。除了使用固定的指标外,Azure ML Studio还提供了多种方式来评估模型质量。例如,可以绘制ROC曲线和PR曲线,来评估二类分类器的AUC值,或绘制lift曲线和损失曲线,来评估回归模型的拟合能力。在Azure ML Studio中,模型评估可以通过“评估模型”模块完成。
模型部署
模型部署是将训练好的模型应用到生产环境中的过程。为了使模型能够访问新数据,通常会将其部署到云中,以便实时处理。Azure ML Studio支持不同的模型格式,如ONNX、PMML、Torch、Scikit-learn等。当部署完毕后,模型就可以被用于预测新数据。在Azure ML Studio中,模型部署可以通过“部署”模块完成。
Azure Function触发流程图
Azure Function与Azure ML Studio结合的方式如下图所示:
Event Hubs接收来自Stream Analytics的实时事件。
当事件到达之后,Event Hubs会将事件发送给Azure Function。
Azure Function会启动,并调用Stream Analytics查询。
Stream Analytics会从EventHubs读取数据,然后根据指定的条件将数据传递给Azure ML Studio。
Stream Analytics会等待模型的响应。
如果模型生成了一个预测结果,它就会返回给Stream Analytics。
Stream Analytics会将结果保存到Azure Blob存储或者其他Azure数据存储服务中。
Azure Function再次收到结果,并把结果发送回用户界面。
4.具体代码实例和解释说明
创建一个新的Azure Function App
首先,我们需要创建一个新的Azure Function App。具体的操作步骤如下:
在Azure门户页面上的左侧菜单中,选择"Create a resource"按钮。
在搜索框中输入"Function App",并按Enter键。
选择"Function App"模板,然后单击"Create"按钮。
配置函数应用的名称、订阅、资源组、OS类型、位置、存储帐户、Application Insights等信息。
- 点击“创建”按钮,等待资源创建完成。完成后,即可看到刚才创建的资源。
将机器学习模型添加到Azure ML Studio
接下来,我们需要将我们的机器学习模型添加到Azure ML Studio中。具体的操作步骤如下:
登陆Azure ML Studio。
点击“新建”->“空白Experiment”。
输入一个名称,然后单击右上角的“运行”按钮。
从库中选择“模型”节点,然后单击“导入”。
上传你的机器学习模型文件。目前支持的文件格式包括ONNX、PMML、Scikit-learn、Torch等。
设置相关的参数,如定价计划、描述、使用的编程语言、依赖关系等。
点击右上角的“运行”按钮,完成模型导入。
配置Azure Function App中的连接字符串
接着,我们需要配置Azure Function App中与Azure ML Studio的连接字符串。具体的操作步骤如下:
在Azure门户页面上的左侧菜单中,找到刚才创建的函数应用,然后单击“设置”按钮。
单击“应用程序设置”选项卡,在“设置”中找到名为“ML_MODEL_URI”的值。
用之前下载的机器学习模型文件的URL值更新这个值。
在“设置”中找到名为“ML_MODEL_ACCESS_KEY”的值,然后单击“生成新密钥”按钮,生成一个新的密钥。
把这个密钥复制粘贴到Azure Function App的“设置”中。
点击“保存”按钮保存这些更改。
为Azure Function编写代码
最后,我们需要为Azure Function编写代码。具体的代码如下:
using System;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.ServiceBus.Messaging;
using Newtonsoft.Json;
using System.Net.Http;
using System.Net.Http.Headers;
namespace YourNamespaceHere
{
public static class MyFunctionName
{
[FunctionName("MyFunctionName")]
public static void Run([ServiceBusTrigger("YourEventHubName", Connection = "YourEventHubConnectionStringSetting")]string myEventHubMessage, TraceWriter log)
{
// Deserialize the message body from JSON to dynamic object
dynamic eventData = JsonConvert.DeserializeObject(myEventHubMessage);
// Retrieve data for prediction by selecting specified columns in the input data
var featuresArray = new double[eventData.Properties["numFeatures"]];
int i = 0;
foreach (var featureName in eventData.Properties["featureNames"].Split(','))
{
if (!double.TryParse((string)eventData[featureName], out featuresArray[i]))
{
throw new ArgumentException($"Invalid feature value '{eventData[featureName]}' for column '{featureName}'");
}
i++;
}
// Build HTTP request payload for sending to Azure ML Studio
string apiKey = GetApiKey();
var httpContent = new StringContent("{ \"Inputs\": {\"input1\": [{\"ColumnNames\": \"" + eventData.Properties["featureNames"] + "\", \"Values\": [" + string.Join(",", featuresArray) + "] }] }, \"GlobalParameters\": {} }");
httpContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
var uri = $"http://{Environment.GetEnvironmentVariable("ML_SERVICE_NAME")}.azureml.net/api/v1.0/subscriptions/{Environment.GetEnvironmentVariable("SUBSCRIPTION_ID")}/resourceGroups/{Environment.GetEnvironmentVariable("RESOURCE_GROUP")}/providers/Microsoft.MachineLearningServices/workspaces/{Environment.GetEnvironmentVariable("WORKSPACE_NAME")}/services/{Environment.GetEnvironmentVariable("SERVICE_NAME")}?api-version={Environment.GetEnvironmentVariable("API_VERSION")}&code={apiKey}";
// Send request to Azure ML Studio and get response
HttpClient httpClient = new HttpClient();
HttpResponseMessage httpResponse = await httpClient.PostAsync(uri, httpContent);
string result = await httpResponse.Content.ReadAsStringAsync();
// Process results here... e.g., save to storage or send to another service
}
private static string GetApiKey()
{
return Environment.GetEnvironmentVariable("ML_MODEL_ACCESS_KEY");
}
}
}
这里有一个重要的地方,就是如何从EventHubs获取实时事件数据。由于Azure Function只允许使用静态数据类型,所以无法直接从EventHubs获取数据。因此,我们需要在 Azure Function 中将EventData对象反序列化为动态对象。这样,我们就可以从动态对象中获取所需的字段了。
这里还有一些其他需要注意的问题,比如Azure Function应该部署到哪个区域,Azure ML Studio应该部署到哪个区域等。不过,以上这些只是为了你更容易理解Azure Function与Azure ML Studio结合的方式。在实际业务场景中,还需要根据自己的需求调整代码。