Compare cross validation and test set results
At first sight the steps seem to be correct, nevertheless:

you did not tell how you split your dataset intro training and test sets, in case it has some influence in your final score values
you might be interested in the sklearn GridSearchCV option , with which you carry out cross validation similar to what you did but you do not need to manually refit the model on the whole train dataset, because you have the option with the refit parameter (choose the scoring metric considered so as to select the best model from the grid search cross-validation process already refit on the whole train dataset wothout splits), as follows:
Basically, the steps for your example could be:


split your dataset to leave some rows out for a final validation

apply grid search cross-validation on the rest of the data (your train set), something like:
dt_clf = DecisionTreeClassifier(random_state=0, class_weight=&quot;balanced&quot;) 
hiperparams_search_space = {'criterion': [&quot;gini&quot;, &quot;entropy&quot;], 'max_depth': [4,
5, 6, 8], 'min_samples_leaf': [2, 3, 5]} 
dec_tree_cross_val_clf = GridSearchCV(dt_clf, hiperparams_search_space, cv=10,
scoring=['accuracy', 'recall', 'precision', 'roc_auc'],
refit='recall',return_train_score=True, n_jobs=-1) 
dec_tree_cross_val_clf.fit(X_train, y_train)
where for each scoring metric, you would have train and test values across your k-folds in a dataframe via dec_tree_cross_val_clf.cv_results_:


use clf.best_estimator_ to make predictions on your validation set to calculate a final score metric:
dec_tree_cross_val_clf_best_est = dec_tree_cross_val_clf.best_estimator_