sparsh007's picture
Update app.py
a6a03fe verified
import pandas as pd
import numpy as np
import gradio as gr
from interpret.glassbox import ExplainableBoostingRegressor
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
import io
from PIL import Image
# Load and prepare the dataset
data = pd.read_csv('concrete_data.csv')
data.columns = data.columns.str.strip() # Strip any leading/trailing whitespace
# Splitting the data into features and target
feature_names = ['cement', 'blast_furnace_slag', 'fly_ash', 'water',
'superplasticizer', 'coarse_aggregate', 'fine_aggregate', 'age']
X = data[feature_names]
y = data["concrete_compressive_strength"]
# Scaling the data
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
# Initialize and train the EBM model
ebm = ExplainableBoostingRegressor(feature_names=feature_names, interactions=0)
ebm.fit(X_train, y_train)
# Global variable to store the most recent input data for explanation
last_input_data_scaled = None
# Define prediction function
def predict_strength(cement, blast_furnace_slag, fly_ash, water, superplasticizer,
coarse_aggregate, fine_aggregate, age):
global last_input_data_scaled
input_data = pd.DataFrame({
'cement': [cement], 'blast_furnace_slag': [blast_furnace_slag],
'fly_ash': [fly_ash], 'water': [water],
'superplasticizer': [superplasticizer],
'coarse_aggregate': [coarse_aggregate],
'fine_aggregate': [fine_aggregate], 'age': [age]
})
last_input_data_scaled = scaler.transform(input_data)
prediction = ebm.predict(last_input_data_scaled)
return prediction[0]
# Explanation function for enhanced visual
def show_local_explanation():
if last_input_data_scaled is not None:
local_exp = ebm.explain_local(last_input_data_scaled)
contributions = local_exp.data(0)['scores']
names = local_exp.data(0)['names']
# Enhanced Plotting
fig, ax = plt.subplots(figsize=(10, 6))
colors = ['red' if x < 0 else 'green' for x in contributions]
ax.barh(names, contributions, color=colors)
ax.set_xlabel('Contribution to Prediction')
ax.set_title('Local Explanation for the Most Recent Prediction')
# Save plot to a buffer
buf = io.BytesIO()
plt.savefig(buf, format='png', bbox_inches='tight')
buf.seek(0)
plt.close()
# Load image for display
img = Image.open(buf)
img_array = np.array(img)
return img_array
else:
return "No prediction has been made yet."
# Gradio interface setup with introduction and instructions
with gr.Blocks() as app:
gr.Markdown("## Concrete Strength Prediction App")
gr.Markdown("""
This app predicts the compressive strength of concrete based on its composition using the Explainable Boosting Machine (EBM).
EBM is a transparent, interpretable machine learning model that combines the power of boosting techniques with interpretable models,
making it easier to explain prediction outcomes.
""")
gr.Markdown("### Instructions")
gr.Markdown("""
- Enter the composition of the concrete in the input fields.
- Click 'Predict Concrete Strength' to see the predicted strength.
- Click 'Show Local Explanation' to see the contribution of each feature to the prediction.
""")
with gr.Row():
cement = gr.Number(label="Cement")
slag = gr.Number(label="Blast Furnace Slag")
fly_ash = gr.Number(label="Fly Ash")
water = gr.Number(label="Water")
superplasticizer = gr.Number(label="Superplasticizer")
coarse_agg = gr.Number(label="Coarse Aggregate")
fine_agg = gr.Number(label="Fine Aggregate")
age = gr.Number(label="Age")
predict_btn = gr.Button("Predict Concrete Strength")
explanation_btn = gr.Button("Show Local Explanation")
result = gr.Textbox(label="Predicted Concrete Strength")
local_image = gr.Image(label="Local Explanation", type="numpy")
predict_btn.click(
fn=predict_strength,
inputs=[cement, slag, fly_ash, water, superplasticizer, coarse_agg, fine_agg, age],
outputs=result
)
explanation_btn.click(
fn=show_local_explanation,
inputs=[],
outputs=local_image
)
app.launch(debug=True)