Implementasi Model Machine Learning di Level Production Menggunakan Flask

image description

A : "Wah akhirnya akurasi pada data uji udah tembus 99.99% nih. Terus ngapain ya? " 
B : "Kalo lo tanya gue, gue tanya siapa dong? ehehe"
A : "ehehe"

Buat kita yang tengah belajar di dunia pembelajaran mesin (atau yang lebih keren kalau kita pakai bahasa inggris, Machine Learning ) tentu pernah mengalami masalah di atas. Setelah mencoba berbagai metode, mulai dari Logistic Regression sampai Random Forest dan dengan tuning parameter yang tidak sedikit, akhirnya kita bisa menemukan model yang sesuai keinginan (biasanya ditandai dengan akurasi yang tinggi). Kemudian pertanyaan yang terlintas di benak kita selanjutnya adalah : "Gimana ya cara implementasinya di dunia nyata? Gimana ya caranya biar model Machine Learning yang udah gue latih bisa jalan di aplikasi gue?" . Maka dari itu, pada kesempatan kali ini, akan dibahas sedikit mengenai bagaimana mengimplementasikan model machine learning yang sudah dilatih bisa jalan di dunia nyata, atau kalau teman-teman developer biasa menyebutnya production level.

Salah satu metode untuk mengaplikasikan model Machine Learning di production level adalah model dibuat sebagai web service. Hal ini mempermudah apabila bahasa pemograman yang digunakan berbeda antara aplikasi dan model yang telah dibuat. Salah satu framework yang dapat digunakan adalah menggunakan Flask. Flask adalah web microframework yang ditulis dengan bahasa Python (http://flask.pocoo.org/).

Hal yang pertama dilakukan tentu adalah melatih model Machine Learning kita. Data yang digunakan adalah data Iris yang di download dari Kaggle (gugling aje nanti ketemu hehe). Langkah selanjutnya, buat kode python dan kita import terlebih dahulu library super ajaib kita yaitu pandas dan sklearn.

#import library yang dibutuhkan
import pandas as pd
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier
import pickle

Pada artikel ini, digunakan Random Forest sebagai model machine learning (feel free untuk menggunakan model yang lain). Lalu, nilai akurasi model akan dihitung berdasarkan rata-rata akurasi menggunakan cross validation. Sedangkan pickle adalah library yang digunakan untuk menyimpan model yang telah dilatih.

Seperi biasa, load data dari csv kemudian pisahkan antara predictor dan target

#load dataset dan hapus kolom Id
df = pd.read_csv('../data/iris.csv')
df.drop('Id',axis=1,inplace=True)
#pisahkan antara predictor dengan target
y_train = df['Species']
X_train = df.drop('Species',axis=1)

Kemudian, gunakan cross_val_score untuk mengukur seberapa baik model kita

#tentukan model yang digunakan
#pada artikel ini menggunakan Random Forest
#bisa juga menggunakan model yang lain
model = RandomForestClassifier(n_estimators=100, random_state=2017)
#lihat nilai akurasi model menggunakan cross validasi
score = cross_val_score(model,X_train,y_train,cv=10)
score.mean()

akurasi yang didapat sebesar sekitar 95%, not bad. Mungkin dengan model yang lain bisa lebih bagus. Selanjutnya latih model menggunakan keseluruhan data

model.fit(X_train,y_train)

Setelah model dilatih, simpan model tersebut sebagai file yang akan digunakan dalam pembuatan web service.

with open('../model.pkl','wb') as f:
    pickle.dump(model,f)

Akhirnya model telah berhasil dibuat.

Tahap selanjutnya adalah membuat web service menggunakan Flask. Jangan lupa install flask nya dulu ya

>> pip install flask

Kumudian, buat file baru dengan nama server.py (nama boleh terserah sih) lalu ketik kode seperti dibawah ini

import pickle
import pandas as pd
from flask import Flask, jsonify, request, abort

app = Flask(__name__)

classifier = pickle.load(open('model.pkl','rb'))

@app.route('/predict', methods=['POST'])
def ApiCall():
    if not request.json:
	abort(400)

    y_train_json = request.json
    y_train = pd.DataFrame(y_train_json,index=[0])

    y_pred = classifier.predict(y_train)    
    return jsonify({'Species':y_pred.item()})

if __name__ == '__main__':
    app.run(debug=True)

Dapat dilihat bahwa kode tersebut membuat web service dengan endpoint ~/predict dengan method post sesuai dengan format arsitektur RESTful API (apa itu? bisa dipelajari di sini: https://developers.kudo.co.id/2016/09/15/mengenal-restful-api/). Model yang telah kita simpan tadi di "load" kembali dan digunakan untuk memprediksi. Simpan kode diatas kemudian jalankan perintah di bawah ini di terminal.

>> python server.py

Selanjutnya akan kita coba apakah web service tersebut dapat berjalan dengan baik dan benar. Gunakan postman (https://www.getpostman.com/) untuk mencobanya



Masukkan alamat http://127.0.0.1:5000/predict kemudian pilih method post. Isikan body yang merupakan data ciri-ciri bunga iris kemudian tentukan paket yaitu sebagai JSON (application/json). Klik send dan apabila berhasil, maka respon yang didapat adalah sesuai gambar di atas, yaitu akan muncul prediksi termasuk bunga iris.

Sekian dari artikel ini, masih banyak tentunya permasalahan yang dihadapi di dalam mengaplikasikan model machine learning di production level (gimana preprocessingnya? kalau paket nya banyak nanti sanggup gk ya flask? dan lain-lain) dan bisa dicari sendiri (hehe). Semoga bermanfaat!.

Latest articles

OUR TOP 5 CONTRIBUTOR

image description

Fajar Muharandy

-

image description

Fajar Jaman

-

image description

Bernardus Ari Kuncoro

-

image description

Rasyid Ridha

image description

ilyas ahsan

Mobile apps developer and Data Science Researcher