我在scikit learn中创建了一个机器学习模型,我需要在生产中使用实时数据部署该模型。功能如下所示,例如:
date event_id user_id feature1 feature2 featureX...
2017-01-27 100 5555 1.23 2 2.99
2017-01-27 100 4444 2.55 5 3.16
2017-01-27 100 3333 0.45 3 1.69
2017-01-27 105 1212 3.96 4 0.0
2017-01-27 105 2424 1.55 2 5.56
2017-01-27 105 3636 0.87 4 10.28
所以,每天都有不同的活动。从数据库中提取一个SCID作为预测,然后从数据库中提取预测数据:
^{pr2}$然后我将预测与df相匹配,并根据需要将其作为输出发送到API或文件。在
当事件启动时,featureX
会不断更新,这是我从API获得的。为了进行更新,我使用遍历每个event_id
和user_id
的循环,并用新的featureX
值更新{
为此,我做了这样的事情:
# get list of unique event ids
events = set(df['event_id'].tolist())
try:
while True:
start = time.time()
for event in events:
featureX = request.get(API_URL + event)
featureX_json = featureX.json()
for user in featureX_json['users']:
df.loc[df.user_id == user['user_id'],
'featureX'] = user['featureX']
df_X = df.drop(['date', 'event_id', 'user_id'], axis=1)
df['prediction'] = loaded_model.predict_proba(df_X)
# send to API or write to file
end = time.time()
print('recalculation time {} secs'.format(end - start))
except KeyboardInterrupt:
print('exiting !')
这对我来说很好,但是整个预测更新在服务器上需要大约4秒,我需要它在1秒以下。我在想办法在while loop
中做些什么来获得我需要的加速?在
json示例已根据请求添加到event_id = 100
URLhttp://myapi/api/event_users/<event_id>
:
{
"count": 3,
"users": [
{
"user_id": 4444,
"featureY": 34,
"featureX": 4.49,
"created": "2017-01-17T13:00:09.065498Z"
},
{
"user_id": 3333,
"featureY": 22,
"featureX": 1.09,
"created": "2017-01-17T13:00:09.065498Z"
},
{
"user_id": 5555,
"featureY": 58,
"featureX": 9.54,
"created": "2017-01-17T13:00:09.065498Z"
}
]
}
最好订阅某种消息队列,比如Kafka。然后,您可以在每次更新
FeatureX
时使用它,而不是在循环中无休止地进行批处理API调用,然后遍历整个数据源,等等关于预测,利用一种更具伸缩性的方法可能是有意义的。您可以将数据帧分成块,并向可伸缩的、高吞吐量的预测API发出异步请求。使用这种方法,您只受网络延迟和可以同时发出的请求数的限制。如果predictionapi能够处理每秒数千/10k/100k的请求,那么您的预测时间可能会缩短到不到1秒(可能只有几百毫秒)。在
我的服务mlrequest是一个低延迟、高吞吐量、高可用性的机器学习API,非常适合此类问题。我们可以处理每秒成千上万的预测。Scikit学习模型和Pandas数据帧将在下一个版本(即将发布)中得到支持。下面是一个简单的训练和预测的例子。您可以得到一个free api key,它每月为您提供50000个模型事务。在
安装mlrequest Python客户端
培训一个模型并将其部署到世界各地的5个数据中心非常简单:
^{pr2}$预测
演示:用于
event_id == 100
首先,让我们从JSON对象创建一个DF:
^{pr2}$现在我们可以摆脱
for user in featureX_json['users']:
循环:相关问题 更多 >
编程相关推荐