我正在进行一个PHP项目,同时使用Python和Flask作为API,该项目根据用户对其他帖子的之前互动来预测用户对帖子的喜好,这完全是基于用户的。
我的需求是,假设我们的系统中有数千名用户,他们之前已经对旧帖子进行了点赞。当有新帖子到来时,我需要某种方式来识别用户是否喜欢它,这通过定时任务来完成。
方法1
我使用逻辑回归作为模型,因此可能需要为每个用户创建动态的pkl文件。因为不同用户对同一帖子的互动不同,所以我需要保存类似于model_{user_id}.pkl的文件,其中user_id是用户的ID。
方法2
使用基于内容的推荐系统。但据我所知,它在生产环境中无法像pkl文件那样存储。因此,对于数千名用户中的每一个,我都需要运行推荐函数。
方法1的缺点
为每个用户创建动态的pkl文件意味着会有更多的文件。我从未在网上见过这种方法。
方法2的缺点
我认为为每个用户调用推荐函数可能不是一个好主意。这可能会严重影响CPU使用率等。
请问有人能帮我正确解决这个问题吗?我在机器学习方面是新手。请考虑我的问题。提前感谢。
回答:
我建议这样做:
- 将用户模型创建为模型的数组(或数据框架)
- 将这个数组保存为pkl文件
- 在加载应用程序时(而不是每次API调用时),将模型数组加载到内存中
- 当调用API时,模型已经在内存中 – 使用它来预测结果
类似这样(未经测试 – 只是一个想法):
#for saving the modelmodel_data = pd.DataFrame(columns=['user','model'])temp_model = RandomForestClassifier().fit(X,y)new = pd.DataFrame({'user':[user_id],'model':[temp_model]})model_data = model_data.append(new)packed_model = jsonpickle.pickler.Pickler.flatten(model_data)#for loading the modelunpacked_model = jsonpickle.unpickler.Unpickler.restore(packed_model) #this should be in the begining of your flask file - loaded into the memoryuser_model=unpacked_model.at(user_id,'model') #this should be inside every api call