File size: 5,377 Bytes
ebc7916 402980d ebc7916 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | ---
tags:
- machine-learning
- classification
- logistic-regression
- scikit-learn
- breast-cancer
datasets:
- sklearn.datasets.load_breast_cancer
license: mit
language: en
---
# Breast Cancer Classification Models
## Overview
This repository contains a collection of logistic regression models trained on the **Breast Cancer Wisconsin dataset** for binary classification of tumors (malignant vs. benign). The models were developed using **scikit-learn** as part of a machine learning assignment to explore different optimization techniques and regularization methods.
## Models
The following models and preprocessing objects are included in this repository:
- **scaler.joblib**: A `StandardScaler` used for preprocessing features (required for non-pipeline models).
- **batch_model.joblib**: Logistic Regression trained with Batch Gradient Descent (using the `lbfgs` solver).
- **sgd_model.joblib**: Logistic Regression trained with Stochastic Gradient Descent (SGD).
- **mini_batch_model.joblib**: Logistic Regression trained with Mini-batch Gradient Descent (approximated using SGD).
- **poly_pipeline.joblib**: A pipeline combining `PolynomialFeatures` (degree=2), `StandardScaler`, and Logistic Regression.
- **l2_model.joblib**: Logistic Regression with L2 (Ridge) regularization.
- **es_model.joblib**: Logistic Regression with Early Stopping.
## Dataset
- **Source**: Breast Cancer Wisconsin dataset, accessed via `sklearn.datasets.load_breast_cancer`.
- **Features**: 30 numerical features (e.g., mean radius, mean texture, mean perimeter).
- **Target**: Binary classification (0 = malignant, 1 = benign).
- **Size**: 569 samples.
- **Split**: 80% training (455 samples), 20% validation (114 samples).
- **Preprocessing**: Features were standardized using `StandardScaler` (except for the `poly_pipeline`, which handles scaling internally).
## Training Details
- **Library**: `scikit-learn`.
- **Optimization Techniques**:
- Batch Gradient Descent: Used `lbfgs` solver with `max_iter=100`.
- Stochastic Gradient Descent: Used `SGDClassifier` with `loss='log_loss'`, constant learning rate (`eta0=0.01`), and `max_iter=100`.
- Mini-batch Gradient Descent: Approximated using `SGDClassifier` with shuffling enabled.
- Polynomial Features: Added degree-2 polynomial features, followed by scaling and logistic regression.
- L2 Regularization: Applied with `C=1.0` and `max_iter=1000`.
- Early Stopping: Used `SGDClassifier` with `early_stopping=True`, validation fraction of 0.1, and `n_iter_no_change=10`.
- **Random State**: Set to 42 for reproducibility across all models.
## Evaluation Metrics
The models were evaluated on the validation set (114 samples) using accuracy and confusion matrices. Below are the accuracy scores:
| Model | Accuracy |
|-----------------------|-----------|
| Batch GD | 97.37% |
| SGD | 98.25% |
| Mini-batch GD | 98.25% |
| Polynomial GD | 97.37% |
| Early Stopping | 99.12% |
## Usage
### Installation
Ensure you have `scikit-learn` and `joblib` installed:
```python
pip install scikit-learn joblib
```
**Loading and Using Non-Pipeline Models**
For models like batch_model, sgd_model, mini_batch_model, l2_model, and es_model, you need the scaler for preprocessing:
```python
import joblib
import numpy as np
# Load the scaler and model
scaler = joblib.load('scaler.joblib')
model = joblib.load('batch_model.joblib') # Replace with desired model
# Example: Preprocess new data (replace with your data)
X_new = np.array([[17.99, 10.38, 122.80, ...]]) # 30 features
X_new_scaled = scaler.transform(X_new)
# Make predictions
predictions = model.predict(X_new_scaled)
print(predictions) # 0 (malignant) or 1 (benign)
```
**Loading and Using the Pipeline Model**
- The poly_pipeline includes its own preprocessing steps, so the scaler is not needed:
```python
import joblib
import numpy as np
# Load the pipeline
poly_pipeline = joblib.load('poly_pipeline.joblib')
# Example: New data (replace with your data)
X_new = np.array([[17.99, 10.38, 122.80, ...]]) # 30 features
# Make predictions directly
predictions = poly_pipeline.predict(X_new)
print(predictions) # 0 (malignant) or 1 (benign)
```
## Intended Use
- These models are intended for educational purposes, demonstrating the application of logistic regression with various optimization techniques on a medical dataset. They can be used for:
- Classifying breast tumors as malignant or benign based on 30 features.
- Comparing the performance of different gradient descent methods and regularization techniques.
## Limitations
- **Dataset Size:** The dataset is relatively small (569 samples), which may limit model generalization.
- **Feature Engineering:** Only polynomial features (degree=2) were explored; other feature engineering techniques might improve performance.
- **Model Complexity:** Logistic regression is a linear model and may not capture complex patterns as well as non-linear models (e.g., SVM, neural networks).
- **Evaluation:** Performance was evaluated on a single validation split; cross-validation could provide a more robust assessment.
## License
- This project is licensed under the MIT License.
## Author
- Created by Arsal Mairaj on April 11, 2025.
For questions or contributions, please open an issue in the repository. |