import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
# Load dataset
data = load_iris()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = pd.Series(data.target)
# Train-test split (with stratification)
X_train, X_test, y_train, y_test = train_test_split(
X, y,
test_size=0.3,
random_state=42,
stratify=y
)
# Default Decision Tree
clf = DecisionTreeClassifier(random_state=42)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
print("Default Accuracy:", accuracy_score(y_test, y_pred))
# Hyperparameter tuning using Grid Search
params = {
'criterion': ['gini', 'entropy'],
'max_depth': [2, 3, 4, 5, None],
'min_samples_split': [2, 3, 4],
'min_samples_leaf': [1, 2, 3]
}
grid = GridSearchCV(
DecisionTreeClassifier(random_state=42),
params,
cv=5,
scoring='accuracy',
n_jobs=-1
)
grid.fit(X_train, y_train)
# Best Model
best_model = grid.best_estimator_
y_best = best_model.predict(X_test)
print("Best Params:", grid.best_params_)
print("Tuned Accuracy:", accuracy_score(y_test, y_best))
print("\nConfusion Matrix:\n", confusion_matrix(y_test, y_best))
print("\nClassification Report:\n", classification_report(y_test, y_best))