CatBoost Grid search and random search
Last Updated :
12 Oct, 2023
Finding the best model and setting it up for optimum performance may be difficult in the realm of machine learning. Thankfully, methods like Grid Search and Random Search may be used to help. We shall clarify these techniques in this article, focusing on CatBoost, a potential gradient-boosting library. Building precise and effective machine learning models requires a grasp of fundamental search techniques, regardless of your level of experience as a data scientist.
CatBoost
Gradient boosting for categorical data is quickly and precisely implemented by CatBoost, a machine-learning package. By iteratively fitting the new learners to the residual errors of the old learners, the gradient-boosting approach combines several weak learners (such as decision trees) into strong learners. Without the requirement for human encoding or preprocessing, CatBoost can handle category features automatically. Finding the ideal values for the hyperparameters, such as the learning rate, the depth of the trees, the number of iterations, and so on, may be difficult when utilizing gradient boosting. These hyperparameters have an impact on the model’s efficiency, precision, training time, and memory requirements. As a result, it’s crucial to tune them methodically and properly.
Grid Search and Random Search
To determine the ideal set of hyperparameters for a machine learning model, researchers employ grid search and random search strategies. You may save time and effort by automating the hyperparameter tweaking procedure.
Grid Search
As the name implies, grid search entails defining a grid of hyperparameter values to search through. It is a methodical but computationally costly strategy since it thoroughly tests all potential combinations of hyperparameters inside the specified grid.
Key steps of Grid Search:
- Define a grid of hyperparameter values to explore.
- Train and evaluate the model for each combination of hyperparameters.
- Select the combination that performs the best.
Random Search
On the other side, Random Search employs a more random strategy. Finding useful hyperparameters using this method may be more effective than using Grid Search since it draws hyperparameters at random from predetermined distributions.
Key steps of Random Search:
- Specify the hyperparameter distributions (e.g., uniform or log-uniform) to sample from.
- Randomly sample combinations of hyperparameters.
- Train and evaluate the model for each sampled combination.
- Select the combination that performs the best.
Differences between Grid Search and Random Search
Systematic: Tries all combinations in the grid
|
Random: Samples combinations from predefined distributions
|
High (exponential with the number of hyperparameters)
|
Lower (linear with the number of iterations)
|
Smaller parameter spaces
|
Larger and complex parameter spaces
|
Limited exploration of parameter space
|
Broader exploration of parameter space
|
Using Grid Search and Random Search with CatBoost
We’ll use a simple classification job and the well-known “Breast Cancer Wisconsin (Diagnostic)” dataset to show the differences between Grid Search and Random Search for hyperparameter improving in CatBoost.
We’ll do hyperparameter tuning using both Grid Search and Random Search, weighing the benefits and drawbacks of each method. We will also assess the models and touch briefly on deployment issues.
Step 1: Import Necessary Libraries and Load the Dataset
Python
import pandas as pd
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from catboost import CatBoostClassifier
from sklearn.model_selection import GridSearchCV, RandomizedSearchCV
from sklearn.metrics import classification_report
from sklearn.metrics import make_scorer, f1_score
data = load_breast_cancer()
X = pd.DataFrame(data.data, columns = data.feature_names)
y = pd.Series(data.target)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2 , random_state = 42 )
|
Step 2: Perform Grid Search for Hyperparameter Tuning
Python
model = CatBoostClassifier(loss_function = 'Logloss' , random_state = 42 )
param_grid = {
'iterations' : [ 100 , 200 ],
'learning_rate' : [ 0.01 , 0.1 ],
'depth' : [ 3 , 6 ]
}
scorer = make_scorer(f1_score, average = 'weighted' )
grid_search = GridSearchCV(model, param_grid, cv = 5 , scoring = scorer, n_jobs = - 1 )
grid_search.fit(X_train, y_train)
print ( "Grid Search - Best Hyperparameters:" , grid_search.best_params_)
|
Output :
170: learn: 0.0093395 total: 432ms remaining: 73.3ms
171: learn: 0.0093290 total: 434ms remaining: 70.7ms
172: learn: 0.0092868 total: 437ms remaining: 68.2ms
173: learn: 0.0091540 total: 439ms remaining: 65.6ms
174: learn: 0.0090309 total: 441ms remaining: 63ms
175: learn: 0.0090234 total: 444ms remaining: 60.5ms
176: learn: 0.0089493 total: 446ms remaining: 58ms
177: learn: 0.0089408 total: 448ms remaining: 55.4ms
178: learn: 0.0089310 total: 451ms remaining: 52.9ms
179: learn: 0.0087964 total: 453ms remaining: 50.4ms
180: learn: 0.0087965 total: 456ms remaining: 47.9ms
181: learn: 0.0087429 total: 458ms remaining: 45.3ms
182: learn: 0.0087357 total: 461ms remaining: 42.8ms
183: learn: 0.0087141 total: 463ms remaining: 40.3ms
184: learn: 0.0085773 total: 465ms remaining: 37.7ms
185: learn: 0.0085404 total: 468ms remaining: 35.2ms
186: learn: 0.0084845 total: 470ms remaining: 32.7ms
187: learn: 0.0082686 total: 473ms remaining: 30.2ms
188: learn: 0.0082414 total: 475ms remaining: 27.7ms
189: learn: 0.0081177 total: 478ms remaining: 25.1ms
190: learn: 0.0080564 total: 480ms remaining: 22.6ms
191: learn: 0.0078925 total: 483ms remaining: 20.1ms
192: learn: 0.0078671 total: 485ms remaining: 17.6ms
193: learn: 0.0078671 total: 487ms remaining: 15.1ms
194: learn: 0.0078669 total: 489ms remaining: 12.5ms
195: learn: 0.0076908 total: 492ms remaining: 10ms
196: learn: 0.0075966 total: 494ms remaining: 7.52ms
197: learn: 0.0075902 total: 496ms remaining: 5.01ms
198: learn: 0.0075845 total: 499ms remaining: 2.5ms
199: learn: 0.0075563 total: 501ms remaining: 0us
Grid Search - Best Hyperparameters: {'depth': 3, 'iterations': 200, 'learning_rate': 0.1}
Step 3: Perform Random Search for Hyperparameter Tuning
Python
model = CatBoostClassifier(loss_function = 'Logloss' , random_state = 42 )
param_dist = {
'iterations' : [ 100 , 200 ],
'learning_rate' : [ 0.01 , 0.1 ],
'depth' : [ 3 , 6 ]
}
random_search = RandomizedSearchCV(model, param_distributions = param_dist, n_iter = 10 , cv = 5 , scoring = scorer, n_jobs = - 1 , random_state = 42 )
random_search.fit(X_train, y_train)
print ( "Random Search - Best Hyperparameters:" , random_search.best_params_)
|
Output:
170: learn: 0.0093395 total: 414ms remaining: 70.3ms
171: learn: 0.0093290 total: 417ms remaining: 67.8ms
172: learn: 0.0092868 total: 419ms remaining: 65.4ms
173: learn: 0.0091540 total: 421ms remaining: 63ms
174: learn: 0.0090309 total: 424ms remaining: 60.5ms
175: learn: 0.0090234 total: 426ms remaining: 58.1ms
176: learn: 0.0089493 total: 428ms remaining: 55.6ms
177: learn: 0.0089408 total: 431ms remaining: 53.2ms
178: learn: 0.0089310 total: 433ms remaining: 50.8ms
179: learn: 0.0087964 total: 435ms remaining: 48.3ms
180: learn: 0.0087965 total: 437ms remaining: 45.9ms
181: learn: 0.0087429 total: 440ms remaining: 43.5ms
182: learn: 0.0087357 total: 442ms remaining: 41.1ms
183: learn: 0.0087141 total: 444ms remaining: 38.6ms
184: learn: 0.0085773 total: 446ms remaining: 36.2ms
185: learn: 0.0085404 total: 449ms remaining: 33.8ms
186: learn: 0.0084845 total: 451ms remaining: 31.4ms
187: learn: 0.0082686 total: 453ms remaining: 28.9ms
188: learn: 0.0082414 total: 456ms remaining: 26.5ms
189: learn: 0.0081177 total: 458ms remaining: 24.1ms
190: learn: 0.0080564 total: 460ms remaining: 21.7ms
191: learn: 0.0078925 total: 463ms remaining: 19.3ms
192: learn: 0.0078671 total: 465ms remaining: 16.9ms
193: learn: 0.0078671 total: 467ms remaining: 14.4ms
194: learn: 0.0078669 total: 469ms remaining: 12ms
195: learn: 0.0076908 total: 472ms remaining: 9.62ms
196: learn: 0.0075966 total: 474ms remaining: 7.22ms
197: learn: 0.0075902 total: 476ms remaining: 4.81ms
198: learn: 0.0075845 total: 478ms remaining: 2.4ms
199: learn: 0.0075563 total: 481ms remaining: 0us
Random Search - Best Hyperparameters: {'learning_rate': 0.1, 'iterations': 200, 'depth': 3}
Step 4: Model Evaluation
Now, we can evaluate the models using the best hyperparameters found by each method.
Python
grid_search_model = grid_search.best_estimator_
y_pred_grid = grid_search_model.predict(X_test)
print ( "Grid Search - Classification Report:" )
print (classification_report(y_test, y_pred_grid))
|
Output:
Grid Search - Classification Report:
precision recall f1-score support
0 0.98 0.95 0.96 43
1 0.97 0.99 0.98 71
accuracy 0.97 114
macro avg 0.97 0.97 0.97 114
weighted avg 0.97 0.97 0.97 114
Now we will check the classification report for the Random Search Model.
Python3
random_search_model = random_search.best_estimator_
y_pred_random = random_search_model.predict(X_test)
print ( "Random Search - Classification Report:" )
print (classification_report(y_test, y_pred_random))
|
Output:
Random Search - Classification Report:
precision recall f1-score support
0 0.98 0.95 0.96 43
1 0.97 0.99 0.98 71
accuracy 0.97 114
macro avg 0.97 0.97 0.97 114
weighted avg 0.97 0.97 0.97 114
Step 5: Deployment
Deployment considerations depend on your specific project requirements. You can save the best-tuned model to a file and load it for making predictions on new data. To deploy and save the best model obtained after hyperparameter tuning, you can use the following code:
Python
import joblib
best_model = grid_search.best_estimator_
model_filename = "best_catboost_model.joblib"
joblib.dump(best_model, model_filename)
loaded_model = joblib.load(model_filename)
y_pred_loaded = loaded_model.predict(X_test)
print ( "Loaded Model - Classification Report:" )
print (classification_report(y_test, y_pred_loaded))
|
Output:
Loaded Model - Classification Report:
precision recall f1-score support
0 0.98 0.95 0.96 43
1 0.97 0.99 0.98 71
accuracy 0.97 114
macro avg 0.97 0.97 0.97 114
weighted avg 0.97 0.97 0.97 114
Conclusion
In this article, we explored Grid Search and Random Search for hyperparameter tuning in CatBoost models. We used these methods on a real dataset to highlight their importance in improving model performance. We also covered model deployment, demonstrating how to keep the best-tuned CatBoost model for usage in real-world applications. You may improve the precision and potency of your CatBoost models in a variety of classification problems by becoming an expert at these techniques.
Share your thoughts in the comments
Please Login to comment...