我是机器学习算法的新手。我学习基本算法,如回归,分类,聚类,序列建模,在线算法。互联网上提供的所有文章都展示了如何将这些算法与特定数据一起使用。没有关于在生产环境中部署这些算法的文章。所以我的问题是
1)如何在生产环境中部署机器学习算法?
2)机器学习教程中的典型方法是使用一些训练数据构建模型,用它来测试数据。但是在生产环境中使用这种模型是否明智?传入的数据可能会不断变化,因此模型将无效。 模型刷新周期应该是什么持续时间以适应此类更改?
答案 0 :(得分:7)
我不确定这是否是一个好问题(因为它太笼统而且没有表现好),但我建议你阅读偏差 - 差异权衡。简而言之,您可以使用低偏差\高差异机器学习模型,并在测试数据(您用于实现模型的数据)上获得100%准确的结果,但是您可能会使您的模型过度拟合训练数据。因此,当您尝试将其用于您在培训期间未使用过的数据时,会导致性能下降。另一方面,您可能具有高偏差\低方差模型,这将很难适应您的训练数据,并且对新的生产数据也会表现差。记住一般准则将是:
1)获取一些可用于构建机器学习系统原型的大量数据
2)将您的数据拆分为火车集,交叉验证集和测试集
3)创建一个模型,该模型在测试数据上具有相对较低的偏差(良好的准确性,实际上是良好的F1分数)。然后在交叉验证集上尝试此模型以查看结果。如果结果不好 - 你有很高的方差问题,你使用了一个过度拟合数据的模型,并且不能很好地推广。重写模型,使用模型参数或使用不同的算法。重复,直到你在CV集上得到一个好的结果
4)由于我们使用模型以便在CV集上获得良好的结果,因此您希望在测试集上测试最终模型。如果它是好的 - 那就是它,你有一个模型的最终版本,可以在prod环境中使用它。
第二个问题没有答案,它基于您的数据和您的应用程序。但可能会使用两种通用方法:
1)做我之前提到的所有内容来构建一个在测试集上具有良好性能的模型。在一段时间内重新训练您的模型一次新的数据(尝试不同的时期,但是一旦您看到模型的性能下降,您可以尝试重新训练您的模型。)
2)使用在线学习方法。这不适用于许多算法,但在某些情况下可以使用它。通常,如果您发现可以使用随机梯度下降学习方法 - 您可以使用在线学习,只需使用最新的生产数据使您的模型保持最新。
请记住,即使您使用#2(在线学习方法),也无法确保您的模型永远是好的。您获得的数据迟早可能会发生显着变化,您可能希望使用完全不同的模型(例如,切换到ANN而不是SWM或逻辑回归)。
答案 1 :(得分:4)
免责声明:我为这家公司工作,Datmo为ML建立了更好的工作流程。我们一直在寻求帮助开发ML的开发人员,如果您有任何问题,请随时通过anand@datmo.com与我联系。
1)为了部署,您应该首先将代码拆分为预处理,培训和测试。这样,您可以轻松地封装所需的组件以进行部署。通常,您将需要进行预处理,测试以及权重文件(培训过程的输出)并将它们放在一个文件夹中。接下来,您将希望在服务器上托管它并围绕此服务器包装API服务器。我建议使用Flask Restful API,以便您可以使用查询参数作为输入,并在标准JSON blob中输出响应。
要在服务器上托管它,您可以使用this article来讨论如何在EC2上部署Flask API。
您可以加载和建模并将其作为API提供,如code中所述。
2)我很难回答没有更多细节。它高度依赖于数据类型和模型类型。例如,对于深度学习,没有在线学习这样的东西。
答案 2 :(得分:3)
很抱歉,我的评论没有包含太多细节*,因为我也是 ML 的“部署”新手。但由于作者也是 ML 新手,我希望这些基本指南也能有所帮助。 对于“部署”,您应该
然后,您可以在生产环境中部署这些保存的模型。在生产环境中,您应该拥有自己开发的应用程序来运行保存的模型(例如:您使用 Python 开发的应用程序,该应用程序以经过训练和保存的 .pickle 文件和 TestData 作为输入;并且简单地给出“预测用于测试数据”作为输出)或者您应该有一个环境/框架来运行保存的模型(在云上搜索 ML 环境/框架)。首先,你应该明确你的需求:你是否需要一个独立的生产程序,或者你会提供内部网络服务,还是通过云等。
对于第二个问题;如上答案表明问题是模型的“在线培训能力”。另外请注意;对于“在线学习”,您的生产环境还必须为您的生产工具/系统提供真实正确的测试数据标签。你有那个能力吗?
注意:以上所有只是小的“评论”而不是明确的答案,但从技术上讲,我还不能写评论。感谢您不投票:)
答案 3 :(得分:1)
关于第一个问题,我的服务mlrequest使将模型部署到生产变得简单。您可以开始使用free API key,该月每月提供5万笔模型交易。
此代码将在5个全球数据中心内训练和部署或更新您的模型。
from mlrequest import Classifier
classifier = Classifier('my-api-key')
features = {'feature1': 'val1', 'feature2': 45}
training_data = {'features': features, 'label': 2}
r = classifier.learn(training_data=training_data, model_name='my-model', class_count=2)
这是您进行预测的方法,将其延迟路由到最近的数据中心以获得最快的响应。
features = {'feature1': 'val1', 'feature2': 77}
r = classifier.predict(features=features, model_name='my-model', class_count=2)
r.predict_result
关于第二个问题,这完全取决于您要解决的问题。有些模型需要经常更新,而其他模型则几乎不需要更新。