Python:如何使机器学习预测在生产中运行得更快?

2024-10-02 12:23:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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_iduser_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 = 100URLhttp://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"
        }
    ]
}

Tags: 数据模型eventapiid数据库jsondf
2条回答

最好订阅某种消息队列,比如Kafka。然后,您可以在每次更新FeatureX时使用它,而不是在循环中无休止地进行批处理API调用,然后遍历整个数据源,等等

关于预测,利用一种更具伸缩性的方法可能是有意义的。您可以将数据帧分成块,并向可伸缩的、高吞吐量的预测API发出异步请求。使用这种方法,您只受网络延迟和可以同时发出的请求数的限制。如果predictionapi能够处理每秒数千/10k/100k的请求,那么您的预测时间可能会缩短到不到1秒(可能只有几百毫秒)。在

我的服务mlrequest是一个低延迟、高吞吐量、高可用性的机器学习API,非常适合此类问题。我们可以处理每秒成千上万的预测。Scikit学习模型和Pandas数据帧将在下一个版本(即将发布)中得到支持。下面是一个简单的训练和预测的例子。您可以得到一个free api key,它每月为您提供50000个模型事务。在

安装mlrequest Python客户端

$pip install mlrequest

培训一个模型并将其部署到世界各地的5个数据中心非常简单:

^{pr2}$

预测

features = [{'feature1': 'val1', 'feature2': 77}, ...]
r = classifier.predict(features=features, model_name='my-model', class_count=2)
r.predict_result
# get list of unique event ids
events = df['event_id'].unique().tolist()

try:
    while True:     # i don't understand why do you need this loop...
        start = time.time()
        for event in events:
            featureX = request.get(API_URL + event)
            tmp = pd.DataFrame(featureX.json()['users'])

            df.loc[(df.event_id == event), 'featureX'] = \
                df.loc[df.event_id == event, 'user_id'] \
                  .map(tmp.set_index('user_id').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 !')

演示:用于event_id == 100

首先,让我们从JSON对象创建一个DF:

^{pr2}$

现在我们可以摆脱for user in featureX_json['users']:循环:

In [29]: df.loc[df.event_id == 100, 'featureX'] = \
             df.loc[df.event_id == 100, 'user_id'].map(tmp.set_index('user_id').featureX)

In [30]: df
Out[30]:
         date  event_id  user_id  feature1  feature2  featureX
0  2017-01-27       100     5555      1.23         2      9.54   # 2.99 -> 9.54
1  2017-01-27       100     4444      2.55         5      4.49   # 3.16 -> 4.49
2  2017-01-27       100     3333      0.45         3      1.09   # 1.69 -> 1.09
3  2017-01-27       105     1212      3.96         4      0.00
4  2017-01-27       105     2424      1.55         2      5.56
5  2017-01-27       105     3636      0.87         4     10.28

相关问题 更多 >

    热门问题