import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report

# Load the training dataset
# Replace 'path_to_your_training_dataset.csv' with the actual path to your training dataset
train_data = pd.read_csv(r'E:\UniversityArchive\Documents\ML AI\fashion-mnist_train.csv')

# Load the test dataset
# Replace 'path_to_your_test_dataset.csv' with the actual path to your test dataset
test_data = pd.read_csv(r'E:\UniversityArchive\Documents\ML AI\fashion-mnist_test.csv')

# Split the training data into features and labels
X_train_full = train_data.drop('label', axis=1)
y_train_full = train_data['label']

# Split the test data into features and labels
X_test = test_data.drop('label', axis=1)
y_test = test_data['label']

# Split the training data again into training and validation sets (10% of the training data for validation)
X_train, X_val, y_train, y_val = train_test_split(X_train_full, y_train_full, test_size=0.1, random_state=42)

# Standardize the features
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_val_scaled = scaler.transform(X_val)
X_test_scaled = scaler.transform(X_test)

# Function to evaluate and print classification reports for a classifier
def evaluate_classifier(classifier, X_train, y_train, X_val, y_val, X_test, y_test, classifier_name):
    classifier.fit(X_train, y_train)

    # Evaluate on training set
    y_train_pred = classifier.predict(X_train)
    print(f"--- {classifier_name} - Training Set Evaluation ---")
    print(classification_report(y_train, y_train_pred))

    # Evaluate on validation set
    y_val_pred = classifier.predict(X_val)
    print(f"--- {classifier_name} - Validation Set Evaluation ---")
    print(classification_report(y_val, y_val_pred))

    # Evaluate on test set
    y_test_pred = classifier.predict(X_test)
    print(f"--- {classifier_name} - Test Set Evaluation ---")
    print(classification_report(y_test, y_test_pred))

# Implement and evaluate K-Nearest Neighbors Classifier
knn_classifier = KNeighborsClassifier(n_neighbors=5)
evaluate_classifier(knn_classifier, X_train_scaled, y_train, X_val_scaled, y_val, X_test_scaled, y_test, "K-Nearest Neighbors")

# Implement and evaluate Decision Tree Classifier
tree_classifier = DecisionTreeClassifier(random_state=42)
evaluate_classifier(tree_classifier, X_train_scaled, y_train, X_val_scaled, y_val, X_test_scaled, y_test, "Decision Tree")