Как динамически создавать экземпляры классификаторов sklearn, предоставляя имя в виде строки - PullRequest
0 голосов
/ 14 апреля 2020

Я хотел бы создать экземпляр оценки sklearn благодаря его названию. Например:

name = 'RandomForestClassifier'
clf = BaseEstimator(name)
print(clf) # return something like RandomForestClassifier(...)

Я пробовал clf = eval(name), но я не могу clf.fit(X, y), потому что clf равен <class 'sklearn.ensemble._forest.RandomForestClassifier'> вместо чего-то вроде RandomForestClassifier().

I Не могу найти, как создать оценщик sklearn, благодаря его имени.

1 Ответ

1 голос
/ 14 апреля 2020

Насколько я понимаю, что вы хотите достичь, это динамически создавать экземпляры существующих классификаторов на основе некоторого пользовательского ввода, заданного в строке. BaseEstimator является базовым классом для всех оценщиков, поэтому я думаю, что вы должны использовать его только в том случае, если вы планируете создать свой собственный оценщик.


Теперь я не знаю, как вам удалось запустить приведенный выше код, поскольку BaseEstimator() не принимает никаких аргументов:

clf = BaseEstimator('RandomForestClassifier')
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/IPython/core/interactiveshell.py", line 3331, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-6-59dd1a62618a>", line 1, in <module>
    clf = BaseEstimator('RandomForestClassifier')
TypeError: BaseEstimator() takes no arguments

В любом случае чем ближе вы можете подойти к динамической c реализации классификатора:

from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier


def get_clf(name):
    if name not in ('RandomForestClassifier', 'DecisionTreeClassifier'):
        raise ValueError(f"{name} is not a recognised option")    

    classifiers = {
        "DecisionTreeClassifier": DecisionTreeClassifier,
        "RandomForestClassifier": RandomForestClassifier
    }

    classifier = classifiers[name]
    return classifier()

В качестве альтернативы вы можете go с более простым решением:

def get_clf(name):

    if name not in ('RandomForestClassifier', 'DecisionTreeClassifier'):
        raise ValueError(f"{name} is not a recognised option")

    if name == 'RandomForestClassifier':
        return RandomForestClassifier()
    elif name == 'DecisionTreeClassifier':
        return DecisionTreeClassifier()
    else: 
        raise RuntimeError()

В качестве альтернативы вы можете использовать что-то вроде приведенного ниже:

...