diff --git a/models/knn.py b/models/knn.py new file mode 100644 index 0000000..c8db9b1 --- /dev/null +++ b/models/knn.py @@ -0,0 +1,29 @@ +from sklearn.neighbors import KNeighborsClassifier, KNeighborsRegressor +import numpy as np + +class KNNModel: + def __init__(self, task_type="classification", k=5): + self.task_type = task_type + self.k = k + self.model = None + + def initialize_model(self): + """Initialize KNN model based on task type.""" + if self.task_type == "classification": + self.model = KNeighborsClassifier(n_neighbors=self.k) + else: + self.model = KNeighborsRegressor(n_neighbors=self.k) + + def train(self, X, y): + """Train KNN model.""" + if self.model is None: + self.initialize_model() + self.model.fit(X, y) + + def predict(self, X): + """Make predictions.""" + return self.model.predict(X) + + def score(self, X, y): + """Return accuracy (for classification) or R² (for regression).""" + return self.model.score(X, y) diff --git a/pages/KNN.py b/pages/KNN.py new file mode 100644 index 0000000..3a98c96 --- /dev/null +++ b/pages/KNN.py @@ -0,0 +1,46 @@ +import streamlit as st +from models.knn import KNNModel +from utils.data_helpers import generate_classification_data, generate_sample_regression_data +from utils.plot_helpers import plot_classification_results, plot_regression_results +import pandas as pd + +st.set_page_config(page_title="KNN Model", layout="wide") + +st.title("🧠 K-Nearest Neighbors (KNN) Simulator") + +# --- Sidebar Controls --- +st.sidebar.header("⚙️ Configuration") +task_type = st.sidebar.selectbox("Select Task Type", ["classification", "regression"]) +k_value = st.sidebar.slider("Select k (number of neighbors)", min_value=1, max_value=20, value=5, step=1) +n_samples = st.sidebar.slider("Number of samples", 50, 500, 200) +n_features = st.sidebar.slider("Number of features", 2, 10, 2) + +# --- Generate Dataset --- +st.subheader("📊 Dataset Preview") + +if task_type == "classification": + X, y = generate_classification_data(n_samples=n_samples, n_features=n_features) +else: + data = generate_sample_regression_data(n_samples=n_samples, n_features=n_features) + X, y = data.iloc[:, :-1], data.iloc[:, -1] + +df = pd.DataFrame(X) +df["target"] = y +st.dataframe(df.head()) + +# --- Train Model --- +model = KNNModel(task_type=task_type, k=k_value) +model.train(X, y) +score = model.score(X, y) + +# --- Display Results --- +st.success(f"✅ Model trained successfully with k = {k_value}") +st.metric("Model Score", f"{score:.3f}") + +# --- Visualizations --- +st.subheader("📈 Visualization") + +if task_type == "classification": + st.pyplot(plot_classification_results(X, y, model)) +else: + st.pyplot(plot_regression_results(X, y, model))