KwameOO's picture
Upload core files
2c4e6e2
raw
history blame
3.63 kB
# ----- Load base libraries and packages
import gradio as gr
import numpy as np
import pandas as pd
import os
import pickle
import xgboost as xgb
from xgboost import XGBClassifier
# ----- Useful lists
expected_inputs = ["sepal_length", "sepal_width", "petal_length", "petal_width"]
# ----- Helper Functions
# Function to load ML toolkit
def load_ml_toolkit(file_path= r"src\Iris_App_toolkit"):
"""
This function loads the ML items into this file. It takes the path to the ML items to load it.
Args:
file_path (regexp, optional): It receives the file path to the ML items, but defaults to the "src" folder in the repository. The full default relative path is r"src\Iris_App_toolkit".
Returns:
file: It returns the pickle file (which in this case contains the Machine Learning items.)
"""
with open(file_path, "rb") as file:
loaded_toolkit = pickle.load(file)
return loaded_toolkit
# Importing the toolkit
loaded_toolkit = load_ml_toolkit()
scaler = loaded_toolkit["scaler"]
# Import the model
model = XGBClassifier()
model.load_model(r"src\xgb_model.json")
# Function to process inputs and return prediction
def process_and_predict(*args, scaler=scaler, model=model):
"""
This function processes the inputs and returns the predicted specie of the flower
It receives the user inputs, scaler and model. The inputs are then put through the same process as was done during modelling
Args:
scaler (MinMaxScaler, optional): It is the scaler (MinMaxScaler) used to scale the numeric features before training the model, and should be loaded either as part of the ML Items or as a standalone item. Defaults to scaler, which comes with the ML Items dictionary.
model (XGBoost, optional): This is the model that was trained and is to be used for the prediction. Since XGBoost seems to have issues with Pickle, import as a standalone. It defaults to "model", as loaded.
Returns:
Prediction (label): Returns the label of the predicted class, i.e. the specie of the flower
"""
# Convert inputs into a DataFrame
input_data = pd.DataFrame([args], columns=expected_inputs)
# Scale the numeric columns
input_data[expected_inputs] = scaler.transform(input_data[expected_inputs])
# Make the prediction
model_output = model.predict_proba(input_data)
setosa_prob = float(model_output[0][0])
versicolor_prob = float(model_output[0][1])
virginica_prob = 1 - (setosa_prob + versicolor_prob)
return {"Prediction: Iris-setosa": setosa_prob, "Prediction: Iris-versicolor": versicolor_prob, "Prediction: Iris-virginica": virginica_prob}
# ----- App Interface
# Inputs
sepal_length = gr.Slider(label="Sepal length (cm)", minimum=4.3, step=0.1, maximum= 7.9, interactive=True, value=5.8)
sepal_width = gr.Slider(label="Sepal width (cm)", minimum=2, step=0.1, maximum= 4.4, interactive=True, value=3)
petal_length = gr.Slider(label="Petal length (cm)", minimum=1, step=0.05, maximum= 4.9, interactive=True, value=4.35)
petal_width = gr.Slider(label="Petal width (cm)", minimum=0.1, step=0.05, maximum= 2.5, interactive=True, value=1.3)
# Output
gr.Interface(inputs=[sepal_length, sepal_width, petal_length, petal_width], outputs=gr.Label("Awaiting Submission..."), fn=process_and_predict, title="Iris Flower Specie Prediction App",
description="""This app uses a machine learning model to predict the specie of an Iris flower based on inputs made by you, the user. The (XGBoost) model was trained and built based on the Iris flower Dataset""").launch(inbrowser=True, show_error=True)