ICS5110 / RandomForest_UI.py
mohli's picture
Upload RandomForest_UI.py
ed96a49 verified
from RandomForest.RandomForestClass import My_RandomForest
import gradio as gr
import pandas as pd
import matplotlib.pyplot as plt
class RandomForest_UI():
def __init__(self):
self.rf_model = My_RandomForest()
self.rf_model.train_model("Male")
self.rf_model.train_model("Female")
self.rf_model.train_model("Unspecified")
def get_interface(self) -> gr.Blocks:
with gr.Blocks(theme=gr.themes.Soft()) as interface:
gr.Markdown("## Experience Level Prediction through Random Forest Classifier" )
gr.Markdown("")
gr.Markdown(
"Welcome to the **Experience Level Prediction** section. Here, you can determine an individual's experience level based on a set of input parameters."
)
gr.Markdown(
"The prediction output will be categorized as follows:"
"\n\n- **1**: Low experience level"
"\n- **2**: Medium experience level"
"\n- **3**: High experience level"
)
gr.Markdown(
"Provide details such as workout frequency, session duration, and water intake to make a prediction. "
"You may also specify gender as an additional parameter. "
"Generally, higher values for these inputs indicate a higher experience level."
)
with gr.Row():
workout_frequency = gr.Number(label="Workout Frequency (days/week)")
session_duration = gr.Number(label="Session Duration (hours)")
water_intake = gr.Number(label="Water Intake (liters)")
gender = gr.Radio(["Male", "Female", "Unspecified"], label="Gender")
predict_btn = gr.Button("Predict")
gr.Markdown(
"### Prediction Output"
"\nAfter entering the required inputs, the predicted experience level will be displayed along with the model's accuracy. "
"The prediction categorizes the experience level into one of three categories (1: Low, 2: Medium, 3: High) and provides an accuracy percentage to indicate the confidence of the model's output."
)
output = gr.Textbox(
label="Prediction",
interactive=False,
lines=2
)
gr.Markdown(
"### Feature Importance Plot"
"\nThe **Feature Importance Plot** provides insights into which input parameters contribute the most to determining the experience level. "
"This visualization highlights the factors that play a significant role in increasing the predicted experience level, helping you better understand the model's decision-making process."
)
plot_output = gr.Plot()
predict_btn.click(
fn=self.make_prediction_and_plot,
inputs=[workout_frequency, session_duration, water_intake, gender],
outputs=[output, plot_output]
)
return interface
def make_prediction_and_plot(self, workout_frequency, session_duration, water_intake, gender):
# Generate prediction
input_data = pd.DataFrame({
"Workout_Frequency (days/week)": [workout_frequency],
"Session_Duration (hours)": [session_duration],
"Water_Intake (liters)": [water_intake]
})
prediction = self.rf_model.predict(input_data, gender=gender)
accuracy = self.rf_model.accuracies[gender]
prediction_text = f"Predicted Experience Level: {prediction[0]} with an accuracy of {accuracy*100:.4f}%"
# Generate plot
model = self.rf_model.models[gender]
features = self.rf_model.selected_features[gender]
feature_importances = pd.Series(model.feature_importances_, index=features)
feature_importances = feature_importances.sort_values(ascending=False)
plt.figure(figsize=(10, 6))
feature_importances.plot(kind='bar')
plt.title(f"Feature Importances plot for {gender} Model")
plt.xlabel("Features")
plt.ylabel("Importance")
plt.tight_layout()
return prediction_text, plt