我对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如下:
- /v1/data/(username)/testcollection/model.pkl
- data://(username)/testcollection/model.pkl
- (username)/testcollection/model.pkl
- https://algorithmia.com/v1/data/(username)/testcollection/model.pkl
如何使用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担任算法工程师。