Hyperparameter tuning is essential for optimizing machine learning models. In this example, we’ll demonstrate how to use scikit-learn’s RandomizedSearchCV
for hyperparameter tuning of a VotingRegressor
, an ensemble model that combines multiple regression models to improve predictive performance.
Random search is a method for evaluating different combinations of model hyperparameters. Unlike grid search, it samples a fixed number of hyperparameter combinations from a specified distribution, making it more efficient when searching over a large hyperparameter space.
VotingRegressor
is an ensemble model that aggregates the predictions of multiple base regressors. Each base model contributes to the final prediction, allowing the ensemble to benefit from the strengths of its components. The key hyperparameters include the choice of base regressors and their respective hyperparameters, which need to be optimized for the best performance.
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split, RandomizedSearchCV
from sklearn.linear_model import LinearRegression
from sklearn.tree import DecisionTreeRegressor
from sklearn.neighbors import KNeighborsRegressor
from sklearn.ensemble import VotingRegressor
from scipy.stats import randint
# Generate synthetic regression dataset
X, y = make_regression(n_samples=100, n_features=10, noise=0.1, random_state=42)
# Split into train and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Define base regressors
reg1 = LinearRegression()
reg2 = DecisionTreeRegressor(random_state=42)
reg3 = KNeighborsRegressor()
# Define the VotingRegressor
voting_regressor = VotingRegressor(estimators=[('lr', reg1), ('dt', reg2), ('knn', reg3)])
# Define hyperparameter distribution
param_dist = {
'lr__fit_intercept': [True, False],
'dt__max_depth': randint(1, 10),
'knn__n_neighbors': randint(1, 20)
}
# Perform random search
random_search = RandomizedSearchCV(estimator=voting_regressor,
param_distributions=param_dist,
n_iter=50,
cv=5,
scoring='neg_mean_squared_error',
random_state=42)
random_search.fit(X_train, y_train)
# Report best score and parameters
print(f"Best score: {random_search.best_score_:.3f}")
print(f"Best parameters: {random_search.best_params_}")
# Evaluate on test set
best_model = random_search.best_estimator_
test_score = best_model.score(X_test, y_test)
print(f"Test set R^2 score: {test_score:.3f}")
Running the example gives an output like:
Best score: -4876.232
Best parameters: {'dt__max_depth': 3, 'knn__n_neighbors': 1, 'lr__fit_intercept': True}
Test set R^2 score: 0.846
The steps are as follows:
- Generate a synthetic regression dataset using scikit-learn’s
make_regression
function. - Split the dataset into train and test sets using
train_test_split
. - Define the
VotingRegressor
with a combination of different base regressors:LinearRegression
,DecisionTreeRegressor
, andKNeighborsRegressor
. - Specify the hyperparameter distributions for each base regressor within the ensemble.
- Conduct the random search with
RandomizedSearchCV
, setting the number of iterations to 100, using 5-fold cross-validation, and the negative mean squared error as the scoring metric. - Report the best cross-validation score and the best set of hyperparameters found by random search.
- Evaluate the performance of the best model on the test set and report the R^2 score.
By using RandomizedSearchCV
, we can efficiently explore different hyperparameter settings and find the combination that maximizes the model’s performance. This automated approach saves time and effort compared to manual hyperparameter tuning and helps ensure we select the best configuration for our VotingRegressor
model.