Передача результатов GridSearchCV объекту конвейера Imbalanced-Learn - PullRequest
1 голос
/ 28 июня 2019

Забавная проблема здесь - у меня есть GridSearchCV результаты, которые после выбора вишни из атрибута grid_search_cv.results_ фиксируются следующим образом:

Input: pd.DataFrame(grid_clf_rf.cv_results_).iloc[4966]['params']

Output: {'rf__max_depth': 40, 'rf__max_features': 2, 'rf__n_estimators': 310}

Теперь, как я понимаю, объект Pipeline пакета Imbalanced Learn имеет видобертка вокруг конвейера SciKit-Learn, и он должен принимать параметр **fit_params в своем методе .fit() следующим образом:

clf = BalancedRandomForestClassifier(random_state = random_state, 
                                 n_jobs = n_jobs)

pipeline = Pipeline([('nt', nt), ('rf', clf)])

pipeline.fit(X_train, y_train, **pd.DataFrame(grid_clf_rf.cv_results_).iloc[4966]['params'])

Однако, когда я выполняю вышеприведенное выражение, я получаю следующий результат:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-64-a26424dc8038> in <module>
      4 pipeline = Pipeline([('nt', nt), ('rf', clf)])
      5 
----> 6 pipeline.fit(X_train, y_train, **pd.DataFrame(grid_clf_rf.cv_results_).iloc[4966]['params'])
      7 
      8 print_scores(pipeline, X_train, y_train, X_test, y_test)

/opt/conda/lib/python3.7/site-packages/imblearn/pipeline.py in fit(self, X, y, **fit_params)
    237         Xt, yt, fit_params = self._fit(X, y, **fit_params)
    238         if self._final_estimator is not None:
--> 239             self._final_estimator.fit(Xt, yt, **fit_params)
    240         return self
    241 

TypeError: fit() got an unexpected keyword argument 'max_features'

Есть идеи, что я делаю не так?

Ответы [ 2 ]

1 голос
/ 28 июня 2019

Допустим, вы придумали набор гиперпараметров, который выглядит следующим образом

hyper_params=  {'rf__max_depth': 40, 'rf__max_features': 2, 'rf__n_estimators': 310}

Как упомянуто @ Parthasarathy Subburaj, это не fit_params.Мы можем установить эти параметры для классификатора внутри конвейера, используя .set_params() option

from imblearn.ensemble import BalancedRandomForestClassifier
from sklearn.datasets import make_classification
from imblearn.pipeline import Pipeline

X, y = make_classification(n_samples=1000, n_classes=3,
                           n_informative=4, weights=[0.2, 0.3, 0.5],
                           random_state=0)

clf = BalancedRandomForestClassifier(random_state=0)

pipeline = Pipeline([ ('rf', clf)])

hyper_params=  {'rf__max_depth': 40, 'rf__max_features': 2, 'rf__n_estimators': 310}
pipeline.set_params(**hyper_params)

pipeline.fit(X,y)

#
Pipeline(memory=None,
         steps=[('rf',
                 BalancedRandomForestClassifier(bootstrap=True,
                                                class_weight=None,
                                                criterion='gini', max_depth=40,
                                                max_features=2,
                                                max_leaf_nodes=None,
                                                min_impurity_decrease=0.0,
                                                min_samples_leaf=2,
                                                min_samples_split=2,
                                                min_weight_fraction_leaf=0.0,
                                                n_estimators=310, n_jobs=1,
                                                oob_score=False, random_state=0,
                                                replacement=False,
                                                sampling_strategy='auto',
                                                verbose=0, warm_start=False))],
         verbose=False)
1 голос
/ 28 июня 2019

Почему вы вводите в фрейм данных, содержащий параметры для построения вашей модели, в ваш метод .fit(), он просто принимает два аргумента: X и y.Вам нужно передать ваши параметры модели конструктору BalancedRandomForestClassifier.Так как имена ваших параметров не совпадают с именами, которые BalancedRandomForestClassifier требует, вам необходимо ввести их вручную следующим образом:

clf = BalancedRandomForestClassifier(max_depth = 40, max_features = 2, n_estimators = 310, random_state = random_state, n_jobs = n_jobs)

Надеюсь, это поможет!

...