Как вы можете объединить.макет.патч GridSearchCV?

#python #scikit-learn #mocking #python-unittest

Вопрос:

Я пишу некоторые тестовые функции, используя самый простой пакет. Но по какой-то причине я не могу исправить GridSearchCV. Если я выполню такой код, как этот:

 import numpy as np
import pandas as pd
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import StratifiedKFold
from unittest import TestCase
from unittest.mock import patch


def grid():
    np.random.seed(1)
    x_train = pd.DataFrame(np.random.choice(['0', '1'], size=100, replace=True).reshape(100,))
    np.random.seed(3)
    y_train = np.random.choice(['0', '1'], size=100, replace=True).reshape(100,)

    stratified_cv_grid_search = GridSearchCV(
        estimator=RandomForestClassifier(random_state=1),
        param_grid={
            'n_estimators': [100],
            'max_depth': [None, 5],
            'min_samples_split': [2, 3],
            'min_samples_leaf': [2, 3],
        },
        cv=StratifiedKFold(2, shuffle=True, random_state=1),
        scoring='f1_macro'
    )
    print(GridSearchCV)
    print(pd.merge)
    print(stratified_cv_grid_search)
    # run cv
    stratified_cv_grid_search.fit(x_train, y_train)
    print(stratified_cv_grid_search)
    print('--- Best params and best score ---')
    print(stratified_cv_grid_search.best_params_)
        

class clfTest(TestCase):

    @patch("pandas.merge")
    @patch("sklearn.model_selection.GridSearchCV")
    @patch("sklearn.model_selection.StratifiedKFold")
    def test_clf(self, mock_kfold, mock_gridsearch, mock_merge):
            grid()
 

на выходе получается:

 <class 'sklearn.model_selection._search.GridSearchCV'>
<MagicMock name='merge' id='1948904870352'>
GridSearchCV(cv=StratifiedKFold(n_splits=2, random_state=1, shuffle=True),
             estimator=RandomForestClassifier(random_state=1),
             param_grid={'max_depth': [None, 5], 'min_samples_leaf': [2, 3],
                         'min_samples_split': [2, 3], 'n_estimators': [100]},
             scoring='f1_macro').
GridSearchCV(cv=StratifiedKFold(n_splits=2, random_state=1, shuffle=True),
             estimator=RandomForestClassifier(random_state=1),
             param_grid={'max_depth': [None, 5], 'min_samples_leaf': [2, 3],
                         'min_samples_split': [2, 3], 'n_estimators': [100]},
             scoring='f1_macro')
--- Best params and best score ---

Error
Traceback (most recent call last):
  File "C:Userslarwinkl.condaenvsuseenvlibunittestmock.py", line 1183, in patched
    return func(*args, **keywargs)
  File "C:UserslarwinklXCross TestingX-Crosstestsutilsfor stackexchange.py", line 44, in test_clf
    grid()
  File "C:UserslarwinklXCross TestingX-Crosstestsutilsfor stackexchange.py", line 33, in grid
    print(stratified_cv_grid_search.best_params_)
AttributeError: 'GridSearchCV' object has no attribute 'best_params_'

 

где мы видим, что pd.merge исправлен правильно и возвращен как MagicMock, в то время как с GridSearchCV ничего не происходит. Как я могу правильно издеваться над GridSearchCV и соответственно издеваться над такими атрибутами, как best_params?