Spaces:
Sleeping
Sleeping
import streamlit as st | |
import numpy as np | |
import matplotlib.pyplot as plt | |
from sklearn import datasets | |
from sklearn.model_selection import train_test_split | |
from sklearn.naive_bayes import GaussianNB | |
from sklearn.svm import SVC | |
from sklearn.neighbors import KNeighborsClassifier | |
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix | |
import seaborn as sns | |
# Load MNIST dataset | |
digits = datasets.load_digits() | |
X, y = digits.data, digits.target | |
# Split into train and test sets | |
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) | |
# Initialize classifiers | |
nb_classifier = GaussianNB() | |
svm_classifier = SVC() | |
knn_classifier = KNeighborsClassifier(n_neighbors=3) | |
# Train classifiers | |
nb_classifier.fit(X_train, y_train) | |
svm_classifier.fit(X_train, y_train) | |
knn_classifier.fit(X_train, y_train) | |
# Predict | |
nb_predictions = nb_classifier.predict(X_test) | |
svm_predictions = svm_classifier.predict(X_test) | |
knn_predictions = knn_classifier.predict(X_test) | |
# Compute accuracy | |
nb_accuracy = accuracy_score(y_test, nb_predictions) | |
svm_accuracy = accuracy_score(y_test, svm_predictions) | |
knn_accuracy = accuracy_score(y_test, knn_predictions) | |
# Compute classification reports and confusion matrices | |
nb_report = classification_report(y_test, nb_predictions) | |
svm_report = classification_report(y_test, svm_predictions) | |
knn_report = classification_report(y_test, knn_predictions) | |
nb_cm = confusion_matrix(y_test, nb_predictions) | |
svm_cm = confusion_matrix(y_test, svm_predictions) | |
knn_cm = confusion_matrix(y_test, knn_predictions) | |
def main(): | |
# Streamlit App | |
st.title("MNIST Classifier Performance") | |
st.write("### Sample Images from MNIST Dataset") | |
about = """# 🖥️ MNIST Classifier Performance App 🚀 | |
This Streamlit app demonstrates the performance of three different machine learning classifiers on the **MNIST handwritten digits dataset**. 📊 The classifiers compared are: | |
✅ **Naïve Bayes** | |
✅ **Support Vector Machine (SVM)** | |
✅ **K-Nearest Neighbors (KNN)** | |
## 🔍 Features: | |
- 📸 **Displays 5 sample images** from the MNIST dataset. | |
- 📊 **Trains and evaluates** Naïve Bayes, SVM, and KNN classifiers. | |
- 🏆 **Compares classifier accuracy** on the test dataset. | |
- 📄 **Shows classification reports** with precision, recall, and F1-score. | |
- 🔥 **Visualizes confusion matrices** using heatmaps for better understanding. | |
## 📌 How to Use: | |
1. Run the app using Streamlit. | |
2. Navigate through the **three tabs** to check the performance of each classifier. | |
3. Analyze the **classification report and confusion matrix** for deeper insights. | |
4. Read the **comparison section** to understand the strengths and weaknesses of each model. | |
## 🎯 Insights: | |
- **Naïve Bayes**: Fast but may struggle with complex patterns. | |
- **SVM**: Balanced performance with good accuracy. | |
- **KNN**: Effective but can be slow with large datasets. | |
🚀 Explore and experiment with different models to enhance classification performance! | |
### 📌 About the Creator | |
**Created by:** *Louie F. Cervantes, M.Eng. (Information Engineering)* | |
**(c) 2025 West Visayas State University** | |
""" | |
with st.expander("About the App"): | |
st.markdown(about) | |
# Display 5 sample images | |
fig, axes = plt.subplots(1, 5, figsize=(10, 3)) | |
for i, ax in enumerate(axes): | |
ax.imshow(digits.images[i], cmap='gray') | |
ax.set_title(f"Label: {digits.target[i]}") | |
ax.axis('off') | |
st.pyplot(fig) | |
st.write("Click on the tabs below to view classifier performance:") | |
# Create tabs | |
tab1, tab2, tab3 = st.tabs(["Naïve Bayes", "SVM", "KNN"]) | |
with tab1: | |
st.subheader("Naïve Bayes Classifier") | |
st.write(f"Accuracy: {nb_accuracy:.4f}") | |
st.write("Classification Report:") | |
st.write(nb_report) | |
st.write("Confusion Matrix:") | |
fig, ax = plt.subplots() | |
sns.heatmap(nb_cm, annot=True, fmt='d', cmap='Blues', ax=ax) | |
st.pyplot(fig) | |
with tab2: | |
st.subheader("Support Vector Machine (SVM)") | |
st.write(f"Accuracy: {svm_accuracy:.4f}") | |
st.write("Classification Report:") | |
st.write(svm_report) | |
st.write("Confusion Matrix:") | |
fig, ax = plt.subplots() | |
sns.heatmap(svm_cm, annot=True, fmt='d', cmap='Blues', ax=ax) | |
st.pyplot(fig) | |
with tab3: | |
st.subheader("K-Nearest Neighbors (KNN)") | |
st.write(f"Accuracy: {knn_accuracy:.4f}") | |
st.write("Classification Report:") | |
st.write(knn_report) | |
st.write("Confusion Matrix:") | |
fig, ax = plt.subplots() | |
sns.heatmap(knn_cm, annot=True, fmt='d', cmap='Blues', ax=ax) | |
st.pyplot(fig) | |
# Comparison | |
st.write("## Classifier Comparison") | |
st.write("### Observations:") | |
st.write("- **Naïve Bayes** is fast but may struggle with complex patterns.") | |
st.write("- **SVM** performs well with a balance of accuracy and speed.") | |
st.write("- **KNN** can be effective but may be slower with large datasets.") | |
if __name__ == "__main__": | |
main() |