sklearn 转储模型使用 joblib,转储多个文件。哪一个是正确的模型?

Posted

技术标签:

【中文标题】sklearn 转储模型使用 joblib,转储多个文件。哪一个是正确的模型?【英文标题】:sklearn dumping model using joblib, dumps multiple files. Which one is the correct model? 【发布时间】:2016-02-03 11:58:29 【问题描述】:

我做了一个示例程序来使用 sklearn 训练 SVM。这是代码

from sklearn import svm
from sklearn import datasets
from sklearn.externals import joblib

clf = svm.SVC()
iris = datasets.load_iris()
X, y = iris.data, iris.target
clf.fit(X, y)

print(clf.predict(X))
joblib.dump(clf, 'clf.pkl') 

当我转储模型文件时,我得到了这么多文件。 :

['clf.pkl'、'clf.pkl_01.npy'、'clf.pkl_02.npy'、'clf.pkl_03.npy'、'clf.pkl_04.npy'、'clf.pkl_05。 npy','clf.pkl_06.npy','clf.pkl_07.npy','clf.pkl_08.npy','clf.pkl_09.npy','clf.pkl_10.npy','clf.pkl_11.npy' ]

如果我做错了什么,我会感到困惑。或者这是正常的吗?什么是 *.npy 文件。为什么有 11 个?

【问题讨论】:

大概这些是numpy 数组用于您的数据,joblib 在加载回.pkl 时会查找那些np 数组并加载回模型数据 我刚刚意识到,如果我使用 joblib.dump(clf, 'clf.pkl', compress=9) 我只会得到 1 个 clf.pkl 文件。所以我假设正如你所说的那样,这些是 numpy 数组。在加载过程中,我是手动加载还是自动加载? 我希望它们会自动加载,试试吧 是的,这是真的。我不加载 *.npy 格式,只加载 .pkl。你知道如果我使用参数压缩,它会影响非常大的数据集的数组吗? 基本上它会以读取/写入为代价影响腌制数据的大小,因此这取决于您的优先级是什么 【参考方案1】:

要将所有内容保存到 1 个文件中,您应该将压缩设置为 True 或任何数字(例如 1)。

但是你应该知道,np 数组的分离表示对于 joblib 转储/加载的主要功能是必要的,由于这种分离表示,joblib 可以比 Pickle 更快地加载和保存带有 np 数组的对象,而与 Pickle 相比,joblib 可以正确使用 memmap numpy 数组保存和加载对象。如果您想对整个对象进行一个文件序列化(并且不想保存 memmap np 数组)-我认为使用 Pickle 会更好,在这种情况下,AFAIK 的 joblib 转储/加载功能将以与相同的速度工作泡菜。

import numpy as np
from scikit-learn.externals import joblib

vector = np.arange(0, 10**7)

%timeit joblib.dump(vector, 'vector.pkl')
# 1 loops, best of 3: 818 ms per loop
# file size ~ 80 MB
%timeit vector_load = joblib.load('vector.pkl')
# 10 loops, best of 3: 47.6 ms per loop

# Compressed
%timeit joblib.dump(vector, 'vector.pkl', compress=1)
# 1 loops, best of 3: 1.58 s per loop
# file size ~ 15.1 MB
%timeit vector_load = joblib.load('vector.pkl')
# 1 loops, best of 3: 442 ms per loop

# Pickle
%%timeit
with open('vector.pkl', 'wb') as f:
    pickle.dump(vector, f)
# 1 loops, best of 3: 927 ms per loop
%%timeit                                    
with open('vector.pkl', 'rb') as f:
    vector_load = pickle.load(f)
# 10 loops, best of 3: 94.1 ms per loop

【讨论】:

是的,这行得通。我设置了 compress=1 并将其保存到一个文件中。

以上是关于sklearn 转储模型使用 joblib,转储多个文件。哪一个是正确的模型?的主要内容,如果未能解决你的问题,请参考以下文章

来自 AWS S3 的 Sklearn joblib 加载函数 IO 错误

将前 k 个结果添加到 sklearn 管道?

无法从 GridFS 加载 joblib 序列化模型

Sklearn gridsearchCV 对象在 pickle 转储/加载后更改

sklearn.svm在建立好模型后怎么使用

使用joblib在sklearn中重用由cross_val_score拟合的模型