第3篇 Building Realtime Predictions using Stream Analyti

发布于:2023-09-27 ⋅ 阅读:(133) ⋅ 点赞:(0)

作者:禅与计算机程序设计艺术

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结合的方式如下图所示:

  1. Event Hubs接收来自Stream Analytics的实时事件。

  2. 当事件到达之后,Event Hubs会将事件发送给Azure Function。

  3. Azure Function会启动,并调用Stream Analytics查询。

  4. Stream Analytics会从EventHubs读取数据,然后根据指定的条件将数据传递给Azure ML Studio。

  5. Stream Analytics会等待模型的响应。

  6. 如果模型生成了一个预测结果,它就会返回给Stream Analytics。

  7. Stream Analytics会将结果保存到Azure Blob存储或者其他Azure数据存储服务中。

  8. Azure Function再次收到结果,并把结果发送回用户界面。

4.具体代码实例和解释说明

创建一个新的Azure Function App

首先,我们需要创建一个新的Azure Function App。具体的操作步骤如下:

  1. 在Azure门户页面上的左侧菜单中,选择"Create a resource"按钮。

  2. 在搜索框中输入"Function App",并按Enter键。

  3. 选择"Function App"模板,然后单击"Create"按钮。

  4. 配置函数应用的名称、订阅、资源组、OS类型、位置、存储帐户、Application Insights等信息。

  1. 点击“创建”按钮,等待资源创建完成。完成后,即可看到刚才创建的资源。

将机器学习模型添加到Azure ML Studio

接下来,我们需要将我们的机器学习模型添加到Azure ML Studio中。具体的操作步骤如下:

  1. 登陆Azure ML Studio。

  2. 点击“新建”->“空白Experiment”。

  3. 输入一个名称,然后单击右上角的“运行”按钮。

  4. 从库中选择“模型”节点,然后单击“导入”。

  5. 上传你的机器学习模型文件。目前支持的文件格式包括ONNX、PMML、Scikit-learn、Torch等。

  6. 设置相关的参数,如定价计划、描述、使用的编程语言、依赖关系等。

  7. 点击右上角的“运行”按钮,完成模型导入。

配置Azure Function App中的连接字符串

接着,我们需要配置Azure Function App中与Azure ML Studio的连接字符串。具体的操作步骤如下:

  1. 在Azure门户页面上的左侧菜单中,找到刚才创建的函数应用,然后单击“设置”按钮。

  2. 单击“应用程序设置”选项卡,在“设置”中找到名为“ML_MODEL_URI”的值。

  3. 用之前下载的机器学习模型文件的URL值更新这个值。

  4. 在“设置”中找到名为“ML_MODEL_ACCESS_KEY”的值,然后单击“生成新密钥”按钮,生成一个新的密钥。

  5. 把这个密钥复制粘贴到Azure Function App的“设置”中。

  6. 点击“保存”按钮保存这些更改。

为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结合的方式。在实际业务场景中,还需要根据自己的需求调整代码。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到