使用 Sklearn 的算法模型持久性

Posted

技术标签:

【中文标题】使用 Sklearn 的算法模型持久性【英文标题】:Algorithmia Model Persistence with Sklearn 【发布时间】:2017-05-01 15:22:24 【问题描述】:

我对@9​​87654321@ 还很陌生,但我使用了一些 scikit-learn,并且我知道在使用 joblib 训练后如何保持我的机器学习模型:

from sklearn.externals joblib

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

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

data://(用户名)/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:

/v1/data/(用户名)/testcollection/model.pkl data://(用户名)/testcollection/model.pkl (用户名)/testcollection/model.pkl https://algorithmia.com/v1/data/(username)/testcollection/model.pkl

如何使用 joblib 从文件中加载模型?我是不是走错了路?

【问题讨论】:

我认为你只需要将 f.url 替换为 f.name 路径和 url 应该是 DataFile 对象内的私有字段......但它是 python 所以没有什么是私有的 【参考方案1】:

有几种方法可以访问 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)。

According to the Official Python2.7 Documentation,如果创建文件对象不是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"

但是according to the Official Sklearn Model Persistence Documentation,您也应该能够只传递类似文件的对象而不是文件名。

因此,我们可以跳过尝试获取文件名的部分,只传递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"

编辑:Here's also an article in the Offical Algorithmia Developer Center talking about Model Persistence in Scikit-Learn。

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

【讨论】:

以上是关于使用 Sklearn 的算法模型持久性的主要内容,如果未能解决你的问题,请参考以下文章

在 sklearn 中持久化数据

使用sklearn优雅地进行数据挖掘

使用sklearn优雅地进行数据挖掘

sklearn 中模型保存的两种方法

(sklearn)机器学习模型的保存与加载

sklearn