Hyperparameter tuning (GridSearchCV) in ML Python - ML Experiment: Train & Evaluate
from sklearn.datasets import load_iris from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import GridSearchCV, train_test_split from sklearn.metrics import accuracy_score # Load data iris = load_iris() X, y = iris.data, iris.target # Split data X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42) # Define model model = DecisionTreeClassifier(random_state=42) # Define hyperparameters grid param_grid = { 'max_depth': [2, 3, 4, 5, None], 'min_samples_split': [2, 4, 6, 8] } # Setup GridSearchCV grid_search = GridSearchCV(model, param_grid, cv=5, scoring='accuracy') # Fit GridSearchCV grid_search.fit(X_train, y_train) # Best model best_model = grid_search.best_estimator_ # Predictions train_preds = best_model.predict(X_train) val_preds = best_model.predict(X_val) # Metrics train_acc = accuracy_score(y_train, train_preds) * 100 val_acc = accuracy_score(y_val, val_preds) * 100 print(f"Best hyperparameters: {grid_search.best_params_}") print(f"Training accuracy: {train_acc:.2f}%") print(f"Validation accuracy: {val_acc:.2f}%")
Before tuning: Training accuracy was 100%, validation accuracy was 78%. The model memorized training data but did not generalize well.
After tuning: Training accuracy dropped to 92.5%, validation accuracy improved to 87.5%. The model generalizes better with less overfitting.
Practice
What is the main purpose of using GridSearchCV in machine learning?
Solution
Step 1: Understand what GridSearchCV does
GridSearchCV tries different hyperparameter combinations to find the best settings for a model.Step 2: Compare options with GridSearchCV's purpose
Only To find the best combination of hyperparameters automatically describes this automatic search for best hyperparameters.Final Answer:
To find the best combination of hyperparameters automatically -> Option BQuick Check:
GridSearchCV = best hyperparameters [OK]
- Confusing GridSearchCV with data splitting
- Thinking it visualizes predictions
- Assuming it reduces dataset size
Which of the following is the correct way to import GridSearchCV from sklearn?
Solution
Step 1: Recall the correct sklearn module for GridSearchCV
GridSearchCV is in themodel_selectionmodule of sklearn.Step 2: Match the correct import syntax
from sklearn.model_selection import GridSearchCV uses the correct module and syntax for import.Final Answer:
from sklearn.model_selection import GridSearchCV -> Option CQuick Check:
Correct import = from sklearn.model_selection import GridSearchCV [OK]
- Using deprecated sklearn.grid_search module
- Wrong import syntax like 'import GridSearchCV from sklearn'
- Assuming a nonexistent sklearn.tuning module
What will be the output of the following code snippet?
from sklearn.datasets import load_iris
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV
iris = load_iris()
X, y = iris.data, iris.target
param_grid = {'kernel': ['linear', 'rbf'], 'C': [1, 10]}
svc = SVC()
grid = GridSearchCV(svc, param_grid, cv=3)
grid.fit(X, y)
print(grid.best_params_)Solution
Step 1: Understand GridSearchCV output
GridSearchCV'sbest_params_attribute returns the best hyperparameters found after testing all combinations.Step 2: Analyze the code snippet
The code runs GridSearchCV with kernel and C values, then prints the best combination as a dictionary.Final Answer:
A dictionary with best kernel and C values found by cross-validation -> Option AQuick Check:
grid.best_params_ = best hyperparameters dict [OK]
- Expecting fixed values instead of dynamic best params
- Thinking cv parameter is missing (it is present)
- Confusing output with training scores
Identify the error in this GridSearchCV usage:
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV
param_grid = {'C': [0.1, 1, 10]}
svc = SVC()
grid = GridSearchCV(svc, param_grid)
grid.fit(X_train, y_train)
print(grid.best_score_)Assuming X_train and y_train are defined.
Solution
Step 1: Check default behavior of GridSearchCV
Ifcvis not given, GridSearchCV uses default 5-fold cross-validation.Step 2: Verify param_grid and SVC usage
Parameter grid keys like 'C' are correct; kernel is optional with default 'rbf'.Final Answer:
No error; code runs correctly and prints best score -> Option DQuick Check:
Default cv=5, param_grid keys correct [OK]
- Assuming cv parameter is mandatory
- Thinking param_grid keys need double underscores
- Believing kernel must be in param_grid
You want to tune a RandomForestClassifier using GridSearchCV. You want to try n_estimators values 50, 100 and max_depth values 5, 10. Which code snippet correctly sets up the grid search?
Solution
Step 1: Define param_grid correctly for RandomForestClassifier
Use keys as hyperparameter names with list of values: {'n_estimators': [50, 100], 'max_depth': [5, 10]}.Step 2: Setup GridSearchCV with valid cv parameter
The correct snippet initializes GridSearchCV with the proper param_grid using lists and a valid integer cv value (e.g., cv=4). Distractors include invalid cv values like strings, incorrect parameter key prefixes, and non-list value syntax like 'or'.Final Answer:
param_grid = {'n_estimators': [50, 100], 'max_depth': [5, 10]} rf = RandomForestClassifier() grid = GridSearchCV(rf, param_grid, cv=4) -> Option AQuick Check:
Correct param_grid and valid cv = param_grid = {'n_estimators': [50, 100], 'max_depth': [5, 10]} rf = RandomForestClassifier() grid = GridSearchCV(rf, param_grid, cv=4) [OK]
- Adding model name prefix to param_grid keys
- Using 'or' instead of list for values
- Setting invalid cv values like strings
Ready to prove it?
Pass the test and this pattern moves unknown
