Application Development
இங்கு இரண்டு விதமான அப்ளிகேஷனை நாம் உருவாக்கப்போகிறோம் . முதலில் ஒரு எடுத்துக்காட்டுக்காக சிம்பிளான ஒரு அப்பிளிக்கேஷன்.. அடுத்து நிஜத்தில் ஒரு நோக்கத்துக்காக உருவாக்கப்படும் சற்று கடினமான அப்பிளிக்கேஷன்.
Sample Application
‘Hello World’ என்பதனை பிரிண்ட் செய்யும் ஒரு சாதாரண புரோகிராம் பின்வருமாறு..
sample.py
print (“Hello world”)
இவ்வார்த்தையை வெறும் திரையில் பிரிண்ட் செய்யாமல், ஏதாவதொரு port-ல் வெளியிடுமாறு செய்ய வேண்டும். அப்போதுதான் வேறு ஏதாவது அப்ளிகேஷன் நம்முடைய அப்ளிகேஷனுடன் தொடர்புகொண்டு வேண்டியதை பெற்றுக் கொள்ள முடியும்.. இதுவே API என்று அழைக்கப்படும்.. இதற்கு உதவுவதே Flask API ஆகும். நமது கணினியில் 5500 எனும் போர்ட்டில் இவ்வார்த்தையை வெளியிடுவதற்கான நிரல் பின்வருமாறு.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import os | |
from flask import Flask | |
app = Flask(__name__) | |
port = int(os.getenv('PORT', 5500)) | |
@app.route('/') | |
def home(): | |
return render_template('index.html') | |
@app.route('/api/sample', methods=['GET']) | |
def smp(): | |
return "Hello World" | |
if __name__ == '__main__': | |
app.run(host='0.0.0.0', port=port, debug=True) |
மேற்கண்ட நிரலை இயக்கினால் அது பின்வருமாறு தனது service-ஐ வழங்கத் தொடங்கும். அதாவது குறிப்பிட்ட போர்ட்டில் சென்று பார்த்தால் இவ்வார்த்தை வெளிப்பட்டுக் கொண்டிருப்பதைக் காணலாம்.
Postman எனும் கருவி மூலம் இதனை நாம் சரிபார்த்துக் கொள்ளலாம்.
Real Time Application
எளிய தமிழில் மெஷின் லேர்னிங் என்ற புத்தகத்தில் கொடுத்துள்ள அதே உதாரணத்தை இங்கும் நான் பயன்படுத்தியுள்ளேன்.. இது ஒரு வீட்டின் விற்பனை விலையை நிர்ணயிப்பதற்கான மாடலை உருவாக்குகின்ற ப்ரோக்ராம் ஆகும். இந்த மாடலை உருவாக்குவதற்குத் தேவையான பயிற்சிக்கு பல்வேறு வகையான வீட்டு விலைகளைக் கொண்ட data.csv எனும் கோப்பு உள்ளீடாக கொடுக்கப்பட்டுள்ளது. இதுவே training data ஆகும். இதை வைத்துத்தான் மாடலை உருவாக்கியுள்ளோம்.. அது model.pkl (pickle file) எனும் பெயரில் பைனரி வடிவில் சேமிக்கப்படுகிறது.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import pandas as pd | |
from sklearn.linear_model import LinearRegression | |
from sklearn.model_selection import train_test_split,cross_val_score | |
#from sklearn.externals import joblib | |
import joblib | |
from sklearn.metrics import mean_squared_error | |
import matplotlib.pyplot as plt | |
from math import sqrt | |
import os | |
df = pd.read_csv('./data.csv') | |
i = list(df.columns.values) | |
i.pop(i.index('SalePrice')) | |
df0 = df[i+['SalePrice']] | |
df = df0.select_dtypes(include=['integer','float']) | |
X = df[list(df.columns)[:-1]] | |
y = df['SalePrice'] | |
X_train, X_test, y_train, y_test = train_test_split(X, y) | |
regressor = LinearRegression() | |
regressor.fit(X_train, y_train) | |
joblib.dump(regressor, './model.pkl') |
இப்போது ஒரு சில parameters-ஐ இந்த மாடலுக்குக் கொடுத்தால், அது பெற்றுக்கொண்ட பயிற்சியின் அடிப்படையில் ஒரு விலையைக் கணிக்கும். அதற்கான புரோகிராம் பின்வருமாறு.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import os | |
import json | |
import pandas as pd | |
import numpy | |
#from sklearn.externals import joblib | |
import joblib | |
s = pd.read_json('./parameters.json') | |
p = joblib.load("./model.pkl") | |
r = p.predict(s) | |
print (str(r)) |
Json வடிவில் வரும் தரவுகளை எடுத்து, process செய்து, விடையை வெளிப்படுத்தும் நிகழ்வுக்கு serialization மற்றும் de-serialization என்று பெயர். இதற்கு உதவும் வகையில் மாடலை உருவாக்க joblib பயன்பட்டுள்ளது.
அடுத்ததாக மேற்கண்ட புரோகிராம் கணிக்கும் மதிப்பு பிரிண்ட் மூலம் திரையில் வெளிப்படுத்தப்படுகிறது. ஆனால் நிஜத்தில் இம்மதிப்பை வேறு எங்கோ செலுத்த வேண்டி வரும். அது ஒரு டேட்டாபேஸாக இருக்கலாம் அல்லது ஒரு அப்ளிகேஷனாக இருக்கலாம். இவையெல்லாம் வெவ்வேறு இடங்களில் இயங்கிக்கொண்டிருக்கலாம். ஆகவே வெவ்வேறு இடங்களில், பல்வேறு வடிவங்களில் இயங்குகின்ற டேட்டாபேஸ், பல்வேறு மொழிகளில் எழுதப்பட்ட அப்பிளிக்கேஷன் போன்ற எதிலிருந்து வேண்டுமானாலும் இம்மதிப்பை எடுத்துக் கொள்வதற்கு ஏற்ற வகையில் நம்முடைய நிரலை நாம் மாற்ற வேண்டும். அதாவது வேறு எந்த அப்ளிகேஷன் வேண்டுமானாலும் நாம் உருவாக்கிய இந்த அப்ளிகேஷனுடன் பேசி மதிப்பினைப் பெற்றுக்கொள்ளும் செயலுக்கு அப்ளிகேஷன் புரோகிராமிங் இன்டர்ஃபேஸ் (API) என்று பெயர். இதனை வழங்கும் வகையில் நம்முடைய நிரலை மாற்றுவதற்கு Flask API பயன்படுகிறது. இதைக்கொண்டு உருவாக்கப்பட்ட prediction ப்ரோக்ராம் பின்வருமாறு.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import os | |
import json | |
import pandas as pd | |
import numpy | |
from flask import Flask, render_template, request, jsonify | |
from pandas.io.json import json_normalize | |
#from sklearn.externals import joblib | |
import joblib | |
app = Flask(__name__) | |
port = int(os.getenv('PORT', 5600)) | |
@app.route('/') | |
def home(): | |
return render_template('index.html') | |
@app.route('/api/salepricemodel', methods=['POST']) | |
def salepricemodel(): | |
if request.method == 'POST': | |
try: | |
post_data = request.get_json() | |
json_data = json.dumps(post_data) | |
s = pd.read_json(json_data) | |
p = joblib.load("./model.pkl") | |
r = p.predict(s) | |
return str(r) | |
except Exception as e: | |
return (e) | |
if __name__ == '__main__': | |
app.run(host='0.0.0.0', port=port, debug=True) |
இந்தப் புரோகிராமை பின்வருமாறு ரன் செய்தால் அது நம்முடைய கணினியில் 5600 எனும் போர்ட் வழியே இதற்கான API-ஐ இயக்கிக் கொண்டிருக்கும். போஸ்ட்மேன் எனும் கருவி மூலம் இந்தப் போர்ட்டில் மாடலுக்கான input json-ஐ அளித்து விடை ஒழுங்காக வருகிறதா என சோதித்துக் கொள்ளலாம். இவை பின்வருமாறு.
இப்போது மாதிரிக்கு ஒன்று மற்றும் நிஜ அப்ளிகேஷனுக்காக ஒன்று என இரண்டு API நமது கணினியில் தயாராகிவிட்டது. அவை 5500, 5600 எனும் இரண்டு port-ல் மதிப்புகளை வெளிப்படுத்தும் வண்ணம் அமைக்கப்பட்டுள்ளன. அடுத்து இதனை எவ்வாறு GIT-ல் பதிவேற்றம் செய்வது என்று பார்க்கலாம்.