ক্লাসিফায়ারকে ডিস্কে স্কাইকিট-লার্নে সংরক্ষণ করুন


192

আমি কিভাবে সংরক্ষণ একজন প্রশিক্ষণপ্রাপ্ত না ক্লাসিফায়ার সাদাসিধা বায়েসের করার ডিস্ক এবং এটি ব্যবহার করার জন্য ভবিষ্যদ্বাণী করা ডেটা?

বিজ্ঞান-শিখার ওয়েবসাইট থেকে আমার নীচের নমুনা প্রোগ্রাম রয়েছে:

from sklearn import datasets
iris = datasets.load_iris()
from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB()
y_pred = gnb.fit(iris.data, iris.target).predict(iris.data)
print "Number of mislabeled points : %d" % (iris.target != y_pred).sum()

উত্তর:


201

ক্লাসিফায়ারগুলি হ'ল অবজেক্টস যা কোনও অন্যের মতোই পিক এবং ডাম্প করা যায়। আপনার উদাহরণ চালিয়ে যেতে:

import cPickle
# save the classifier
with open('my_dumped_classifier.pkl', 'wb') as fid:
    cPickle.dump(gnb, fid)    

# load it again
with open('my_dumped_classifier.pkl', 'rb') as fid:
    gnb_loaded = cPickle.load(fid)

1
একটি যাদুমন্ত্র মত কাজ করে! আমি এনপি.সেভেজ ব্যবহার করার চেষ্টা করছিলাম এবং এটিকে আবারও লোড করছিলাম এবং এটি কখনই সাহায্য করতে পারেনি। অনেক ধন্যবাদ.
কার্টোস

7
পাইথন 3-তে, আচার মডিউলটি ব্যবহার করুন, যা ঠিক এর মতো কাজ করে।
এমসিএসএইচ

212

আপনি জবলিব.ডাম্প এবং জবলিব.লোড ব্যবহার করতে পারেন যা ডিফল্ট পাইথন পিকারের তুলনায় সংখ্যাসূচক অ্যারে পরিচালনা করতে অনেক বেশি দক্ষ।

জবলিব বিজ্ঞান-শিখার অন্তর্ভুক্ত:

>>> import joblib
>>> from sklearn.datasets import load_digits
>>> from sklearn.linear_model import SGDClassifier

>>> digits = load_digits()
>>> clf = SGDClassifier().fit(digits.data, digits.target)
>>> clf.score(digits.data, digits.target)  # evaluate training error
0.9526989426822482

>>> filename = '/tmp/digits_classifier.joblib.pkl'
>>> _ = joblib.dump(clf, filename, compress=9)

>>> clf2 = joblib.load(filename)
>>> clf2
SGDClassifier(alpha=0.0001, class_weight=None, epsilon=0.1, eta0=0.0,
       fit_intercept=True, learning_rate='optimal', loss='hinge', n_iter=5,
       n_jobs=1, penalty='l2', power_t=0.5, rho=0.85, seed=0,
       shuffle=False, verbose=0, warm_start=False)
>>> clf2.score(digits.data, digits.target)
0.9526989426822482

সম্পাদনা করুন: পাইথন ৩.৮++ আপনি আচার প্রোটোকল ৫ (যা ডিফল্ট নয়) ব্যবহার করলে বড় অঙ্কের অ্যারে যুক্ত বৈশিষ্ট্যযুক্ত দক্ষ পিকিংয়ের জন্য আচার ব্যবহার করা সম্ভব।


1
তবে আমার বোঝাপড়া থেকে পাইপলাইনের কাজ যদি এর একক কাজের অংশ প্রবাহিত হয়। যদি আমি মডেলটি এটি ডিস্কে সঞ্চয় করতে এবং সেখানে কার্যকর করা বন্ধ করতে চাই। তারপরে আমি এক সপ্তাহ পরে ফিরে আসি এবং ডিস্কটি থেকে মডেলটি লোড করার চেষ্টা করি এটি আমার একটি ত্রুটি ছুড়ে দেয়:
ভেন্যুকটন

2
যদি আপনি এটির সন্ধান করেন fitতবে এই পদ্ধতিটি কার্যকর করা বন্ধ এবং পুনরায় চালু করার কোনও উপায় নেই । এটি বলা হচ্ছে, যদি আপনি সাইথ-লার্ন লাইব্রেরির একই সংস্করণ সহ পাইথন থেকে কল করেন তবে joblib.loadসফল হওয়ার পরে কোনও ব্যতিক্রম উত্থাপন করা উচিত নয় joblib.dump
ogrisel

10
আপনি যদি আইপিথন ব্যবহার করছেন তবে --pylabকমান্ড লাইন পতাকা বা যাদুটি ব্যবহার করবেন না %pylabকারণ পিক্লিংয়ের প্রক্রিয়াটি ভাঙ্গার জন্য অন্তর্ভুক্ত নেমস্পেস ওভারলোডিং পরিচিত। %matplotlib inlineপরিবর্তে সুস্পষ্ট আমদানি এবং যাদু ব্যবহার করুন।
ogrisel

2
রেফারেন্সের জন্য সাইকিট-শিখুন ডকুমেন্টেশন দেখুন: scikit-learn.org/stable/tutorial/basic/…
user1448319

1
পূর্বে সংরক্ষিত মডেলটিকে পুনরায় প্রশিক্ষণ দেওয়া কি সম্ভব? বিশেষত এসভিসি মডেল?
উদয় সাওয়ান্ত

108

আপনি যা সন্ধান করছেন তাকে স্কেলার্ন শব্দের মধ্যে মডেল অধ্যবসায় বলা হয় এবং এটি ভূমিকা এবং মডেল অধ্যবসায় বিভাগগুলিতে নথিবদ্ধ হয় ।

সুতরাং আপনি আপনার শ্রেণিবদ্ধের সূচনা করেছেন এবং এটির সাথে এটি দীর্ঘকাল প্রশিক্ষণ পেয়েছেন

clf = some.classifier()
clf.fit(X, y)

এর পরে আপনার কাছে দুটি বিকল্প রয়েছে:

1) আচার ব্যবহার

import pickle
# now you can save it to a file
with open('filename.pkl', 'wb') as f:
    pickle.dump(clf, f)

# and later you can load it
with open('filename.pkl', 'rb') as f:
    clf = pickle.load(f)

2) জোব্লিব ব্যবহার

from sklearn.externals import joblib
# now you can save it to a file
joblib.dump(clf, 'filename.pkl') 
# and later you can load it
clf = joblib.load('filename.pkl')

আরও একবার এটি উপরে বর্ণিত লিঙ্কগুলি পড়তে সহায়ক is


30

অনেক ক্ষেত্রে, বিশেষত পাঠ্য শ্রেণিবদ্ধার সাথে কেবল শ্রেণিবদ্ধের সঞ্চয় করা যথেষ্ট নয় তবে আপনাকে ভেক্টরাইজারও সংরক্ষণ করতে হবে যাতে আপনি ভবিষ্যতে নিজের ইনপুটটিকে ভেক্টরাইজ করতে পারেন।

import pickle
with open('model.pkl', 'wb') as fout:
  pickle.dump((vectorizer, clf), fout)

ভবিষ্যতে ব্যবহারের কেস:

with open('model.pkl', 'rb') as fin:
  vectorizer, clf = pickle.load(fin)

X_new = vectorizer.transform(new_samples)
X_new_preds = clf.predict(X_new)

ভেক্টরাইজারটি ডাম্প করার আগে, কেউ এই দ্বারা ভেক্টরাইজারের স্টপ_ওয়ার্ডস_ সম্পত্তি মুছতে পারেন:

vectorizer.stop_words_ = None

ডাম্পিং আরও দক্ষ করতে। এছাড়াও যদি আপনার শ্রেণিবদ্ধকারী প্যারামিটারগুলি বিচ্ছিন্ন হয় (বেশিরভাগ পাঠ্য শ্রেণীবদ্ধকরণের উদাহরণ হিসাবে) আপনি পরামিতিগুলিকে ঘন থেকে বিরল রূপান্তর করতে পারেন যা মেমরির ব্যবহার, লোডিং এবং ডাম্পিংয়ের ক্ষেত্রে একটি বিশাল পার্থক্য তৈরি করবে। মডেল দ্বারা স্পারসিফাই করুন:

clf.sparsify()

যা স্বয়ংক্রিয়ভাবে এসজিডিসি ক্লাসিফায়ারের জন্য কাজ করবে তবে আপনি যদি জানেন যে আপনার মডেলটি খুব কমই রয়েছে (clf.coef_ এ প্রচুর শূন্য) তবে আপনি নিজে সিএলফ.সিএফ_কে একটি সিএসআর স্কিপি স্পার্স ম্যাট্রিক্সে রূপান্তর করতে পারবেন :

clf.coef_ = scipy.sparse.csr_matrix(clf.coef_)

এবং তারপরে আপনি এটিকে আরও দক্ষতার সাথে সঞ্চয় করতে পারেন।


অন্তর্দৃষ্টিপূর্ণ উত্তর! এসভিসির ক্ষেত্রে কেবল যুক্ত করতে চেয়েছিলেন, এটি একটি বিচ্ছিন্ন মডেল প্যারামিটার দেয়।
শায়ান আমানী

4

sklearnঅনুমানকারীরা কোনও প্রাক্কলনকারীর প্রাসঙ্গিক প্রশিক্ষিত সম্পত্তি সংরক্ষণ করা আপনার পক্ষে সহজ করার জন্য পদ্ধতিগুলি প্রয়োগ করে। কিছু অনুমানকারী __getstate__পদ্ধতিগুলি নিজেরাই প্রয়োগ করে, তবে অন্যরা যেমন বেস প্রয়োগের মত GMMব্যবহার করে যা কেবলমাত্র বস্তুর অভ্যন্তরীণ অভিধান সংরক্ষণ করে:

def __getstate__(self):
    try:
        state = super(BaseEstimator, self).__getstate__()
    except AttributeError:
        state = self.__dict__.copy()

    if type(self).__module__.startswith('sklearn.'):
        return dict(state.items(), _sklearn_version=__version__)
    else:
        return state

আপনার মডেলটিকে ডিস্কে সংরক্ষণ করার প্রস্তাবিত পদ্ধতিটি হল pickleমডিউলটি ব্যবহার করা :

from sklearn import datasets
from sklearn.svm import SVC
iris = datasets.load_iris()
X = iris.data[:100, :2]
y = iris.target[:100]
model = SVC()
model.fit(X,y)
import pickle
with open('mymodel','wb') as f:
    pickle.dump(model,f)

তবে আপনার অতিরিক্ত ডেটা সংরক্ষণ করা উচিত যাতে ভবিষ্যতে আপনি আপনার মডেলটি পুনরায় প্রশিক্ষণ করতে পারেন বা মারাত্মক পরিণতি ভোগ করতে পারেন (যেমন স্কেলের্নের পুরানো সংস্করণে লক হওয়া)

ডকুমেন্টেশন থেকে :

ভবিষ্যতের সংস্করণ-বিজ্ঞানের সাথে একই ধরণের মডেলটি পুনঃনির্মাণ করতে, অতিরিক্ত মেটাডেটা বাছাই করা মডেলের পাশাপাশি সংরক্ষণ করা উচিত:

প্রশিক্ষণ ডেটা, যেমন একটি অপরিবর্তনীয় স্ন্যাপশটের একটি রেফারেন্স

অজগর উত্স কোডটি মডেল তৈরি করতে ব্যবহৃত হয়

সাইকিট-লার্নের সংস্করণ এবং এর নির্ভরতা

প্রশিক্ষণ ডেটাতে ক্রস বৈধকরণ স্কোর প্রাপ্ত

এটি এনসেম্বল অনুমানকারীদের ক্ষেত্রে বিশেষভাবে সত্য যা tree.pyxসাইথনে লিখিত মডিউলের উপর নির্ভর করে (যেমন IsolationForest), যেহেতু এটি বাস্তবায়নের সংযোগ তৈরি করে, যা স্কেলার্ন সংস্করণগুলির মধ্যে স্থিতিশীল হওয়ার গ্যারান্টিযুক্ত নয়। এটি অতীতে পিছনে পিছনে অসম্পূর্ণ পরিবর্তনগুলি দেখেছিল।

যদি আপনার মডেলগুলি খুব বড় হয়ে যায় এবং লোডিং উপদ্রব হয়ে যায়, আপনি আরও দক্ষতার সাথে ব্যবহার করতে পারেন joblib। ডকুমেন্টেশন থেকে:

সাইকিটের নির্দিষ্ট ক্ষেত্রে জবলিবকে pickle( joblib.dump& joblib.load) প্রতিস্থাপনের ব্যবহারটি আরও আকর্ষণীয় হতে পারে , যা অভ্যন্তরীণভাবে বড় আকারের ন্যাপী অ্যারে বহন করে এমন বস্তুগুলির উপর আরও দক্ষ, কারণ এটি প্রায়শই ফিট সাইকিট-শিখার অনুমানকারীদের ক্ষেত্রে হয় তবে কেবল আচার তৈরি করতে পারে ডিস্কে এবং স্ট্রিংয়ের কাছে নয়:


1
but can only pickle to the disk and not to a stringতবে আপনি এটি স্ট্রিংআইওতে জবলিব থেকে আচার করতে পারেন। আমি সব সময় এটিই করি।
ম্যাথু

1

sklearn.externals.joblibএর পরে অবহেলা করা হয়েছে 0.21এবং এতে সরানো হবে v0.23:

/usr/local/lib/python3.7/site-packages/sklearn/externals/joblib/ init .py: 15: ফিউচার ওয়ার্নিং: sklearn.externals.joblib 0.21 এ অবহিত এবং 0.23-এ সরানো হবে। দয়া করে এই কার্যকারিতাটি সরাসরি কাজেরলিব থেকে আমদানি করুন, যা ইনস্টল করা যেতে পারে: পাইপ ইনস্টল জবলিব। যদি এই সতর্কতাটি পিকেল মডেলগুলি লোড করার সময় উত্থাপিত হয় তবে আপনাকে সেই মডেলগুলি সাইকিট-শিখুন 0.21+ দিয়ে পুনরায় ক্রমিকায়িত করতে হবে।
সতর্কতা.ওয়ার্ন (চিত্র, বিভাগ = ফিউচার ওয়ারিং)


অতএব, আপনার ইনস্টল করা প্রয়োজন joblib:

pip install joblib

এবং অবশেষে ডিস্কে মডেলটি লিখুন:

import joblib
from sklearn.datasets import load_digits
from sklearn.linear_model import SGDClassifier


digits = load_digits()
clf = SGDClassifier().fit(digits.data, digits.target)

with open('myClassifier.joblib.pkl', 'wb') as f:
    joblib.dump(clf, f, compress=9)

এখন ডাম্পড ফাইলটি পড়তে আপনার চালানো দরকার তা হ'ল:

with open('myClassifier.joblib.pkl', 'rb') as f:
    my_clf = joblib.load(f)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.