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

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

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

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

【问题讨论】:

    标签: python scikit-learn


    【解决方案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 类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    • 2014-09-21
    • 2016-01-14
    • 2021-03-09
    • 2020-12-26
    • 1970-01-01
    • 2019-04-22
    相关资源
    最近更新 更多