Submitted By:
Ahsan Azeem Zahid
Reg#:
FA22-BCS-213
Submitted To:
Mam Maryam Mazhar
Assigment #
03
dt_classification_iris.py
# Import necessary libraries
import numpy as np
import pandas as pd
import [Link] as plt
from [Link] import load_iris # Built-in dataset for classification
from sklearn.model_selection import train_test_split # For splitting data
from [Link] import StandardScaler # For scaling features
from [Link] import DecisionTreeClassifier, plot_tree # DT model and viz
from [Link] import accuracy_score, confusion_matrix, classification_report #
Evaluation metrics
from [Link].outliers_influence import variance_inflation_factor # For VIF
import warnings
[Link]('ignore') # Ignore warnings for clean output
# Step 1: Data Selection
# Load the Iris dataset (150 samples, 4 features, 3 classes: setosa, versicolor, virginica)
iris = load_iris()
X = [Link]([Link], columns=iris.feature_names) # Features: sepal/petal
length/width
y = [Link] # Target: class labels 0,1,2
print("Dataset shape:", [Link])
print("Target classes:", [Link](y))
# Step 2: Data Preprocessing
# Split into train/test (80/20)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Scale features to standardize (mean=0, std=1) - important for DT to avoid bias
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = [Link](X_test)
print("\nPreprocessing complete. Train shape:", X_train_scaled.shape)
# Step 3: Multi-collinearity Check
# Calculate VIF for each feature to detect multicollinearity (VIF > 5-10 indicates issue)
vif_data = [Link]()
vif_data["feature"] = [Link]
vif_data["VIF"] = [variance_inflation_factor(X_train_scaled, i) for i in range(len([Link]))]
print("\nVIF Scores:\n", vif_data)
# Insight: High VIF (e.g., >10) suggests correlated features; may need feature selection
# Step 4: Model Building
# Build Decision Tree Classifier (from sklearn; from-scratch would use Gini/entropy for
splits)
clf = DecisionTreeClassifier(random_state=42, max_depth=3) # Limit depth to prevent
overfitting
[Link](X_train_scaled, y_train) # Train on scaled data
# Step 5: Model Evaluation
y_pred = [Link](X_test_scaled) # Predict on test
accuracy = accuracy_score(y_test, y_pred) # Accuracy score
print("\nAccuracy:", accuracy)
print("\nConfusion Matrix:\n", confusion_matrix(y_test, y_pred))
print("\nClassification Report:\n", classification_report(y_test, y_pred))
# Step 6: Visualization
# Plot the decision tree
[Link](figsize=(12,8))
plot_tree(clf, feature_names=iris.feature_names, class_names=iris.target_names,
filled=True)
[Link]('Decision Tree for Iris Classification')
[Link]('iris_tree.png') # Save plot
[Link]() # Display if running locally
# Feature Importance Bar Plot
importances = [Link]({'feature': iris.feature_names, 'importance':
clf.feature_importances_}).sort_values('importance', ascending=False)
[Link](figsize=(8,6))
[Link](x='feature', y='importance')
[Link]('Feature Importance in Iris DT')
[Link]('iris_importance.png') # Save plot
[Link]() # Display if running locally
print("\nPlots saved as iris_tree.png and iris_importance.png")
Output:
dt_regression_synthetic.py.
# Import necessary libraries
import numpy as np
import pandas as pd
import [Link] as plt
from sklearn.model_selection import train_test_split # For splitting
from [Link] import StandardScaler # For scaling
from [Link] import DecisionTreeRegressor, plot_tree # DT model and viz
from [Link] import mean_squared_error, r2_score # Evaluation metrics
from [Link].outliers_influence import variance_inflation_factor # For VIF
import warnings
[Link]('ignore') # Ignore warnings
# Step 1: Data Selection
# Generate synthetic dataset (200 samples, 4 features, 1 target) - simulates correlated
features for multicollinearity
[Link](42)
n_samples = 200
X = [Link](n_samples, 4)
# Introduce multicollinearity: Feature3 correlated with Feature1
X[:, 2] = X[:, 0] * 0.8 + [Link](n_samples) * 0.2
feature_names = ['Feature1', 'Feature2', 'Feature3_Corr', 'Feature4']
X = [Link](X, columns=feature_names)
y = X['Feature1'] + 2 * X['Feature2'] + 0.5 * X['Feature3_Corr'] +
[Link](n_samples) * 0.1 # Target with linear relation + noise
print("Dataset shape:", [Link])
print("Target range:", [Link](), "to", [Link]())
# Step 2: Data Preprocessing
# Split into train/test (80/20)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Scale features
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = [Link](X_test)
print("\nPreprocessing complete. Train shape:", X_train_scaled.shape)
# Step 3: Multi-collinearity Check
vif_data = [Link]()
vif_data["feature"] = feature_names
vif_data["VIF"] = [variance_inflation_factor(X_train_scaled, i) for i in
range(len(feature_names))]
print("\nVIF Scores:\n", vif_data)
# Insight: High VIF for correlated features indicates multicollinearity; consider dropping one
# Step 4: Model Building
reg = DecisionTreeRegressor(random_state=42, max_depth=5) # Limit depth to prevent
overfitting
[Link](X_train_scaled, y_train) # Train
# Step 5: Model Evaluation
y_pred = [Link](X_test_scaled)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("\nMSE:", mse)
print("R2 Score:", r2)
# Step 6: Visualization
# Plot tree (limit depth for readability)
[Link](figsize=(12,8))
plot_tree(reg, feature_names=feature_names, filled=True, max_depth=3)
[Link]('Decision Tree for Regression')
[Link]('regression_tree.png')
[Link]()
# Feature Importance
importances = [Link]({'feature': feature_names, 'importance':
reg.feature_importances_}).sort_values('importance', ascending=False)
[Link](figsize=(8,6))
[Link](x='feature', y='importance')
[Link]('Feature Importance in Regression DT')
[Link]('regression_importance.png')
[Link]()
# Actual vs Predicted Scatter
[Link](figsize=(8,6))
[Link](y_test, y_pred, alpha=0.5)
[Link]([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', lw=2)
[Link]('Actual')
[Link]('Predicted')
[Link]('Actual vs Predicted Values')
[Link]('regression_pred.png')
[Link]()
print("\nPlots saved as regression_tree.png, regression_importance.png,
regression_pred.png")
Output: