Stellar-Classification / mlpipeline.py
mohd-saifuddin's picture
App files
a6e2ac3
import random
import plotly.express as px
import pickle
import pandas as pd
import os
import numpy as np
import cv2 as cv
import warnings
warnings.filterwarnings('ignore')
class Pipeline(object):
"""
This class is a pipeline mechanism to feed the
query datapoint into the model for prediction.
"""
def __init__(self, data) -> None:
self.data = data
self.features = ['alpha', 'delta', 'u', 'g', 'r', 'i', 'z', 'redshift']
self.target = 'class'
self.df = None
def fetch(self) -> None:
"""
This method fetches the data.
"""
self.df = pd.DataFrame(data=self.data, columns=self.features)
def preprocess(self) -> None:
"""
This method preprocesses the data.
"""
with open(file='scaling.pkl', mode='rb') as s_pkl:
scaling = pickle.load(file=s_pkl)
self.df = scaling.transform(X=self.df)
self.df = pd.DataFrame(data=self.df, columns=self.features)
def featurize(self) -> None:
"""
This method performs feature engineering on the data.
"""
fi_cols = ['redshift', 'g-r', 'i-z', 'u-r', 'i-r', 'z-r', 'g']
self.df['g-r'] = self.df['g'] - self.df['r']
self.df['i-z'] = self.df['i'] - self.df['z']
self.df['u-r'] = self.df['u'] - self.df['r']
self.df['i-r'] = self.df['i'] - self.df['r']
self.df['z-r'] = self.df['z'] - self.df['r']
self.df = self.df[fi_cols]
def predict(self) -> tuple:
"""
This method predicts the query datapoint.
"""
with open(file='stacking_classifier.pkl', mode='rb') as m_pkl:
clf = pickle.load(file=m_pkl)
pred_proba = clf.predict_proba(X=self.df)
confidence = np.round(a=np.max(a=pred_proba)*100, decimals=2)
pred_class = clf.predict(X=self.df)[0]
fig = self.get_encoded_image(pred_class=pred_class)
if pred_class == 'QSO':
pred_class = 'Quasi-Stellar Object'
elif pred_class == 'GALAXY':
pred_class = 'Galaxy'
else:
pred_class = 'Star'
c = "The class is '{}' with a confidence of {}%.".format(
pred_class, confidence)
return c, fig, pred_class
def get_encoded_image(self, pred_class):
"""
This method selects an image and encodes it.
"""
image_root = os.path.join(os.getcwd(), './images')
if pred_class == 'QSO':
image_class_path = os.path.join(image_root, 'qsos')
elif pred_class == 'GALAXY':
image_class_path = os.path.join(image_root, 'galaxies')
else:
image_class_path = os.path.join(image_root, 'stars')
image_picked = random.choice(seq=os.listdir(path=image_class_path))
image_picked_path = os.path.join(image_class_path, image_picked)
image = cv.imread(filename=image_picked_path)
image = cv.cvtColor(src=image, code=cv.COLOR_BGR2RGB)
image_fig = px.imshow(img=image)
image_fig.update_layout(
coloraxis_showscale=False,
autosize=True, height=500,
margin=dict(l=0, r=0, b=0, t=0)
)
image_fig.update_xaxes(showticklabels=False)
image_fig.update_yaxes(showticklabels=False)
return image_fig
def pipeline(self) -> str:
"""
This method is a pipeline.
"""
self.fetch()
self.preprocess()
self.featurize()
return self.predict()