将前 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 管道?的主要内容,如果未能解决你的问题,请参考以下文章