すべての依存関係 (コード + データ) がアーティファクトにパッケージ化され、このアーティファクトを使用してモデルを初期化し、予測できるように、scikit-learn/statsmodels モデルをシリアル化する必要があります。pickle の使用はmodule
オプションではありません。これは、データの依存関係のみを処理するためです (コードはパッケージ化されません)。ということで、ディルで実験をしてきました。私の質問をより正確にするために、モデルを構築して永続化する例を次に示します。
from sklearn import datasets
from sklearn import svm
from sklearn.preprocessing import Normalizer
import dill
digits = datasets.load_digits()
training_data_X = digits.data[:-5]
training_data_Y = digits.target[:-5]
test_data_X = digits.data[-5:]
test_data_Y = digits.target[-5:]
class Model:
def __init__(self):
self.normalizer = Normalizer()
self.clf = svm.SVC(gamma=0.001, C=100.)
def train(self, training_data_X, training_data_Y):
normalised_training_data_X = normalizer.fit_transform(training_data_X)
self.clf.fit(normalised_training_data_X, training_data_Y)
def predict(self, test_data_X):
return self.clf.predict(self.normalizer.fit_transform(test_data_X))
model = Model()
model.train(training_data_X, training_data_Y)
print model.predict(test_data_X)
dill.dump(model, open("my_model.dill", 'w'))
これに対応して、永続化されたモデルを (新しいセッションで) 初期化し、予測を行う方法を次に示します。このコードは明示的に初期化したり、class Model
.
import dill
from sklearn import datasets
digits = datasets.load_digits()
training_data_X = digits.data[:-5]
training_data_Y = digits.target[:-5]
test_data_X = digits.data[-5:]
test_data_Y = digits.target[-5:]
with open("my_model.dill") as model_file:
model = dill.load(model_file)
print model.predict(test_data_X)
このようにディルを使った人はいますか?データ サイエンティストがModelWrapper class
実装する各モデルを拡張し、モデルを永続化するインフラストラクチャを構築し、モデルをサービスとして展開し、モデルのライフサイクル全体を管理するという考え方です。
class ModelWrapper(object):
__metaclass__ = abc.ABCMeta
def __init__(self, model):
self.model = model
@abc.abstractmethod
def predict(self, input):
return
def dumps(self):
return dill.dumps(self)
def loads(self, model_string):
self.model = dill.loads(model_string)
セキュリティへの影響 (任意のコードの実行) とscikit-learn
、モデルを提供するマシンにモジュールをインストールする必要があるという要件以外に、このアプローチには落とし穴がありますか? コメントやアドバイスの言葉は最も役に立ちます。