Я создал собственный счетчик для функции GridSearchCV:
def mean_root_squared_error_func(y_true, y_pred):
return np.sqrt(mean_squared_error(y_true, y_pred))
Вот как я вызываю функцию в своем коде
scoring_grid={'r_squared': "r2",
'neg_mean_sqr_error': make_scorer(mean_root_squared_error_func, greater_is_better=False)
}
Хотя после запуска функции GridSearchCV и попытки чтобы выбрать лучший объект оценки, я получаю эту ошибку (с pickle или joblib функциями):
with open(os.path.join(os.getcwd(),filename), 'wb') as file:
joblib.dump(best_model_dictionary[list[0]], file)
PicklingError: Can't pickle <function mean_root_squared_error_func at 0x7f2efa224e18>: it's not found as __main__.mean_root_squared_error_func
Я читаю и документацию по маринованию, и некоторые подобные проблемы в StackOverflow, хотя мне не удалось обработать эту ошибку.
Редактировать 1 Обратите внимание, что "neg_root_mean_squared_error", найденный в scikit-learn docs , не поддерживается. Возвращает следующую ошибку:
ValueError: 'neg_root_mean_squared_error' is not a valid scoring value. Use sorted(sklearn.metrics.SCORERS.keys()) to get valid options.
Редактировать 2 После запроса на добавление дополнительного кода: функция, которая возвращает pipe_object, parameters_grid, сетку скоринга, которая будет использоваться GridSearchCV
def regressor_component_initialization(model_name):
"""
Create the components of:
- Pipeline object
- Hyperparameter grid,
- Scorint metrics
For the regression model specified
"""
if model_name=="RandomForest":
pipeline_object=Pipeline([
('random_forest_regressor', RandomForestRegressor(random_state=123))
])
pipe_params={
'random_forest_regressor__max_depth':[20, None],
'random_forest_regressor__max_features':['log2', None]
}
scoring_grid={'r_squared': "r2",
'neg_mean_sqr_error': make_scorer(mean_root_squared_error_func, greater_is_better=False)
}
elif model_name=="DecisionTree":
pipeline_object=Pipeline([
('decision_tree_regressor', DecisionTreeRegressor(random_state=123))
])
pipe_params={
'decision_tree_regressor__max_depth':[20, None],
'decision_tree_regressor__max_features':['log2', None]
}
scoring_grid={'r_squared': "r2",
'neg_mean_sqr_error': make_scorer(mean_root_squared_error_func, greater_is_better=False)
}
return pipeline_object, pipe_params, scoring_grid
Далее функция GridSearchCV:
def hyperparameter_tuning(method, model_object, param_grid, cv, scoring, refit, n_iter=1000, split_ratiο=0.2):
if method=="gridsearch":
search_object=GridSearchCV(model_object, param_grid=param_grid, cv = cv, verbose=1, n_jobs = -1, scoring=scoring, refit=refit, return_train_score=True)
return search_object, refit
Объект поиска затем устанавливается на X_train, y_train