Skip to content

Commit 9f95273

Browse files
committed
feat(website): update for v0.3.0 with new algorithms
- Update version references from 0.2.0 to 0.3.0 - Add 6 new trainers to trainers page (LightGBM, CatBoost, K-Means, DBSCAN, Isolation Forest, One-Class SVM) - Organize trainers by category with section headers - Update stats: 7+ ML Models -> 15+ ML Models - Update features description to include new algorithms - Update sidebar with trainer subsections - Update fallback release data for v0.3.0 - Add v0.3.0 to version selector
1 parent 70ae0ea commit 9f95273

12 files changed

Lines changed: 173 additions & 92 deletions

File tree

CHANGELOG.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
88
## [0.3.0] - 2025-12-14
99

1010
### Added
11+
1112
- **Gradient Boosting Algorithms**
13+
1214
- LightGBM trainer with classification/regression support
1315
- CatBoost trainer with automatic categorical feature handling
1416
- Early stopping, feature importance, and native model exports
1517

1618
- **Clustering Algorithms**
19+
1720
- K-Means trainer with silhouette, calinski-harabasz, davies-bouldin metrics
1821
- DBSCAN trainer with automatic noise detection
1922
- Optimal cluster number finder (elbow method) for K-Means
2023
- Optimal eps finder for DBSCAN
2124

2225
- **Anomaly Detection Algorithms**
26+
2327
- Isolation Forest trainer for efficient outlier detection
2428
- One-Class SVM trainer with RBF kernel support
2529
- Anomaly scoring and threshold tuning capabilities
@@ -31,6 +35,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
3135
- Added anomaly/isolation_forest.json and anomaly/one_class_svm.json
3236

3337
### Changed
38+
3439
- Updated trainer registry with 6 new algorithm types
3540
- Extended model type support: classification, regression, clustering, anomaly_detection
3641

@@ -39,7 +44,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
3944
## [0.2.0] - 2025-12-07
4045

4146
### Added
47+
4248
- **Documentation**
49+
4350
- Created comprehensive `docs/` folder with getting-started guide, installation instructions
4451
- Added `examples/` folder with sample configs for all model types (RF, XGB, Logistic, DNN)
4552
- Added example tuning configurations for hyperparameter optimization
@@ -54,59 +61,70 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
5461
- Added shared fixtures and configuration in `conftest.py`
5562

5663
### Changed
64+
5765
- Cleaned up project structure for production deployment
5866
- Updated `.gitignore` to exclude generated artifacts properly
5967
- Improved GridSearchTuner to handle `n_trials` parameter gracefully
6068

6169
### Removed
70+
6271
- Hotel-specific datasets and configurations (moved to generic examples)
6372
- Test experiment artifacts from repository
6473
- Empty `scripts/` directory
6574

6675
### Fixed
76+
6777
- GridSearchTuner now properly filters out unsupported `n_trials` parameter
6878
- Configuration files now use generic `data/your_data.csv` paths
6979

7080
## [0.1.0] - 2025-12-03
7181

7282
### Added
83+
7384
- **CLI Training Pipeline**
85+
7486
- Train ML models (Logistic Regression, SVM, Random Forest, XGBoost)
7587
- Train DL models (TensorFlow DNN, CNN, RNN/LSTM/GRU)
7688
- Configuration-driven training via JSON/YAML files
7789
- Parameter overrides from command line
7890

7991
- **Hyperparameter Tuning**
92+
8093
- Grid Search for exhaustive parameter search
8194
- Random Search for large parameter spaces
8295
- Bayesian Optimization via Optuna for intelligent search
8396
- Cross-validation support
8497
- Auto-train best model after tuning
8598

8699
- **Model Explainability**
100+
87101
- SHAP (SHapley Additive exPlanations) for global/local explanations
88102
- LIME (Local Interpretable Model-agnostic Explanations)
89103
- Feature importance visualization
90104
- Instance-level explanations
91105

92106
- **Data Preprocessing Pipeline**
107+
93108
- Scaling: StandardScaler, MinMaxScaler, RobustScaler
94109
- Normalization: L1, L2, Max norm
95110
- Encoding: LabelEncoder, OneHotEncoder, OrdinalEncoder
96111
- Feature Selection: SelectKBest, RFE, VarianceThreshold
97112
- Pipeline support for chaining preprocessors
98113

99114
- **Experiment Tracking**
115+
100116
- Automatic experiment logging
101117
- Run comparison and filtering
102118
- Export to CSV
103119
- Mini-MLflow style tracking
104120

105121
- **Model Export**
122+
106123
- ML models: Pickle, Joblib, ONNX
107124
- DL models: SavedModel, H5
108125

109126
- **Interactive Terminal UI (TUI)**
127+
110128
- Train models with guided interface
111129
- Evaluate saved models
112130
- Browse experiment history
@@ -118,6 +136,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
118136
- Easy extension for custom models
119137

120138
### Technical Details
139+
121140
- Python 3.8+ support
122141
- Type hints throughout codebase
123142
- Rich CLI output with colors and tables

mlcli/trainers/anomaly/isolation_forest_trainer.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,7 @@ def train(
143143
self.is_trained = True
144144

145145
logger.info(
146-
f"Training complete. Detected {n_anomalies} anomalies "
147-
f"({anomaly_ratio:.2%} of data)"
146+
f"Training complete. Detected {n_anomalies} anomalies " f"({anomaly_ratio:.2%} of data)"
148147
)
149148

150149
return self.training_history
@@ -189,9 +188,7 @@ def _compute_detection_metrics(
189188

190189
return metrics
191190

192-
def evaluate(
193-
self, X_test: np.ndarray, y_test: np.ndarray = None
194-
) -> Dict[str, float]:
191+
def evaluate(self, X_test: np.ndarray, y_test: np.ndarray = None) -> Dict[str, float]:
195192
"""
196193
Evaluate anomaly detection on test data.
197194

mlcli/trainers/anomaly/one_class_svm_trainer.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -190,9 +190,7 @@ def _compute_detection_metrics(
190190

191191
return metrics
192192

193-
def evaluate(
194-
self, X_test: np.ndarray, y_test: np.ndarray = None
195-
) -> Dict[str, float]:
193+
def evaluate(self, X_test: np.ndarray, y_test: np.ndarray = None) -> Dict[str, float]:
196194
"""
197195
Evaluate anomaly detection on test data.
198196

mlcli/trainers/catboost_trainer.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -227,9 +227,7 @@ def get_feature_importance(self) -> Dict[str, np.ndarray]:
227227
"prediction_values_change": self.model.get_feature_importance(
228228
type="PredictionValuesChange"
229229
),
230-
"loss_function_change": self.model.get_feature_importance(
231-
type="LossFunctionChange"
232-
),
230+
"loss_function_change": self.model.get_feature_importance(type="LossFunctionChange"),
233231
}
234232

235233
def save(self, save_dir: Path, formats: List[str]) -> Dict[str, Path]:

mlcli/trainers/clustering/dbscan_trainer.py

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -120,9 +120,7 @@ def train(
120120

121121
self.is_trained = True
122122

123-
logger.info(
124-
f"Training complete. Found {n_clusters} clusters and {n_noise} noise points"
125-
)
123+
logger.info(f"Training complete. Found {n_clusters} clusters and {n_noise} noise points")
126124
if train_metrics.get("silhouette") is not None:
127125
logger.info(f"Silhouette score: {train_metrics['silhouette']:.4f}")
128126

@@ -139,14 +137,9 @@ def _get_cluster_sizes(self, labels: np.ndarray) -> Dict[str, int]:
139137
Dictionary mapping cluster id to size
140138
"""
141139
unique, counts = np.unique(labels, return_counts=True)
142-
return {
143-
f"cluster_{int(k)}" if k != -1 else "noise": int(v)
144-
for k, v in zip(unique, counts)
145-
}
140+
return {f"cluster_{int(k)}" if k != -1 else "noise": int(v) for k, v in zip(unique, counts)}
146141

147-
def _compute_clustering_metrics(
148-
self, X: np.ndarray, labels: np.ndarray
149-
) -> Dict[str, float]:
142+
def _compute_clustering_metrics(self, X: np.ndarray, labels: np.ndarray) -> Dict[str, float]:
150143
"""
151144
Compute clustering evaluation metrics.
152145
@@ -171,9 +164,7 @@ def _compute_clustering_metrics(
171164
metrics["calinski_harabasz"] = float(
172165
calinski_harabasz_score(X_filtered, labels_filtered)
173166
)
174-
metrics["davies_bouldin"] = float(
175-
davies_bouldin_score(X_filtered, labels_filtered)
176-
)
167+
metrics["davies_bouldin"] = float(davies_bouldin_score(X_filtered, labels_filtered))
177168
else:
178169
metrics["silhouette"] = None
179170
metrics["calinski_harabasz"] = None
@@ -272,9 +263,7 @@ def fit_predict(self, X: np.ndarray) -> np.ndarray:
272263
self.train(X)
273264
return self._labels
274265

275-
def find_optimal_eps(
276-
self, X: np.ndarray, k: int = None, plot: bool = False
277-
) -> float:
266+
def find_optimal_eps(self, X: np.ndarray, k: int = None, plot: bool = False) -> float:
278267
"""
279268
Find optimal eps using k-distance graph method.
280269

mlcli/trainers/clustering/kmeans_trainer.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,7 @@ def __init__(self, config: Optional[Dict[str, Any]] = None):
5757
default_params = self.get_default_params()
5858
self.model_params = {**default_params, **params}
5959

60-
logger.info(
61-
f"Initialized KMeansTrainer with n_clusters={self.model_params['n_clusters']}"
62-
)
60+
logger.info(f"Initialized KMeansTrainer with n_clusters={self.model_params['n_clusters']}")
6361

6462
def train(
6563
self,
@@ -121,9 +119,7 @@ def train(
121119

122120
return self.training_history
123121

124-
def _compute_clustering_metrics(
125-
self, X: np.ndarray, labels: np.ndarray
126-
) -> Dict[str, float]:
122+
def _compute_clustering_metrics(self, X: np.ndarray, labels: np.ndarray) -> Dict[str, float]:
127123
"""
128124
Compute clustering evaluation metrics.
129125
@@ -227,9 +223,7 @@ def get_cluster_centers(self) -> np.ndarray:
227223

228224
return self.model.cluster_centers_
229225

230-
def find_optimal_k(
231-
self, X: np.ndarray, k_range: range = range(2, 11)
232-
) -> Dict[str, Any]:
226+
def find_optimal_k(self, X: np.ndarray, k_range: range = range(2, 11)) -> Dict[str, Any]:
233227
"""
234228
Find optimal number of clusters using elbow method and silhouette analysis.
235229

website/src/app/about/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ const values = [
1919
icon: Target,
2020
title: 'Accurate Results',
2121
description:
22-
'Built on proven ML libraries like scikit-learn, XGBoost, LightGBM, and TensorFlow.',
22+
'Built on proven ML libraries like scikit-learn, XGBoost, LightGBM, CatBoost, and TensorFlow.',
2323
},
2424
{
2525
icon: Users,

website/src/app/docs/quickstart/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export default function QuickstartPage() {
2727
<p>Verify the installation:</p>
2828
<CodeBlock
2929
code={`mlcli --version
30-
# mlcli v0.2.0`}
30+
# mlcli v0.3.0`}
3131
language="bash"
3232
/>
3333

0 commit comments

Comments
 (0)