8.1 classification improvement 
code : 
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split, cross_val_score, KFold
from sklearn.svm import SVC
from sklearn.decomposition import PCA
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import BaggingClassifier, AdaBoostClassifier
from scipy.stats import chi2_contingency
# Load data
df = pd.read_csv(filepath)
target = "target column"
# Uncomment and adjust only if the target column is missing
#df["Result"] = df["math score"]
#target = "Result"
# Convert Yes/No target values to 1/0 if needed
df[target] = df[target].replace({"Yes": 1, "No": 0})
# Remove missing values
print("Missing Values:")
print(df.isnull().sum())
df = df.dropna()
print("After dropping missing values:")
print(df.isnull().sum())
print("Data Head:")
print(df.head())
# Categorical columns in the heart dataset
cat_cols = [
    "Sex", "ChestPainType", "RestingECG",
    "ExerciseAngina", "ST_Slope"
]
# Chi-Square Test
for col in cat_cols:
    if col in df.columns:
        contingency_table = pd.crosstab(df[col], df[target])
        chi2, p, dof, expected = chi2_contingency(contingency_table)
        print(f"Chi-Square Test for {col}:")
        print(f"Chi2: {chi2:.3f}, p-value: {p:.3f}")
# Encode all categorical feature columns
df = pd.get_dummies(df, columns=[
    c for c in df.select_dtypes(include=["object", "category", "string"]).columns
    if c != target
], drop_first=True, dtype=int)
# Correlation Heatmap
plt.figure(figsize=(10, 6))
sns.heatmap(
    df.corr(numeric_only=True),annot=True,cmap="coolwarm",fmt=".2f")
plt.title("Correlation Heatmap")
plt.show()
# Feature Selection
X = df.drop(columns=[target])
y = df[target]
if not pd.api.types.is_numeric_dtype(y):
    y = pd.factorize(y)[0]
results = {}
# Without Scaling
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=69
)
svm = SVC(kernel="rbf")
svm.fit(X_train, y_train)
pred = svm.predict(X_test)
results["Without Scaling"] = accuracy_score(y_test, pred)
print("Accuracy without scaling:", results["Without Scaling"] * 100)
# Standard Scaling
scaler = StandardScaler()
X_std = scaler.fit_transform(X)
X_train, X_test, y_train, y_test = train_test_split(
    X_std, y, test_size=0.2, random_state=69
)
svm.fit(X_train, y_train)
pred = svm.predict(X_test)
results["After Scaling"] = accuracy_score(y_test, pred)
print("Accuracy after scaling:", results["After Scaling"] * 100)
# PCA
pca = PCA(n_components=5)
X_train_pca = pca.fit_transform(X_train)
X_test_pca = pca.transform(X_test)
svm.fit(X_train_pca, y_train)
pred = svm.predict(X_test_pca)
results["After PCA"] = accuracy_score(y_test, pred)
print("Accuracy after PCA:", results["After PCA"] * 100)
# Bagging
svm_bag = BaggingClassifier(
    SVC(kernel="rbf"),
    n_estimators=50,
    random_state=69
)
svm_bag.fit(X_train, y_train)
pred = svm_bag.predict(X_test)
results["Bagging SVM"] = accuracy_score(y_test, pred)
print("Accuracy after Bagging:", results["Bagging SVM"] * 100)
# Boosting
svm_boost = AdaBoostClassifier(
    SVC(kernel="linear", probability=True),
    n_estimators=50,
    random_state=69
)
svm_boost.fit(X_train, y_train)
pred = svm_boost.predict(X_test)
results["Boosting SVM"] = accuracy_score(y_test, pred)
print("Accuracy after Boosting:", results["Boosting SVM"] * 100)
# Cross Validation
cv = KFold(n_splits=5, shuffle=True, random_state=69)
cv_score = cross_val_score(
    svm, X_std, y, cv=cv, scoring="accuracy"
)
results["Cross Validation"] = cv_score.mean()
# Final Accuracy Table
result_table = pd.DataFrame(
    results.items(), columns=["Step", "Accuracy"]
)
result_table["Accuracy"] = (result_table["Accuracy"] * 100).round(2)
print("\nFinal Accuracy Comparison")
print(result_table)
best = result_table.loc[result_table["Accuracy"].idxmax()]
print("\nBest Step:")
print(best)
