in class lab template added
This commit is contained in:
268
Classification Lab/inclass_lab.py
Normal file
268
Classification Lab/inclass_lab.py
Normal file
@@ -0,0 +1,268 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""Inclass-Lab
|
||||
|
||||
Automatically generated by Colab.
|
||||
|
||||
Original file is located at
|
||||
https://colab.research.google.com/drive/13N7lQHvv4_LxKgcerumJ-18e5GfdBggm
|
||||
"""
|
||||
|
||||
|
||||
|
||||
"""In-Class Lab: Comparing Classification Models (Breast Cancer Dataset)
|
||||
|
||||
Learning Objectives
|
||||
|
||||
---
|
||||
|
||||
|
||||
By the end of this lab, you should be able to:
|
||||
|
||||
|
||||
|
||||
* Train multiple models (KNN, Logistic Regression, Decision Tree)
|
||||
* Compare performance across various scenarios
|
||||
* Understand the effect of scaling and evaluation methods
|
||||
* Interpret confusion matrix & classification report
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
"""
|
||||
|
||||
####################################
|
||||
# BLOCK 1:
|
||||
'''
|
||||
Load dataset
|
||||
Explain features/target
|
||||
Do train_test_split
|
||||
'''
|
||||
####################################
|
||||
from sklearn.datasets import load_breast_cancer
|
||||
data = load_breast_cancer()
|
||||
X = data.data
|
||||
y = data.target
|
||||
|
||||
print(data.target_names)
|
||||
print(X.shape)
|
||||
#0 - malignant
|
||||
#1 - benigh
|
||||
|
||||
###############################
|
||||
# BLOCK 2: IMPORT LIBRARIES FOR CLASSIFIERS
|
||||
###############################
|
||||
from sklearn.neighbors import KNeighborsClassifier
|
||||
from sklearn.linear_model import LogisticRegression
|
||||
from sklearn.tree import DecisionTreeClassifier
|
||||
|
||||
#########################################
|
||||
# BLOCK 3: IMPORT MODUL FOR DATA SPLIT
|
||||
#########################################
|
||||
from sklearn.model_selection import train_test_split
|
||||
|
||||
####################################
|
||||
# BLOCK 4: SPLIT THE DATASET
|
||||
####################################
|
||||
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
|
||||
|
||||
####################################
|
||||
# BLOCK 5
|
||||
#TASK 1: Train 3 models (no scaling)
|
||||
####################################
|
||||
knn = KNeighborsClassifier(n_neighbors=5)
|
||||
logreg = LogisticRegression(max_iter=5000)
|
||||
tree = DecisionTreeClassifier()
|
||||
|
||||
knn.fit(X_train, y_train)
|
||||
logreg.fit(X_train, y_train)
|
||||
tree.fit(X_train, y_train)
|
||||
|
||||
####################################
|
||||
# BLOCK 6
|
||||
# Task 2: Evaluate accuracy
|
||||
'''
|
||||
* Which model performs best?
|
||||
* Are the results very different?
|
||||
'''
|
||||
####################################
|
||||
print("KNN:", knn.score(X_test, y_test))
|
||||
print("LogReg:", logreg.score(X_test, y_test))
|
||||
print("Tree:", tree.score(X_test, y_test))
|
||||
|
||||
####################################
|
||||
#BLOCK 7
|
||||
# Part 2: Evaluation Metrics
|
||||
# Task 3: Confusion Matrix
|
||||
|
||||
from sklearn.metrics import confusion_matrix
|
||||
print(confusion_matrix(y_test, knn.predict(X_test)))
|
||||
|
||||
#####################################
|
||||
# BLOCK 8: CLASSIFICATION FREPORT
|
||||
'''
|
||||
* Which model has better recall?
|
||||
* Which is better for detecting cancer?
|
||||
'''
|
||||
#####################################
|
||||
from sklearn.metrics import classification_report
|
||||
print(classification_report(y_test, knn.predict(X_test)))
|
||||
|
||||
########################################
|
||||
# BLOCK 9:
|
||||
# Part 3: Scaling Effect
|
||||
# Task 5: Apply scaling using pipeline
|
||||
########################################
|
||||
|
||||
from sklearn.pipeline import Pipeline
|
||||
from sklearn.preprocessing import StandardScaler
|
||||
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
|
||||
|
||||
knn_scaled = Pipeline([
|
||||
('scaler', StandardScaler()),
|
||||
('knn', KNeighborsClassifier(n_neighbors=5))
|
||||
])
|
||||
|
||||
logreg_scaled = Pipeline([
|
||||
('scaler', StandardScaler()),
|
||||
('logreg', LogisticRegression(max_iter=5000))
|
||||
])
|
||||
|
||||
tree_scaled = Pipeline([
|
||||
('scaler', StandardScaler()),
|
||||
('tree', DecisionTreeClassifier(random_state=42))
|
||||
])
|
||||
|
||||
knn_scaled.fit(X_train, y_train)
|
||||
logreg_scaled.fit(X_train, y_train)
|
||||
tree_scaled.fit(X_train, y_train)
|
||||
|
||||
knn_pred_scaled = knn_scaled.predict(X_test)
|
||||
logreg_pred_scaled = logreg_scaled.predict(X_test)
|
||||
tree_pred_scaled = tree_scaled.predict(X_test)
|
||||
|
||||
print("\n=== RESULTS WITH SCALING ===")
|
||||
print("KNN Accuracy:", accuracy_score(y_test, knn_pred_scaled))
|
||||
print("Logistic Regression Accuracy:", accuracy_score(y_test, logreg_pred_scaled))
|
||||
print("Decision Tree Accuracy:", accuracy_score(y_test, tree_pred_scaled))
|
||||
|
||||
#####################################
|
||||
# BLOCK 10: CLASSIFICATION REPORT
|
||||
#####################################
|
||||
print("\n=== CLASSIFICATION REPORTS (WITH SCALING) ===")
|
||||
|
||||
print("\nKNN Report:")
|
||||
print(classification_report(y_test, knn_pred_scaled))
|
||||
|
||||
print("\nLogistic Regression Report:")
|
||||
print(classification_report(y_test, logreg_pred_scaled))
|
||||
|
||||
print("\nDecision Tree Report:")
|
||||
print(classification_report(y_test, tree_pred_scaled))
|
||||
|
||||
####################################
|
||||
# BLOCK 11: CONFUSION MATRIX
|
||||
####################################
|
||||
print("\n=== CONFUSION MATRICES (WITH SCALING) ===")
|
||||
|
||||
print("\nKNN Confusion Matrix:")
|
||||
print(confusion_matrix(y_test, knn_pred_scaled))
|
||||
|
||||
print("\nLogistic Regression Confusion Matrix:")
|
||||
print(confusion_matrix(y_test, logreg_pred_scaled))
|
||||
|
||||
print("\nDecision Tree Confusion Matrix:")
|
||||
print(confusion_matrix(y_test, tree_pred_scaled))
|
||||
|
||||
|
||||
|
||||
###############################################
|
||||
# BLOCK 12: MODWLS WITH CROSS-VALIDATION
|
||||
###############################################
|
||||
from sklearn.model_selection import cross_val_score
|
||||
from sklearn.preprocessing import StandardScaler
|
||||
|
||||
knn_pipeline = Pipeline([
|
||||
('scaler', StandardScaler()),
|
||||
('knn', KNeighborsClassifier(n_neighbors=5))
|
||||
])
|
||||
|
||||
logreg_pipeline = Pipeline([
|
||||
('scaler', StandardScaler()),
|
||||
('logreg', LogisticRegression(max_iter=5000))
|
||||
])
|
||||
|
||||
tree_model = DecisionTreeClassifier(random_state=42)
|
||||
|
||||
knn_cv_scores = cross_val_score(knn_pipeline, X, y, cv=5, scoring='accuracy')
|
||||
logreg_cv_scores = cross_val_score(logreg_pipeline, X, y, cv=5, scoring='accuracy')
|
||||
tree_cv_scores = cross_val_score(tree_model, X, y, cv=5, scoring='accuracy')
|
||||
|
||||
print("=== Cross-Validation Results ===")
|
||||
|
||||
print("\nKNN")
|
||||
print("CV Scores:", knn_cv_scores)
|
||||
print("Mean Accuracy:", np.mean(knn_cv_scores))
|
||||
print("Standard Deviation:", np.std(knn_cv_scores))
|
||||
|
||||
print("\nLogistic Regression")
|
||||
print("CV Scores:", logreg_cv_scores)
|
||||
print("Mean Accuracy:", np.mean(logreg_cv_scores))
|
||||
print("Standard Deviation:", np.std(logreg_cv_scores))
|
||||
|
||||
print("\nDecision Tree")
|
||||
print("CV Scores:", tree_cv_scores)
|
||||
print("Mean Accuracy:", np.mean(tree_cv_scores))
|
||||
print("Standard Deviation:", np.std(tree_cv_scores))
|
||||
|
||||
####################################
|
||||
# BLOCK 13: CONFUSION MATRIX
|
||||
####################################
|
||||
from sklearn.model_selection import cross_val_predict
|
||||
from sklearn.metrics import confusion_matrix, classification_report
|
||||
|
||||
knn_pred = cross_val_predict(knn_pipeline, X, y, cv=5)
|
||||
logreg_pred = cross_val_predict(logreg_pipeline, X, y, cv=5)
|
||||
tree_pred = cross_val_predict(tree_model, X, y, cv=5)
|
||||
|
||||
print("\n=== Confusion Matrices ===")
|
||||
print("\nKNN")
|
||||
print(confusion_matrix(y, knn_pred))
|
||||
|
||||
print("\nLogistic Regression")
|
||||
print(confusion_matrix(y, logreg_pred))
|
||||
|
||||
print("\nDecision Tree")
|
||||
print(confusion_matrix(y, tree_pred))
|
||||
|
||||
print("\n=== Classification Reports ===")
|
||||
print("\nKNN")
|
||||
print(classification_report(y, knn_pred))
|
||||
|
||||
print("\nLogistic Regression")
|
||||
print(classification_report(y, logreg_pred))
|
||||
|
||||
print("\nDecision Tree")
|
||||
print(classification_report(y, tree_pred))
|
||||
|
||||
###########################################
|
||||
# BLOCK 14: LETS GET THE BEST VALUE FOR K
|
||||
# task: use the k value to recompute the previous KNN model and evaluate the performance
|
||||
##########################################
|
||||
from sklearn.model_selection import cross_val_score
|
||||
import numpy as np
|
||||
|
||||
k_values = range(1, 21)
|
||||
scores = []
|
||||
|
||||
for k in k_values:
|
||||
knn = KNeighborsClassifier(n_neighbors=k)
|
||||
cv_scores = cross_val_score(knn, X, y, cv=5)
|
||||
scores.append(np.mean(cv_scores))
|
||||
|
||||
best_k = k_values[np.argmax(scores)]
|
||||
|
||||
print("Best k:", best_k)
|
||||
print("Best CV Accuracy:", max(scores))
|
||||
|
||||
Reference in New Issue
Block a user