param-grid передает параметры в базовую функцию.потерял в kw_args - PullRequest
0 голосов
/ 02 июня 2018

Я здесь потерян.Надеюсь, что кто-то может пролить свет.

Я построил конвейер (sklearn pipe, точнее говоря, неуравновешенный конвейер )

Первый шагpipe - это FunctionSampler (imbalanced-learn 0.4.0dev, доступный только на Git-hub), который представляет собой оболочку API для пользовательской функции, определенной ниже на шаге № 3.Я хотел бы иметь возможность передавать диапазон параметров в лежащую в основе функции - это моя проблема здесь.

Затем я строю поиск в сетке с диапазоном для max_samples, но когда я подхожу, я получаю ошибку.

Я новичок в python - извиняюсь, если нет очевидного ответа, которого я не вижу.

Большое спасибо!

1 определить пользовательскую функцию

In [90]: def outlier_rejection(X, y, max_samples):
        ...:     model = IsolationForest(max_samples=max_samples, contamination=0.4, random_state=rng)
        ...:     model.fit(X)
        ...:     y_pred = model.predict(X)
        ...:     return X[y_pred ==1], y[y_pred == 1]
        ...:

2 построить конвейер

  pipe = make_pipeline(FunctionSampler(func=outlier_rejection, kw_args={'max_samples':1}), LogisticRegression(random_state=rng))

3 показать канал, который мне нужно передать max_samples в kw_args

Pipeline(memory=None,
             steps=[('functionsampler', FunctionSampler(accept_sparse=True,
                func=<function outlier_rejection at 0x000001173B3E9EA0>,
                kw_args={'max_samples': 1})), ('logisticregression', LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
                  intercept_scaling=1, max...ect at 0x0000011737DCA1B0>,
                  solver='liblinear', tol=0.0001, verbose=0, warm_start=False))])

4 построить поиск сетки

cv = GridSearchCV(pipe, param_grid={'logisticregression__C': [1., 10.], 'functionsampler__max_samples': [1, 10, 100]})

5подгони резюме и получи следующую ошибку

1 Ответ

0 голосов
/ 02 июня 2018

Первая проблема заключается в том, что вы пытаетесь передать аргумент max_samples в FunctionSampler(), но FunctionSampler() не имеет max_samples в качестве именованного аргумента.

Скорее, max_samples принадлежит как запись в аргументе kw_args для FunctionSampler().

Это говорит о том, что вместо этого вы должны передать что-то вроде

'functionsampler__kw_args': {'max_samples': [1, 10, 100]}

аргументу GridSearchCV param_grid (примечание: я не уверен, почему он называется params в вашемкод, аргумент либо позиционный, либо с именем param_grid в документах ).

Но ... вы не можете передать dict как значение в аргументе param_grid.Это приводит к ошибке:

ValueError: Значения параметра для параметра (functionsampler__kw_args) должны быть последовательностью (но не строкой) или np.ndarray.

лучшее решение, которое я могу придумать, - это обернуть FunctionSampler() в класс, который принимает отдельные key и values аргументы от param_grid (например, functionsamplerwrapper__key), а затем соединить их вместе как kw_args, диктующий FunctionSampler() ожидает.Примерно так:

from imblearn import FunctionSampler
from imblearn.pipeline import make_pipeline
from sklearn.ensemble import IsolationForest
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LogisticRegression


class FunctionSamplerWrapper(object):    
    def unwrap(self, key, values):
        return FunctionSampler(func=outlier_rejection, kw_args={key[0]: values})

pipe = make_pipeline(FunctionSamplerWrapper().unwrap(key = ['max_samples'], 
                                                     values = [1]), 
                     LogisticRegression(random_state=rng))

cv = GridSearchCV(pipe, 
                  [{'logisticregression__C': [1., 10.], 
                   'functionsamplerwrapper__key': ['max_samples'],
                   'functionsamplerwrapper__values': [1, 10, 100]}])

Примечание. Я только проверил, работает ли он без ошибок (но не работает), но я на самом деле не проверял его на данных, чтобы убедиться в правильности его функционирования.
Надеюсьэто помогает.

...