假设我有一个多类且具有层次结构的分类问题,例如’可食用’、’有营养’和’无营养’ – 可以这样表示
├── 可食用│ ├── 有营养│ └── 无营养└── 不可食用
虽然使用支持多类分类的分类器或对于不支持的分类器使用一对一/一对所有方案可以获得不错的性能,但单独训练每一级的分类器并将它们连接起来,以便将分类为’可食用’的实例进一步分类为有营养
或无营养,可能会更有益。
我想使用scikit-learn
的估计器作为构建块,我想知道我是否可以让Pipeline
支持这种方法,或者我是否需要编写自己的估计器来实现基础估计器,并可能实现BaseEnsemble
来实现这一点。
@某人之前在邮件列表中提到过这个问题 http://sourceforge.net/mailarchive/message.php?msg_id=31417048,我想知道是否有人对此有见解或建议如何进行操作。
回答:
您可以通过提供一个base_estimator
作为构造函数参数和一个按顺序排列的目标类列表来级联,来编写自己的类作为元估计器。在这个元分类器的fit方法中,您可以根据这些类对数据进行子切片,并为每一级拟合base_estimators
的克隆,并将结果子分类器存储在元分类器的属性中。
在predict方法中,您再次遍历级联结构,这次调用底层子分类器的predict方法来切片您的预测,并递归地将这些预测传递到下一级。您将需要使用大量的numpy高级索引 😉
您可以git grep base_estimator
在源代码中查找代码库中现有的元估计器示例(如Bagging、AdaBoost、GridSearchCV…)。