使用Sklearn在Algorithmia中持久化模型

我对Algorithmia还比较陌生,但我之前用过scikit-learn,并且知道如何在训练模型后使用joblib来持久化我的机器学习模型:

from sklearn.externals import joblib
model = RandomForestRegressor()
# 训练模型等
joblib.dump(model, "prediction/model/model.pkl")

现在我想在Algorithmia上托管我的机器学习模型,并将其作为服务调用,但我不知道如何读取回模型。我在Algorithmia上创建了一个名为“testcollection”的集合,并在其中放置了一个名为“model.pkl”的文件,这是joblib.dump调用的结果。根据文档,这意味着我的文件应该位于

data://(username)/testcollection/model.pkl

我想使用joblib.load从文件中读取该模型。这是我在Algorithmia上的当前算法:

import Algorithmia
def apply(input):
    client = Algorithmia.client()
    f = client.file("data://(username)/testcollection/model.pkl")
    print(f.path)
    print(f.url)
    print(f.getName())
    model = joblib.load(f.url) # 或者f.path,两者都不工作
    return "empty"

这是输出结果:

(username)/testcollection/model.pkl
/v1/data/(username)/testcollection/model.pkl
model.pkl

在joblib.load行处报错,显示“没有这样的文件或目录(无论我输入什么路径)”

我尝试过的所有路径/URL如下:

如何使用joblib从文件中加载模型?我这样做对吗?


回答:

访问DataAPI上的数据有几种方法。

以下是通过Python客户端访问文件的四种不同方法:

import Algorithmia
client = Algorithmia.client("<YOUR_API_KEY>")
dataFile = client.file("data://<USER_NAME>/<COLLECTION_NAME>/<FILE_NAME>").getFile()
dataText = client.file("data://<USER_NAME>/<COLLECTION_NAME>/<FILE_NAME>").getString()
dataJSON = client.file("data://<USER_NAME>/<COLLECTION_NAME>/<FILE_NAME>").getJson()
dataBytes = client.file("data://<USER_NAME>/<COLLECTION_NAME>/<FILE_NAME>").getBytes()

由于Sklearn需要模型文件的路径,最简单的获取方式是通过文件对象(即dataFile)。

根据官方Python2.7文档,如果文件对象不是通过open()函数创建的,那么对象属性name通常对应于文件的路径。

在这种情况下,你需要编写类似这样的代码:

import Algorithmia
def apply(input):
    # 如果你在网页编辑器中编辑,不需要写入你的API密钥
    client = Algorithmia.client()
    modelFile = client.file("data://(username)/testcollection/model.pkl").getFile()
    modelFilePath = modelFile.name
    model = joblib.load(modelFilePath)
    return "empty"

但是,根据官方Sklearn模型持久化文档,你还可以直接传递文件对象而不是文件名。

因此,我们可以跳过尝试获取文件名的部分,直接传递modelFile对象:

import Algorithmia
def apply(input):
    # 如果你在网页编辑器中编辑,不需要写入你的API密钥
    client = Algorithmia.client()
    modelFile = client.file("data://(username)/testcollection/model.pkl").getFile()
    model = joblib.load(modelFile)
    return "empty"

编辑:这里还有一篇官方Algorithmia开发者中心的文章,讨论了在Scikit-Learn中的模型持久化

完全披露:我在Algorithmia担任算法工程师。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注