| import numpy as np
import pandas as pd
from ucimlrepo import fetch_ucirepo
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix, precision_score, recall_score, f1_score # load the dataset using the the given url
iris = fetch_ucirepo(id=53)
X = iris.data.features
y = iris.data.targets
df = pd.concat([X, y], axis=1) # Keep only Setosa and Versicolor
df = df[df['class'].isin(['Iris-setosa', 'Iris-versicolor'])] # Separate features and labels
df['class'] = df['class'].map({'Iris-setosa': 0, 'Iris-versicolor': 1})
X = df.iloc[:, :-1].values
y = df['class'].values.reshape(-1, 1) # intercept
X = np.c_[np.ones((X.shape[0], 1)), X] # train test split (80/20)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, shuffle=True
) # Logistic Regression (Gradient Descent)
def sigmoid(z):
return 1 / (1 + np.exp(-z)) def compute_loss(y, y_pred):
m = len(y)
return - (1/m) * np.sum(ynp.log(y_pred + 1e-9) + (1 - y)np.log(1 - y_pred + 1e-9)) # weights and parameters
theta = np.zeros((X_train.shape[1], 1))
lr = 0.01 # learning rate
iteration = 10000 # iterations # Gradient Descent Loop
for epoch in range(iteration):
z = np.dot(X_train, theta)
y_pred = sigmoid(z)
error = y_pred - y_train
gradient = (1 / len(y_train)) * np.dot(X_train.T, error)
theta -= lr * gradient if epoch % 1000 == 0:
loss = compute_loss(y_train, y_pred)
print(f"Epoch {epoch}: Loss = {loss:.4f}")
# Predictions and Metrics
y_test_pred = sigmoid(np.dot(X_test, theta))
y_test_class = (y_test_pred >= 0.5).astype(int)# Accuracy
accuracy = np.mean(y_test_class == y_test) * 100
print("RESULTS")
print(f"Classification Accuracy on Test Data: {accuracy:.2f}%") # Confusion Matrix
cm = confusion_matrix(y_test, y_test_class)
print("\nConfusion Matrix for Test data:")
print(cm) print("\n--- Predict for a new flower sample ---")
print("Please enter the feature values:") # Ask user for input
sepal_length = float(input("Enter Sepal Length (cm): "))
sepal_width = float(input("Enter Sepal Width (cm): "))
petal_length = float(input("Enter Petal Length (cm): "))
petal_width = float(input("Enter Petal Width (cm): ")) # Create feature array with bias term
new_sample = np.array([[1, sepal_length, sepal_width, petal_length, petal_width]]) # Predict probability and class
new_pred_prob = sigmoid(np.dot(new_sample, theta))
new_pred_class = (new_pred_prob >= 0.5).astype(int) print(f"Predicted probability of being 'Iris-versicolor': {new_pred_prob[0][0]:.4f}")
if new_pred_class[0][0] == 1:
print("Predicted Class: Iris-versicolor")
else:
print("Predicted Class: Iris-setosa") |