我想通过名称来实例化一个sklearn估计器。例如:
name = 'RandomForestClassifier'clf = BaseEstimator(name)print(clf) # 返回类似于 RandomForestClassifier(...) 的内容
我尝试过使用 clf = eval(name)
,但我无法执行 clf.fit(X, y)
,因为 clf 是 <class 'sklearn.ensemble._forest.RandomForestClassifier'>
,而不是类似于 RandomForestClassifier()
的实例。
我找不到如何通过名称创建sklearn估计器的方法。
回答:
据我所知,你想要实现的是基于用户输入的字符串动态实例化现有的分类器。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
无论如何,你可以实现分类器动态实例化的方法如下:
from sklearn.tree import DecisionTreeClassifierfrom sklearn.ensemble import RandomForestClassifierdef 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()
或者,你可以选择一个更直接的解决方案:
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()