PicklingError: Не могу засолить : он не найден как __main __. mean_root_squared_error_func - PullRequest
0 голосов
/ 04 мая 2020

Я создал собственный счетчик для функции 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

1 Ответ

0 голосов
/ 04 мая 2020

Укроп - это то, что я использую для сериализации практически всего. Он должен уметь обрабатывать странные функции и лямбда-функции.

import dill
with open(os.path.join(os.getcwd(),filename), 'wb') as file:
    dill.dump(best_model_dictionary[list[0]], file)
...