web-dev-qa-db-ja.com

joblibを使用したsklearnダンプモデルは、複数のファイルをダンプします。どちらが正しいモデルですか?

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があるのですか?

12
kcc__

すべてを1つのファイルに保存するには、圧縮をTrueまたは任意の数値(たとえば1)に設定する必要があります。

しかし、np配列の分離された表現がjoblibダンプ/ロードの主な機能に必要であることを知っておく必要があります。joblibはこの分離された表現により、pickleよりも速くnp配列を持つオブジェクトをロードおよび保存できます。また、Pickle joblibは正しく保存およびロードできます。 memmap numpy配列を持つオブジェクト。オブジェクト全体の1つのファイルのシリアル化が必要な場合(および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
16
Ibraim Ganiev