Membangun Model Machine Learning Menggunakan Algoritma Gradient Boosting dengan Flask

Al-Fazrin Banapon
5 min readJul 5, 2019

--

Asslamu’alaikum Mate….

What’s Up Data Enthusiast !!

Welcome back to tulisan ana lagi nih, nah kali ini kita bakalan main main sama yang namanya machine learning dan salah satu tool yang lagi hype digunakan oleh para data science yaitu python.

Mungkin teman-teman sudah amat sering bermain dengan yang namanya machine learning ini, sudah banyak melakukan prediksi dan klasifikasi dengan berbagai algoritma machine learning. Nah kali ini kita bakalan bahas hal tersebut namun prediksi ataupun klasifikasi yang dilakukan nanti langsung pada suatu website bukan diinput di python lagi mate, keren kan ? hehe

Singkatnya tu, kita build suatu mesin menggunakan machine learning dan kita koneksikan dengan website. sehingga prediksi yang dilakukan nanti directly on webiste. Nah di tulisan ini, asumsi saya teman-teman udah pada familiar dengan source codenya python, serta sudah memahami dasar-dasar HTML. Kayaknya uda pada gak sabar kan ya nunggu tutorialnya

Let’s check this out

First step yang harus mate lakukan adalah membuat folder di C: dengan nama diabetes (penamaan bersifat bebas ya :d). Selanjtunya melakukan instalasi modul flask, dengan cara mate bisa buka command prompt (cmd) dan gunakan peritah berikut.

pip install flask
#atau bisa juga
conda install flask

setelah penginstalan selesai, mate bisa masuk didalam folder diabetes yang telah dibuat sebelumnya menngunakan cmd.

pada gambar diatas, cmd ana masih berada pada folder user only, karena folder diabetes di C: sehingga perlu keluar dulu dari folder user only dengan cara

cd ..

nah lakukan perintah tersebut hingga cmd teman teman seperti gambar diatas, artinya cmd sudah berada pada C:, gunakan perintah

cd diabetes

untuk masuk kedalam folder diabetes.

Untuk dataset yang digunakan menggunakan dataset pima indians diabetes yang dapat di unduh disini. kemudian dibangun model machine learningnya menggunakan algoritma gradient boosting.

## Importing Libraries
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
from IPython.display import display
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split, GridSearchCV, StratifiedKFold
from sklearn.pipeline import Pipeline
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import confusion_matrix, classification_report, roc_auc_score, roc_curve, recall_score
from sklearn.ensemble import RandomForestClassifier, VotingClassifier, GradientBoostingClassifier
import warnings
import pickle
warnings.filterwarnings('ignore')data = pd.read_csv('C:/Diabetes/diabetes.csv')#Feature Preprocessing
for col in ['BloodPressure', 'Glucose','SkinThickness','Insulin','BMI','Age']:
for target in data.Outcome.unique():
mask = (data[col] != 0) & (data['Outcome'] == target)
data[col][(data[col] == 0) & (data['Outcome'] == target)] = data[col][(data[col] == 0) & (data['Outcome'] == target)].replace(0,data[mask][col].mean())

#Extract data
X = data.iloc[:,0:8]
y = data.iloc[:,-1]
#X2 = X.copy()
#X2['Glucose<125'] = X2['Glucose']<125
#X2['Glucose<125'] = X2['Glucose<125'].astype(int)
#X_train,X_test,y_train,y_test = train_test_split(X2, y, random_state=0,stratify=y)X_train,X_test,y_train,y_test = train_test_split(X, y, random_state=0,stratify=y)scaler = StandardScaler()
scaler.fit(X_train,y_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)
kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=0)
param_grid = {'n_estimators': [100,200,300,400,500], 'max_depth': [2,3,4,5]}
gbrt = GradientBoostingClassifier(random_state=0)
grid_gbrt = GridSearchCV(gbrt, param_grid=param_grid, cv=kfold, scoring='accuracy', n_jobs=-1)
grid_gbrt.fit(X_train_scaled, y_train)
gbrt = GradientBoostingClassifier(random_state=0, max_depth=grid_gbrt.best_params_['max_depth'],
n_estimators=grid_gbrt.best_params_['n_estimators'])
gbrt.fit(X_train_scaled,y_train)
# Saving model to disk
pickle.dump(gbrt, open('model.pkl','wb'))
# Loading model to compare the results
model = pickle.load(open('model.pkl','rb'))
print(model.predict([[2, 9, 6, 4, 5, 7, 8, 9]]))

simpanlah source code ini dengan nama model.py, saran ana mate menggunakan notepad++ untuk melakukan editing serta penyimpanan source codenya, simpan dalam ekstensi python didalam folder diabates. Model machine learningnya tersimpan dengan nama model.pkl, selanjutnya model tersebut diload dengan fungsi pickle.

C:\diabetes\python model.py

untuk mencoba apakah source code sudah benar dan dapat digunakan, mate dapat menggunakan perintah diatas pada cmd.

import numpy as np
from flask import Flask, request, jsonify, render_template
import pickle
app = Flask(__name__)
model = pickle.load(open('model.pkl', 'rb'))
@app.route('/')
def home():
return render_template('index.html')
@app.route('/predict',methods=['POST'])
def predict():
'''
For rendering results on HTML GUI
'''
int_features = [float(x) for x in request.form.values()]
final_features = [np.array(int_features)]
prediction = model.predict(final_features)
output = prediction[0]return render_template('index.html', prediction_text='Pasien Terklasifikasi Sebagai {}'.format(output))@app.route('/predict_api',methods=['POST'])
def predict_api():
'''
For direct API calls trought request
'''
data = request.get_json(force=True)
prediction = model.predict([np.array(list(data.values()))])
output = prediction[0]
return jsonify(output)
if __name__ == "__main__":
app.run(debug=True)

simpan source code diatas dengan nama app.py berada dalam satu folder yang sama dengan model.py. Pada source code diatas merupakan bagian dari menghubungkan antara model machine learning dan website menggunakan flask. Dan selanjutnya dapat membuat tampilan halamn website dengan HTML sebagai berikut

<!DOCTYPE html>
<html >
<!--From https://codepen.io/frytyler/pen/EGdtg-->
<head>
<meta charset="UTF-8">
<title>ML API</title>
<link href='https://fonts.googleapis.com/css?family=Pacifico' rel='stylesheet' type='text/css'>
<link href='https://fonts.googleapis.com/css?family=Arimo' rel='stylesheet' type='text/css'>
<link href='https://fonts.googleapis.com/css?family=Hind:300' rel='stylesheet' type='text/css'>
<link href='https://fonts.googleapis.com/css?family=Open+Sans+Condensed:300' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">

</head>
<body>
<div class="login">
<h1>Diabetes Analysis using Gradient Boosting Classifier with 94% Accuracy</h1>
<!-- Main Input For Receiving Query to our ML -->
<form action="{{ url_for('predict')}}"method="post">
<input type="text" name="Pregnancies" placeholder="Experience" required="required" />
<input type="text" name="Glucose" placeholder="Test Score" required="required" />
<input type="text" name="BloodPressure" placeholder="Interview Score" required="required" />
<input type="text" name="SkinThickness" placeholder="Experience" required="required" />
<input type="text" name="Insulin" placeholder="Test Score" required="required" />
<input type="text" name="BMI" placeholder="Interview Score" required="required" />
<input type="text" name="DiabetesPedigreeFunction" placeholder="Experience" required="required" />
<input type="text" name="Age" placeholder="Test Score" required="required" />
<button type="submit" class="btn btn-primary btn-block btn-large">Predict</button>
</form>
<br>
<br>
{{ prediction_text }}
</div></body>
</html>

simpan source code HTML ini dengan nama index dengan ekstensi HTML, letakkan didalam folder templates (buat folder baru) didalam folder diabetes. Susunan file dan folder harus sebagai berikut.

c:/ajarflask
|
|-- templates
| |--index.html
|-- diabetes.csv
|-- model.py
|-- app.py

dan pada cmd mate gunakan perintah berikut

C:\diabetes\python app.py

maka akan tampil sebagai berikut

yang artinya program berhasil dijalankan, selanjutnya dapat membuka http://localhost:5000/ untuk masuk ke dalam websitnya.

nah ini adalah tampilan websitenya mate …. pada webiste inilah akan dilakukan penginputan data setiap paramter yang tersedia dan akan menampilkan hasil prediksi sebagai berikut

yeeyyyyy…. Alhamdulillah, finally we can deploy our model :)

nah untuk full source codenya, teman teman bisa akses di github ana, selamat mencoba dan semoga berhasil. Apabila para mate mengalami kendala saat mencooba jangan sungkan untuk bertanya. Untuk bertanya atau diskusi dapat langsung komen di kolom komentar medium ini atau bisa by email atau linkedin saya :) (mari berkawan)

email : 16611081@students.uii.ac.id
linkedIn : https://www.linkedin.com/in/alfazrin-banapon-657428171/

sekiaannnn …

Wassalamualaikum

--

--