Menyimpan Model Scikit-Learn dengan cPickle

Muhammad Arslan 2 Januari 2017

Menyimpan Model Scikit-Learn dengan cPickle

Terkadang akan menjadi sangat merepotkan bila model pengklasifikasi yang telah kita latih harus dibuat dari awal ketika aplikasi di-restart. Selain tidak praktis, tentu saja akan memakan waktu proses booting yang lama untuk aplikasi yang menggunakan model tersebut. Di Python ada sebuah modul yang sangat berguna sehingga dapat menyimpan model yang telah disimpan di dalam memori diserialisasi ke dalam file berupa pickle. Pickle ini dibuat dengan menggunakan modul cPickle yang dimiliki Python, sehingga bila kita ingin menggunakan model yang telah dilatih dengan data latih yang sama dengan sebelumnya. Kita tinggal memuat pickle tersebut.

Mari kita coba lakukan trik ini :D

Persiapan

Kamu harus sudah memasang beberapa perangkat lunak seperti berikut:
  • Python 2.7.x
  • Scikit-Learn
  • Scipy
  • Numpy
Sedangkan apabila sudah memasang kesemua persyaratan diatas, kamu harus melakukan pengambilan dataset 20newsgroups yang disediakan oleh Scikit-Learn.

Menggunakan cPickle untuk menyimpan model Scikit-Learn

Kali ini kita akan mencoba menyimpan model pengklasifikasi teks yang menggunakan dataset 20newsgroup. Kita akan menggunakan SGDClassifier dengan ekstraktor fitur CountVectorizer dan TfidfTransformer. Kemudian akan kita kemas dengan pipeline lalu kita latih pengklasifikasi tersebut dengan dataset yang tersedia.

Dan terakhir akan kita simpan model hasil latih kedalam pickle. Silahkan buat sebuah file dengan nama save-model-demo.py kemudian buat kode berikut:

from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.linear_model import SGDClassifier
from sklearn.pipeline import Pipeline

import json
import datetime
import os
import cPickle

file_name = 'models/my_model.pkl'

exists = os.path.isfile(file_name)
if exists:
    print "model sudah ada..."

    clf = cPickle.load(open(file_name))
    print clf
    print type(clf)
else:
    print "model belum ada. dibuat dulu yah :D"

    dataset_train = fetch_20newsgroups(subset='train', shuffle=True, random_state=42)

    clf = Pipeline([
                ('vect', CountVectorizer(ngram_range=(1, 2), max_df=0.75, max_features=None, )),
                ('tfidf', TfidfTransformer(use_idf=False, norm='l2', )),
                ('clf', SGDClassifier(n_iter=10, penalty='l2', alpha=1e-05, ))
            ])

    clf = clf.fit(dataset_train.data, dataset_train.target)

    # menyimpan model kedalam pickle
    with open(file_name, 'wb') as fout:
        cPickle.dump(clf, fout)

    print 'model disimpan di: ' + file_name

Jangan lupa, buat juga sebuah folder bernama models yang disimpan bersama dengan file save-model-demo.py. Bila kita jalankan, maka akan muncul output seperti berikut:

$ python save-model-demo.py 
model belum ada. dibuat dulu yah :D
model disimpan di: models/my_model.pkl
$ file models/my_model.pkl
models/my_model.pkl: ASCII text

Dan file my_models.pkl pun tersimpan di folder models. Sekarang mari kita jalankan ulang file save-model-demo.py:

$ python save-model-demo.py 
model sudah ada...
Pipeline(steps=[('vect', CountVectorizer(analyzer=u'word', binary=False, decode_error=u'strict',
        dtype=<type 'numpy.int64'>, encoding=u'utf-8', input=u'content',
        lowercase=True, max_df=0.75, max_features=None, min_df=1,
        ngram_range=(1, 2), preprocessor=None, stop_words=None,
        s...   penalty='l2', power_t=0.5, random_state=None, shuffle=True,
       verbose=0, warm_start=False))])
<class 'sklearn.pipeline.Pipeline'>

Terlihat dari output di konsol bahwa kita telah berhasil memuat model yang disimpan di pickle.

Penutup

Dengan menggunakan pickle, kamu dapat menyimpan banyak model yang telah dilatih tanpa harus melatih ulang. Kamu dapat saja mengindeksnya ke dalam database sehingga model yang telah dilatih dapat dipakai ulang dan mempercepat jalannya aplikasi utama yang menggunakan model tersebut.

Referensi

  • Scikit-Learn official documentation
  • Python official documentation
(arslan/scikit-learn/python)