【发布时间】:2020-10-21 17:34:15
【问题描述】:
我想将我的模型放在云端,但它需要一个 joblib 文件。
我有一个模型,可以预测类(多类分类)。
我目前使用np.argsort 并获得我的顶级k 结果。
如何在获取模型输出的 sklearn 管道中添加另一个步骤,以便单个管道返回 top k 结果?
因为 AFAIK,joblib 只能转储具有训练模型的单个管道。
【问题讨论】:
标签: python scikit-learn
我想将我的模型放在云端,但它需要一个 joblib 文件。
我有一个模型,可以预测类(多类分类)。
我目前使用np.argsort 并获得我的顶级k 结果。
如何在获取模型输出的 sklearn 管道中添加另一个步骤,以便单个管道返回 top k 结果?
因为 AFAIK,joblib 只能转储具有训练模型的单个管道。
【问题讨论】:
标签: python scikit-learn
您可以继承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 对象。
【讨论】:
pipeline 是一种更通用的解决方案。在我的回答中,它可以满足您的要求。它使用predict_proba 输出进行所有转换,然后为您提供支持predict_proba 的任何分类器的Top k 类。