This project implements a Gradient Boosting Classifier from scratch in Python, along with comprehensive testing and visualization tools. The implementation includes various features like regression trees, gradient boosting, and model evaluation metrics.
- Custom implementation of Gradient Boosting Classifier
- Regression Tree implementation
- Comprehensive test suite
- Data generation utilities
- Visualization tools for:
- Learning curves
- Decision boundaries
- Feature importance
- Tree structure
- Model comparison with scikit-learn
- Training/validation loss
- ROC curves
- Confusion matrices
- Probability distributions
- Python 3.8+
- Required packages (see
requirements.txt):- numpy
- scikit-learn
- pytest
- matplotlib
- pandas
- seaborn
cd Project2_ML
- Create and activate a virtual environment:
python3 -m venv venv venv\Scripts\activate
- Install dependencies:
pip install -r requirements.txt
Project2_ML/
├── model/
│ ├── gradient_boosting.py # Main gradient boosting implementation
│ ├── regression_tree.py # Regression tree implementation
│ └── tree_node.py # Tree node structure
├── tests/
│ ├── test_gradient_boosting.py # Test cases
│ └── various test datasets
├── generate_classification_data.py # Data generation script
├── example_usage.py # Example usage script
├── visualize_gradient_boosting.py # Visualization script
├── run_project.py # Script to run entire project
└── requirements.txt # Project dependencies
To run all components of the project (data generation, tests, example usage, and visualizations):
python3 run_project.py
This will:
- Generate test datasets
- Run all tests
- Execute the example usage script
- Generate all visualizations
To generate test datasets:
python3 generate_classification_data.py
This creates several test datasets in the /tests directory:
small_data.csv: Simple toy datasetnoisy_data.csv: Dataset with added noisecollinear_data.csv: Dataset with collinear featuresimbalance_data.csv: Imbalanced class distributionnonlinear_data.csv: Non-linear decision boundarysample_data.csv: General sample dataset
To run the test suite:
python3 -m pytest tests/test_gradient_boosting.py -v
Tests cover:
- Toy data
- Noisy data
- Collinear features
- Imbalanced classes
- Non-linear boundaries
- Edge cases
- Probability outputs
python3 example_usage.py
This demonstrates:
- Model initialization
- Training
- Prediction
- Evaluation metrics
To generate all visualizations:
python3 visualize_gradient_boosting.py
This creates several visualization files:
learning_curve.png: Accuracy vs number of treesdecision_boundary.png: 2D decision boundaryfeature_importance.png: Feature importance plottree_structure.png: First tree structurecomparison.png: Comparison with scikit-learnloss_curves.png: Training/validation lossroc_curve.png: ROC curve with AUCconfusion_matrix.png: Confusion matrixprobability_histogram.png: Probability distributionprobability_vs_true.png: Probabilities vs true labels
You can modify various parameters in the scripts:
- In
example_usage.py:
gb = GradientBoostingClassifier(
n_estimators=100, # Number of trees
learning_rate=0.1, # Learning rate
max_depth=3 # Maximum tree depth
)- In
visualize_gradient_boosting.py:
def main(n_samples=500): # Number of samples for visualization
# ...- In
generate_classification_data.py:
def generate_all_datasets(n_samples=100): # Number of samples for each dataset
# ...Answer: We've implemented a binary Gradient-Boosting Tree classifier that:
- Starts with a constant log-odds prediction
- Iteratively fits simple regressors (depth-1 "stumps") to the residuals of the logistic loss
- Combines predictions through a sigmoid function to yield probabilities
- Uses a 0.5 cutoff for binary classification
This model is particularly useful when:
- You need to capture both linear and non-linear decision boundaries
- You want implicit feature selection (especially with stumps)
- You need robustness to outliers and heterogeneous feature scales
- You're working with structured/tabular data
- You require high predictive accuracy
Answer: We implemented seven comprehensive test scenarios:
-
Toy Data Test
- Basic sanity check
- Minimum accuracy requirement: 75%
-
Noisy Data Test
- Tests noise robustness
- Minimum accuracy requirement: 70%
-
Collinear Features Test
- Evaluates feature selection behavior
- Minimum accuracy requirement: 75%
-
Imbalanced Classes Test
- Tests handling of 90/10 class distribution
- Minimum accuracy requirement: 65%
-
Non-linear Data Test
- Tests complex boundary learning
- Minimum accuracy requirement: 70%
-
Scikit-learn Comparison
- Validates against a library implementation
- Ensures predictions and metrics align within tolerance
-
Edge Cases Test
- Tests single-feature inputs
- Tests extreme regularization
- Verifies coefficient sparsity
Each test includes visual verification through "True vs. Predicted" plots to ensure no invalid outputs are produced.
Answer: The model exposes several key parameters for tuning:
-
Core Parameters:
n_estimators: Number of boosting iterationslearning_rate: Shrinkage factor for each new learnermax_depth: Maximum depth of each tree
-
Example Usage:
from model.gradient_boosting import GradientBoostingClassifier
# Initialize the model
gb = GradientBoostingClassifier(
n_estimators=100, # Number of trees
learning_rate=0.1, # Learning rate
max_depth=3 # Maximum tree depth
)
# Fit the model
gb.fit(X_train, y_train)
# Make predictions
predictions = gb.predict(X_test)
probabilities = gb.predict_proba(X_test)Answer: Yes, there are some challenging scenarios:
-
Severe Class Imbalance
- Current Issue: May predict only majority class under default 0.5 cutoff
- Potential Solution: Implement class weights or resampling techniques
-
High-Dimensional Sparse Inputs
- Current Issue: Stump-based splits may be uninformative
- Potential Solution: Add feature importance-based selection
-
Noisy/Overlapping Classes
- Current Issue: Risk of overfitting
- Potential Solution: Implement early stopping with validation set
-
Missing Values
- Current Issue: No native handling
- Potential Solution: Add imputation strategies
-
Categorical Features
- Current Issue: Requires one-hot encoding
- Potential Solution: Add native categorical feature support
Given more time, we would prioritize:
- Implementing early stopping
- Adding class weights for imbalance
- Developing feature importance metrics
- Adding native categorical feature support
- Sudireddy Raghavender Reddy (A20554654)
- Chaitanya Durgesh Nynavarapu (A20561894)
- Purnachandra Reddy Peddasura (A20544751)
- Jeswanth Jayavarapu (A20547505)