将前 k 个结果添加到 sklearn 管道?

Posted

技术标签:

【中文标题】将前 k 个结果添加到 sklearn 管道?【英文标题】:Add top k results to sklearn pipeline? 【发布时间】:2020-10-21 17:34:15 【问题描述】:

我想将我的模型放在云端,但它需要一个 joblib 文件。 我有一个模型,可以预测类(多类分类)。 我目前使用np.argsort 并获得我的***k 结果。

如何在获取模型输出的 sklearn 管道中添加另一个步骤,以便单个管道返回 top k 结果?

因为 AFAIK,joblib 只能转储具有训练模型的单个管道。

【问题讨论】:

【参考方案1】:

您可以继承Pipeline 并添加一个使用概率获取top k 预测的方法。

from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import make_classification

X, y = make_classification(n_features=20, n_informative=15, n_classes=5)

class MyPipeline(Pipeline):
    def get_top_k(self, X, k=3):
        probs = self.predict_proba(X)
        return np.fliplr(np.argsort(probs, axis=1)[:, -k:])

X_train, X_test, y_train, y_test = train_test_split(X, y,
                                                    random_state=42)
pipe = MyPipeline([('scalling', StandardScaler()),
                   ('logistic', LogisticRegression())])
pipe.fit(X_train, y_train)
pipe.get_top_k(X_test[:2, :])

现在使用joblib 转储pipe 对象。

【讨论】:

您好,谢谢,但是有没有一种方法可以继承“估计器”类(如果存在)并创建 top_k 估计器,以便我们可以创建一个以该 top_k 作为最后一个元素的管道。那么当 .fit() 时,其他组件可以完成它们的工作,而 top_k 会只是静静地坐着,但是当 .predict() 时,它会开始行动? 继承pipeline 是一种更通用的解决方案。在我的回答中,它可以满足您的要求。它使用predict_proba 输出进行所有转换,然后为您提供支持predict_proba 的任何分类器的Top k 类。

以上是关于将前 k 个结果添加到 sklearn 管道?的主要内容,如果未能解决你的问题,请参考以下文章

在 sklearn 管道中转换估计器的结果

管道中的 sklearn 函数转换器

sklearn Select-K-Best 剪枝会降低性能吗?

管道命令

logit 和 sklearn 管道的一种热编码

如何使用 sklearn 管道跟踪 catboost 的分类索引