Python机器用烧瓶休息API学习预测

Guillaume是一家专门从事ML和AI的摇臂专家。他在解决大型项目方面经验丰富,探索缩放的新解决方案。

本文是关于使用Python在机器学习或人工智能(AI)系统的上下文中进行实时预测,用烧瓶休息API。这里暴露的架构可以被视为从概念证明(PoC)到最小可行的产品(MVP)的方法,用于机器学习应用。

Python 不是第一个选择在设计实时解决方案时可以想到的首选。但是 纹orflow.克里克特 - 学习 是Python支持的最常用机器学习库的一些,它是方便的许多人使用 jupyter笔记本pocs..

是什么让这个解决方案可行的事实是,与预测相比,培训需要花费大量时间。如果您认为培训作为观看电影的过程并预测关于它的问题的答案,那么它似乎在每个新问题之后不必重新观看电影。

培训是一种“电影”的一种压缩视图,并预测正在从压缩视图中检索信息。它应该真的很快,电影是否复杂或长。

让我们在Python中用一个快速的[烧瓶]示例来实现!

通用机器学习架构

让我们首先概述通用培训和预测架构流程:

图像alt text.

首先,创建训练管线以根据目标函数来了解过去的数据。

这应该输出两个关键元素:

  1. 功能工程功能:应在预测时间重复使用训练时间的变换。
  2. 模型参数:应保存算法和最终选择的HyperParameters,因此它们可以在预测时间重复使用

请注意,应仔细保存在培训时间期间完成的功能工程,以便适用于预测。许多人之间的一个常见问题可以沿途出现 特征缩放 这对于许多算法是必要的。

If feature X1 is scaled from value 1 to 1000 and is rescaled to the [0,1] range with a function f(x) = x/max(X1), what would happen if the prediction set has a value of 2000?

应提前考虑一些仔细的调整,以便映射函数返回将在预测时间正确计算的一致输出。

机器学习培训与预测

这里有一个主要的问题。为什么我们将培训和预测分开开始?

在机器学习示例和课程的背景下,所有数据都是预先已知的(包括要预测的数据)的内容是完全正确的,建立预测器的非常简单的方法是 堆栈训练和预测数据 (通常称为测试集)。

然后,有必要在“训练集”上培训并预测“测试集”以获得结果,同时在培训和测试数据上进行特征工程,培训和预测相同和独特的管道。

但是,在现实生活中,您通常具有培训数据,并且要预测的数据就在被处理时进入。换句话说,你一次看电影,你稍后会有一些问题,这意味着答案应该很容易和快速。

此外,通常没有必要每次培训需要时间(可能是某些图像集)的新数据进来重新训练整个模型,并且应该稳定。随着时间的推移应该足够稳定。

这就是为什么培训和预测可以是甚至应该在许多系统上清楚地分开的原因,这也是更好地反映了智能系统(人为或不)学习的学习方式。

与过度装备的连接

培训和预测的分离也是解决过度问题的好方法。

在统计数据中,过度装备是“分析的产生,该分析太密切或完全对应于特定数据集,因此可能无法适应其他数据或可靠地预测未来的观察”。

图像alt text.

绿线代表过度装备的模型,黑线代表正则化模型。虽然绿线最佳遵循培训数据,但它太依赖于该数据,而且与黑线相比,新的未经证实数据可能会有更高的错误率._

在具有许多功能的数据集或具有有限培训数据的数据集中尤其看到过度装备。在这两种情况下,与预测器可以验证的内容相比,数据具有太多信息,并且其中一些可能甚至不能与预测的变量链接。在这种情况下,噪声本身可以被解释为信号。

控制过度装备的好方法是在部分数据上培训并预测我们有实地真理的另一部分。因此,新数据上的预期误差大致是该数据集上的测量错误,只要我们训练的数据代表了系统的现实及其未来状态。

因此,如果我们将适当的培训和预测管道与正确的数据分裂一起设计,不仅我们解决了过度装备问题,而且我们也可以重用该架构以预测新数据。

最后一步将控制新数据上的错误与预期相同。总是班次(实际错误总是低于预期的错误),一个人应该确定什么是可接受的转移 - 但这不是本文的主题。

用于预测的REST API

这是清楚地分离训练和预测的地方派上用量。如果我们保存了我们的功能工程方法和模型参数,那么我们可以使用这些元素构建一个简单的REST API。

图像alt text.

此处的关键是在API启动时加载模型和参数。一旦启动并存储在内存中,每个API呼叫触发了ML算法的特征工程计算和“预测”方法。两者都足够快,以确保实时响应。

API可以被设计为接受要预测的独特示例,或几种不同的示例(批量预测)。

以下是实现这一原则的最小Python /烧瓶代码,JSON IN和JSON OUT(问题,回答):


app = Flask(__name__)

@app.route('/api/makecalc/', methods=['POST'])

def makecalc():

	"""

	Function run at each API call

        No need to re-load the model 

    

	"""

        # reads the received json 

	jsonfile = request.get_json()

	res = dict()

	for key in jsonfile.keys():

            # calculates and predicts 

    	    res[key] = model.predict(doTheCalculation(key))

   	

	# returns a json file 

	return jsonify(res)

if __name__ == '__main__':

        # Model is loaded when the API is launched

	model = pickle.load(open('modelfile', 'rb'))

	app.run(debug=True)

请注意,API可用于预测新数据,但我不建议使用它来培训模型。它可以使用,但这是复杂的模型训练代码,并且在内存资源方面可能更苛刻。

实施例 - 自行车共享

让我们作为一个例子,拍一个动摇的数据集,自行车分享。假设我们是一家自行车分享公司,希望每天预测自行车租赁数量,以便更好地管理自行车的维护,物流等方面。

图像alt text.

租金主要取决于天气状况,所以随着天气预报,该公司在租赁将获得更好的想法,并尽量避免这些天。

首先,我们训练模型并将其保存为泡菜对象,可以在此处看到 jupyter笔记本.

模型培训和性能未在此处处理,这只是理解完整过程的一个例子。

然后我们编写将在每个API调用中完成的数据转换:


import numpy as np

import pandas as pd

from datetime import date

def doTheCalculation(data):

	data['dayofyear']=(data['dteday']-

    	data['dteday'].apply(lambda x: date(x.year,1,1))

    	.astype('datetime64[ns]')).apply(lambda x: x.days)

	X = np.array(data[['instant','season','yr','holiday','weekday','workingday',

                  	'weathersit','temp','atemp','hum','windspeed','dayofyear']])

	return X

这只是一个计算变量(一年的一天),包括月份和确切的日期。还有一系列列及其各自的顺序。

然后,我们需要用烧瓶编写REST API:


from flask import Flask, request, redirect, url_for, flash, jsonify

from features_calculation import doTheCalculation

import json, pickle

import pandas as pd

import numpy as np

app = Flask(__name__)

@app.route('/api/makecalc/', methods=['POST'])

def makecalc():

	"""

	Function run at each API call

	"""

	jsonfile = request.get_json()

	data = pd.read_json(json.dumps(jsonfile),orient='index',convert_dates=['dteday'])

	print(data)

	res = dict()

	ypred = model.predict(doTheCalculation(data))

	for i in range(len(ypred)):

    	    res[i] = ypred[i]

    

	return jsonify(res) 

if __name__ == '__main__':

	modelfile = 'modelfile.pickle'    

	model = pickle.load(open(modelfile, 'rb'))

	print("loaded OK")

	app.run(debug=True)

运行此程序,默认情况下它将在端口5000上为API提供服务。

如果我们在本地测试请求,仍然使用python:


import requests, json

url = '[http://127.0.0.1:5000/api/makecalc/](http://127.0.0.1:5000/api/makecalc/)'

text = json.dumps({"0":{"instant":1,"dteday":"2011-01-01T00:00:00.000Z","season":1,"yr":0,"mnth":1,"holiday":0,"weekday":6,"workingday":0,"weathersit":2,"temp":0.344167,"atemp":0.363625,"hum":0.805833,"windspeed":0.160446},

               	"1":{"instant":2,"dteday":"2011-01-02T00:00:00.000Z","season":1,"yr":0,"mnth":1,"holiday":0,"weekday":3,"workingday":0,"weathersit":2,"temp":0.363478,"atemp":0.353739,"hum":0.696087,"windspeed":0.248539},

               	"2":{"instant":3,"dteday":"2011-01-03T00:00:00.000Z","season":1,"yr":0,"mnth":1,"holiday":0,"weekday":1,"workingday":1,"weathersit":1,"temp":0.196364,"atemp":0.189405,"hum":0.437273,"windspeed":0.248309}})

该请求包含输入到模型的所有信息。因此,我们的模型将在指定日期(这里有三个)对自行车租赁的预测回复。


headers = {'content-type': 'application/json', 'Accept-Charset': 'UTF-8'}
r = requests.post(url, data=text, headers=headers)
print(r,r.text)

<Response [200]> {
  "0": 1063, 
  "1": 1028, 
  "2": 1399
}

就是这样!此服务可轻松用于任何公司的应用程序,用于维护计划或用户了解自行车交通,需求和租赁自行车的可用性。

把它整合在一起

许多机器学习系统,尤其是POC的主要缺陷是混合培训和预测。

如果他们经过仔细分离,可以很容易地对MVP进行实时预测,并且使用Python /烧瓶的开发成本和努力,特别是对于许多Poc,它最初用Scikit-Learn开发, 纹orflow.或者任何其他Python机器学习库。

但是,这可能对所有应用程序不可行,尤其是特征工程沉重的应用程序,或者检索需要在每个呼叫中​​提供最新数据的最近匹配的应用程序。

无论如何,您需要一遍又一遍地观看电影以回答有关它们的问题吗?相同的规则适用于机器学习!

理解基础知识

什么是休息API?

在Web服务的上下文中,RESTful API已定义为以下方面:URL,媒体类型和HTTP方法(GET,POST等)。它们可以用作在应用程序之间交换信息的统一方式。

什么是机器学习?

机器学习是计算机科学领域的人工智能子集经常使用统计技术,使计算机能够“学习”(即,在特定任务上逐步提高性能),而不明确地编程。

什么是tensorflow?

纹orflow.是一系列任务的DataFlow编程的开源软件库。它是一个符号数学库,也用于机器学习应用,例如神经网络。

什么是scikit - 学习?

Scikit-Searn,也是Sklearn,是一个免费的软件机器学习库,用于Python编程语言。

什么是特色工程?

特征工程是使用数据的域知识来创建使机器学习算法工作的功能的过程。它增强了可用数据,其中包含与预测目标相关的附加信息。

什么是jupyter?

Jupyter Notebook(以前iPython笔记本电脑)是一个支持Python编程语言的基于Web的交互式计算环境。

什么是poc?

PoC或概念证明,是一系列程序,展示了项目的可行性。