saja003's picture
Update app.py
3595a4e verified
Raw
History Blame Contribute Delete
7.25 kB
import gradio as gr
import pandas as pd
from sklearn.datasets import (
load_iris,
load_breast_cancer,
fetch_california_housing,
load_diabetes,
)
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# Classification Models
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.neighbors import KNeighborsClassifier
# Regression Models
from sklearn.linear_model import LinearRegression
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor
from sklearn.svm import SVR
from sklearn.svm import SVC
# Metrics
from sklearn.metrics import (
accuracy_score,
f1_score,
mean_squared_error,
r2_score,
)
# =====================================================
# TITANIC DATASET
# =====================================================
def load_titanic():
url = "https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv"
df = pd.read_csv(url)
df = df[["Pclass", "Sex", "Age", "Fare", "Survived"]]
df["Age"] = df["Age"].fillna(df["Age"].mean())
df["Sex"] = df["Sex"].map({"male": 0, "female": 1})
X = df.drop("Survived", axis=1)
y = df["Survived"]
return X, y
# =====================================================
# BOSTON DATASET
# =====================================================
def load_boston():
url = "https://raw.githubusercontent.com/selva86/datasets/master/BostonHousing.csv"
df = pd.read_csv(url)
X = df.drop("medv", axis=1)
y = df["medv"]
return X, y
# =====================================================
# MAIN FUNCTION
# =====================================================
def save_report(results_df, best_model, task_type, dataset_name):
file_path = "model_report.txt"
with open(file_path, "w", encoding="utf-8") as f:
f.write("AI Model Comparison Report\n")
f.write("=" * 40 + "\n\n")
f.write(f"Task Type: {task_type}\n")
f.write(f"Dataset: {dataset_name}\n\n")
f.write("Results:\n")
f.write(results_df.to_string(index=False))
f.write("\n\n")
f.write(f"Best Model: {best_model}\n")
return file_path
def run_models(task_type, dataset_name):
# =========================
# CLASSIFICATION DATASETS
# =========================
if task_type == "Classification":
if dataset_name == "Iris":
data = load_iris()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = data.target
elif dataset_name == "Breast Cancer":
data = load_breast_cancer()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = data.target
elif dataset_name == "Titanic":
X, y = load_titanic()
models = {
"Logistic Regression": LogisticRegression(max_iter=1000),
"SVM": SVC(),
"Decision Tree": DecisionTreeClassifier(),
"Random Forest": RandomForestClassifier(),
}
# =========================
# REGRESSION DATASETS
# =========================
else:
if dataset_name == "California Housing":
data = fetch_california_housing()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = data.target
elif dataset_name == "Diabetes":
data = load_diabetes()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = data.target
elif dataset_name == "Boston Housing":
X, y = load_boston()
models = {
"Linear Regression": LinearRegression(),
"SVR": SVR(),
"Decision Tree": DecisionTreeRegressor(),
"Random Forest": RandomForestRegressor(),
}
# =========================
# SPLIT + SCALE
# =========================
X_train, X_test, y_train, y_test = train_test_split(
X,
y,
test_size=0.2,
random_state=42,
)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# =========================
# TRAIN MODELS
# =========================
results = []
for name, model in models.items():
model.fit(X_train, y_train)
predictions = model.predict(X_test)
# Classification Metrics
if task_type == "Classification":
accuracy = accuracy_score(y_test, predictions)
f1 = f1_score(y_test, predictions, average="weighted")
results.append([name, accuracy, f1])
# Regression Metrics
else:
mse = mean_squared_error(y_test, predictions)
r2 = r2_score(y_test, predictions)
results.append([name, mse, r2])
# =========================
# RESULTS TABLE
# =========================
if task_type == "Classification":
results_df = pd.DataFrame(
results,
columns=["Model", "Accuracy", "F1 Score"]
)
best_model = results_df.loc[
results_df["Accuracy"].idxmax(),
"Model"
]
else:
results_df = pd.DataFrame(
results,
columns=["Model", "MSE", "R2 Score"]
)
best_model = results_df.loc[
results_df["MSE"].idxmin(),
"Model"
]
report_file = save_report(results_df, best_model, task_type, dataset_name)
return results_df, f"🏆 Best Model: {best_model}", report_file
# =====================================================
# UPDATE DATASET OPTIONS
# =====================================================
def update_datasets(task_type):
if task_type == "Classification":
return gr.Dropdown(
choices=[
"Iris",
"Breast Cancer",
"Titanic"
],
value="Iris"
)
else:
return gr.Dropdown(
choices=[
"California Housing",
"Diabetes",
"Boston Housing"
],
value="California Housing"
)
# =====================================================
# GRADIO UI
# =====================================================
with gr.Blocks() as demo:
gr.Markdown("# AI Model Comparison App")
task_type = gr.Radio(
choices=["Classification", "Regression"],
value="Classification",
label="Select Task Type"
)
dataset_name = gr.Dropdown(
choices=[
"Iris",
"Breast Cancer",
"Titanic"
],
value="Iris",
label="Select Dataset"
)
task_type.change(
fn=update_datasets,
inputs=task_type,
outputs=dataset_name
)
run_button = gr.Button("Run Models")
output_table = gr.Dataframe()
output_text = gr.Textbox()
output_file = gr.File(label="Download Report")
run_button.click(
fn=run_models,
inputs=[task_type, dataset_name],
outputs=[output_table, output_text, output_file]
)
demo.launch()