File size: 3,545 Bytes
d7e53e8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
import gradio as gr
import pandas as pd

from sklearn.model_selection import train_test_split
from sklearn.metrics import (
    accuracy_score,
    mean_absolute_error,
    mean_squared_error,
    r2_score,
)
import numpy as np

# ======================
# Model imports
# ======================
from sklearn.linear_model import (
    LinearRegression,
    LogisticRegression,
    Perceptron,
)
from sklearn.neighbors import (
    KNeighborsClassifier,
    KNeighborsRegressor,
)
from sklearn.naive_bayes import GaussianNB
from sklearn.tree import (
    DecisionTreeClassifier,
    DecisionTreeRegressor,
)
from sklearn.svm import SVC, SVR
from sklearn.neural_network import (
    MLPClassifier,
    MLPRegressor,
)

# ======================
# Model registry
# ======================
REGRESSION_MODELS = {
    "Linear Regression": LinearRegression,
    "KNN Regressor": KNeighborsRegressor,
    "Decision Tree Regressor": DecisionTreeRegressor,
    "SVR": SVR,
    "MLP Regressor": MLPRegressor,
}

CLASSIFICATION_MODELS = {
    "Logistic Regression": LogisticRegression,
    "KNN Classifier": KNeighborsClassifier,
    "Naive Bayes": GaussianNB,
    "Perceptron": Perceptron,
    "Decision Tree Classifier": DecisionTreeClassifier,
    "SVM Classifier": SVC,
    "MLP Classifier": MLPClassifier,
}

# ======================
# UI Logic
# ======================
def update_models(task_type):
    if task_type == "Regression":
        return gr.update(choices=list(REGRESSION_MODELS.keys()), value=None)
    return gr.update(choices=list(CLASSIFICATION_MODELS.keys()), value=None)


def train_model(file, task_type, model_name):
    df = pd.read_csv(file.name)

    # Assumption: last column is target
    X = df.iloc[:, :-1]
    y = df.iloc[:, -1]

    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.2, random_state=42
    )

    if task_type == "Regression":
        model = REGRESSION_MODELS[model_name]()
        model.fit(X_train, y_train)

        preds = model.predict(X_test)

        mae = mean_absolute_error(y_test, preds)
        mse = mean_squared_error(y_test, preds)
        rmse = np.sqrt(mse)
        r2 = r2_score(y_test, preds)

        return (
            f"Model: {model_name}\n"
            f"Task: Regression\n"
            f"MAE: {mae:.4f}\n"
            f"MSE: {mse:.4f}\n"
            f"RMSE: {rmse:.4f}\n"
            f"R² Score: {r2:.4f}"
        )

    else:
        model = CLASSIFICATION_MODELS[model_name]()
        model.fit(X_train, y_train)

        preds = model.predict(X_test)
        acc = accuracy_score(y_test, preds)

        return (
            f"Model: {model_name}\n"
            f"Task: Classification\n"
            f"Accuracy: {acc:.4f}"
        )


# ======================
# Gradio App
# ======================
with gr.Blocks() as demo:
    gr.Markdown("## Supervised Learning Model Trainer")
    gr.Markdown(
        "Upload a CSV file. The **last column is treated as target**."
    )

    file_input = gr.File(label="Upload CSV", file_types=[".csv"])
    task_dropdown = gr.Dropdown(
        ["Regression", "Classification"],
        label="Task Type",
    )
    model_dropdown = gr.Dropdown(label="Model")
    output = gr.Textbox(label="Result", lines=5)

    train_btn = gr.Button("Generate")

    task_dropdown.change(
        update_models,
        inputs=task_dropdown,
        outputs=model_dropdown,
    )

    train_btn.click(
        train_model,
        inputs=[file_input, task_dropdown, model_dropdown],
        outputs=output,
    )

demo.launch()