用Sklearn实现Algorithmia模型持久化

3

我对Algorithmia还不太熟悉,但我使用过scikit-learn,并且知道如何在训练完机器学习模型后使用joblib进行持久化:

from sklearn.externals joblib

model = RandomForestRegressor()
# Train the model, etc
joblib.dump(model, "prediction/model/model.pkl")

现在我想使用Algorithmia托管我的ML模型并将其作为服务调用,但我无法弄清楚如何读取模型。我已经在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) # Or f.path, both don't work
    return "empty"

这是输出结果:
(username)/testcollection/model.pkl
/v1/data/(username)/testcollection/model.pkl
model.pkl

在 joblib.load 行出现错误,显示“无此文件或目录(无论我输入什么路径)”。以下是我尝试调用 joblib.load 时的所有路径/URL: 我该如何使用joblib从文件中加载模型?我这样做的方式是否正确?

2
我认为你只需要将 f.url 替换为 f.name。 路径和 URL 应该是 DataFile 对象内部的私有字段... 但这是 Python,所以没有什么是私有的。 - jamesatha
1个回答

5

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

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

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):

    # You don't need to write your API key if you're editing in the web editor
    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):

    # You don't need to write your API key if you're editing in the web editor
    client = Algorithmia.client()

    modelFile = client.file("data://(username)/testcollection/model.pkl").getFile()

    model = joblib.load(modelFile)

    return "empty"

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接