我已经在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
因此,每天都有不同的事件。在事件开始之前,我基本上通过从数据库中提取它们并使用存储的scikit模型计算预测结果来将它们存储在数据框中:
df_X = df.drop(['date', 'event_id', 'user_id'], axis=1)
loaded_model = joblib.load("model.joblib.dat")
prediction = loaded_model.predict_proba(df_X)
然后我将预测结果与df匹配,并根据需要将其作为输出发送到API或文件中。
当事件开始时,我从API获取不断更新的featureX。为了进行更新,我使用循环遍历每个event_id和user_id,并使用新的featureX值更新df,重新计算并再次发送到输出。
为此,我做了类似于以下的操作:
# 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循环
中更改以获得所需加速的内容。
在event_id = 100
的请求下,已添加了json样例,URL为http://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"
}
]
}
featureX_json
的样本数据集吗? - MaxU - stand with Ukraine