Передача словаря в классификатор sklearn с функциями base_estimator - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь передать словарь в классификатор sklearn для установки его параметров, но я также хотел бы установить base_estimator функции, например:

>>> from sklearn.ensemble import AdaBoostClassifier
>>> x = {'n_estimators': 200}
>>> clf = AdaBoostClassifier(**x)
>>> clf
AdaBoostClassifier(algorithm='SAMME.R', base_estimator=None,
      learning_rate=1.0, n_estimators=200, random_state=None)

Работает нормально, но если я пытаюсь:

>>> x = {'base_estimator__max_depth':5}
>>> clf = AdaBoostClassifier(**x)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() got an unexpected keyword argument 
'base_estimator__max_depth'

Я также пытался предварительно настроить базовый оценщик, т. Е. AdaBoostClassifier(base_estimator=DecisionTreeClassifier(),**x), но это также не работает с той же ошибкой, что и выше.

Я понимаю, что это можно установить, выполнив clf.base_estimator__max_depth = 5но в идеале я хотел бы распаковать словарь, который устанавливает несколько параметров классификатора.Итак, мой вопрос, возможно ли это, и если да, то как?

Примечание: я знаю, как установить эти параметры, я просто хотел бы знать, возможно ли это сделать, распаковав словарь, поскольку мне это кажется более приятным

1 Ответ

0 голосов
/ 24 мая 2018

Это потому, что конструктор python для AdaBoostClassifier имеет только следующие параметры, определенные в __init__():

base_estimator=None,
n_estimators=50,
learning_rate=1.,
algorithm='SAMME.R',
random_state=None

И для него base_estimator__max_depth - неизвестный параметр.

Однако,Вы можете использовать set_params(), который будет правильно обрабатывать их в соответствии с документацией:

Установите параметры этого оценщика.

Метод работает на простомОценщики, а также на вложенных объектах (таких как конвейеры).Последние имеют параметры вида component__parameter , чтобы можно было обновлять каждый компонент вложенного объекта.

Таким образом, вы можете сделать это:

x = {'base_estimator__max_depth':5}
clf = AdaBoostClassifier(base_estimator=DecisionTreeClassifier())
clf.set_params(**x)

ПРИМЕЧАНИЕ : В Python 3 вы также можете сделать следующее (что, я думаю, вы ищете):

x = {'base_estimator':DecisionTreeClassifier(),
     'base_estimator__max_depth':5}
clf = AdaBoostClassifier()
clf.set_params(**x)

Вышеуказанное не работает для python2 в настоящее время и будет исправленов следующей версии.См. выпуск здесь .

Другой способ заключается в том, что вы всегда можете сначала установить словарь в DecisionTreeClassifier, а затем передать его в AdaBoostClassifier.

Примерно так:

x = {'max_depth': 5}
base_est = DecisionTreeClassifier(**x)
clf = AdaBoostClassifier(base_estimator = base_est)

Вы имеете в виду что-то еще?Если да, опубликуйте фрагмент кода того, что вы хотите сделать, и мы найдем способ.

...