In [1]:
!pip install seaborn
Requirement already satisfied: seaborn in /opt/anaconda3/envs/NNM24AM045/lib/python3.13/site-packages (0.13.2) Requirement already satisfied: numpy!=1.24.0,>=1.20 in /opt/anaconda3/envs/NNM24AM045/lib/python3.13/site-packages (from seaborn) (2.3.2) Requirement already satisfied: pandas>=1.2 in /opt/anaconda3/envs/NNM24AM045/lib/python3.13/site-packages (from seaborn) (2.3.1) Requirement already satisfied: matplotlib!=3.6.1,>=3.4 in /opt/anaconda3/envs/NNM24AM045/lib/python3.13/site-packages (from seaborn) (3.10.5) Requirement already satisfied: contourpy>=1.0.1 in /opt/anaconda3/envs/NNM24AM045/lib/python3.13/site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (1.3.3) Requirement already satisfied: cycler>=0.10 in /opt/anaconda3/envs/NNM24AM045/lib/python3.13/site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (0.12.1) Requirement already satisfied: fonttools>=4.22.0 in /opt/anaconda3/envs/NNM24AM045/lib/python3.13/site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (4.59.1) Requirement already satisfied: kiwisolver>=1.3.1 in /opt/anaconda3/envs/NNM24AM045/lib/python3.13/site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (1.4.9) Requirement already satisfied: packaging>=20.0 in /opt/anaconda3/envs/NNM24AM045/lib/python3.13/site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (25.0) Requirement already satisfied: pillow>=8 in /opt/anaconda3/envs/NNM24AM045/lib/python3.13/site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (11.3.0) Requirement already satisfied: pyparsing>=2.3.1 in /opt/anaconda3/envs/NNM24AM045/lib/python3.13/site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (3.2.3) Requirement already satisfied: python-dateutil>=2.7 in /opt/anaconda3/envs/NNM24AM045/lib/python3.13/site-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (2.9.0.post0) Requirement already satisfied: pytz>=2020.1 in /opt/anaconda3/envs/NNM24AM045/lib/python3.13/site-packages (from pandas>=1.2->seaborn) (2025.2) Requirement already satisfied: tzdata>=2022.7 in /opt/anaconda3/envs/NNM24AM045/lib/python3.13/site-packages (from pandas>=1.2->seaborn) (2025.2) Requirement already satisfied: six>=1.5 in /opt/anaconda3/envs/NNM24AM045/lib/python3.13/site-packages (from python-dateutil>=2.7->matplotlib!=3.6.1,>=3.4->seaborn) (1.17.0)
In [2]:
# 1. Import required libraries
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
import seaborn as sns
In [3]:
# 2. Load Iris dataset
iris = load_iris()
X = iris.data
y = iris.target
In [4]:
# Convert to a DataFrame (for easier visualization)
iris_df = pd.DataFrame(X, columns = iris.feature_names)
iris_df['species'] = pd.Series(y).map(dict(enumerate(iris.target_names)))
print("First 5 rows of the Iris dataset:")
print(iris_df.head())
First 5 rows of the Iris dataset: sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) \ 0 5.1 3.5 1.4 0.2 1 4.9 3.0 1.4 0.2 2 4.7 3.2 1.3 0.2 3 4.6 3.1 1.5 0.2 4 5.0 3.6 1.4 0.2 species 0 setosa 1 setosa 2 setosa 3 setosa 4 setosa
In [5]:
# 3. Split the dataset into training and testing sets (80% - 20%)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state=42, stratify=y)
In [6]:
# 4. Create a Naive Bayes classifier (GaussianNB)
nb_model = GaussianNB()
In [7]:
# 5. Train the model
nb_model.fit(X_train, y_train)
Out[7]:
GaussianNB()In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
Parameters
| priors | None | |
| var_smoothing | 1e-09 |
In [8]:
# 6. make predictions on the test set
y_pred = nb_model.predict(X_test)
In [9]:
# 7. Evaluate the model
print("\nModel Evaluation Results:")
print("-" * 40)
print("Accuracy: {:.2f}%".format(accuracy_score(y_test, y_pred) * 100))
print("\nConfusion Matrix: \n", confusion_matrix(y_test, y_pred))
print("\nClassification Report:\n", classification_report(y_test, y_pred, target_names = iris.target_names))
Model Evaluation Results:
----------------------------------------
Accuracy: 96.67%
Confusion Matrix:
[[10 0 0]
[ 0 9 1]
[ 0 0 10]]
Classification Report:
precision recall f1-score support
setosa 1.00 1.00 1.00 10
versicolor 1.00 0.90 0.95 10
virginica 0.91 1.00 0.95 10
accuracy 0.97 30
macro avg 0.97 0.97 0.97 30
weighted avg 0.97 0.97 0.97 30
In [10]:
# 8. Model
new_sample = [[5.1, 3.5, 1.4, 0.2]] # sepal length, sepal width, petal length, petal width
predicted_class = nb_model.predict(new_sample)
predicted_class_name = iris.target_names[predicted_class[0]]
print("\nPrediction for New Sample")
print(f"Features: {new_sample}")
print(f"Predicted Class: {predicted_class_name}")
Prediction for New Sample Features: [[5.1, 3.5, 1.4, 0.2]] Predicted Class: setosa
In [11]:
# 9. Visualizations
## a) Confusion matrix heatmap
cm = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(6, 4))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues',
xticklabels = iris.target_names,
yticklabels = iris.target_names)
plt.title('Confusion Matrix Heatmap')
plt.xlabel('Predicted')
plt.ylabel('True')
plt.show()
In [13]:
ph for ## b) Pairplt of the Iris dataset
sns.pairplot(iris_df, hue='species', diag_kind = 'kde')
plt.suptitle('Iris Dataset Feature Distributions', y = 1.02)
plt.show()
In [ ]: