gpt4 book ai didi

python - 提高单个样本的 SVC 预测性能

转载 作者:太空宇宙 更新时间:2023-11-03 15:15:24 25 4
gpt4 key购买 nike

我有用于文本分类的大型 SVC 模型(~50Mb cPickles),我正在尝试各种方法在生产环境中使用它们。对文档批处理进行分类非常有效(使用 predictpredict_proba 时每分钟约 1k 个文档)。但是,如对 this question 的评论中所述,对单个文档的预测是另一回事。 :

Are you doing predictions in batches? The SVC.predict method, unfortunately, incurs a lot of overhead because it has to reconstruct a LibSVM data structure similar to the one that the training algorithm produced, shallow-copy in the support vectors, and convert the test samples to a LibSVM format that may be different from the NumPy/SciPy formats. Therefore, prediction on a single sample is bound to be slow. – larsmans

我已经将 SVC 模型作为 Flask 网络应用程序提供服务,因此部分开销已经消失(unpickling),但单个文档的预测时间仍然偏高(0.25 秒)。我查看了 predict 方法中的代码,但无法弄清楚是否有办法“预热”它们,在服务器启动时提前重建 LibSVM 数据结构……有什么想法吗?

def predict(self, X):
"""Perform classification on samples in X.

For an one-class model, +1 or -1 is returned.

Parameters
----------
X : {array-like, sparse matrix}, shape = [n_samples, n_features]

Returns
-------
y_pred : array, shape = [n_samples]
Class labels for samples in X.
"""
y = super(BaseSVC, self).predict(X)
return self.classes_.take(y.astype(np.int))

最佳答案

我可以看到三种可能的解决方案。

自定义服务器

这不是“加热”任何东西的问题。简单 - libSVM 是 C 库,您需要将数据打包/解包为正确的格式。这个过程在整个矩阵上比在每一行上单独处理更有效。克服这个问题的唯一方法是在您的生产环境和 libSVM 之间编写更高效的包装器(您可以编写一个基于 libsvm 的服务器,它将在您的服务中使用某种共享内存)。不幸的是,这是现有实现可以解决的自定义问题。

批处理

像缓冲查询这样的朴素方法是一种选择(如果它是具有数千个查询的“高性能”系统,您可以简单地将它们存储在 N 元素批处理中,然后以此类包将它们发送到 libSVM)。

自己的分类

最后 - 使用 SVM 进行分类确实是简单的任务。您不需要 libSVM 来执行分类。只有训练是一个复杂的问题。获得所有支持向量 (SV_i)、内核 (K)、拉格朗日乘数 (alpha_i) 和截距项 (b) 后,您可以使用以下方法进行分类:

cl(x) = sgn( SUM_i y_i alpha_i K(SV_i, x) + b)

您可以在您的应用程序中直接编写此操作,而无需实际打包/解包/发送任何内容到 libsvm。这可以使事情加快一个数量级。显然 - 检索概率更复杂,因为它需要 Platt 的缩放,但它仍然是可能的。

关于python - 提高单个样本的 SVC 预测性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21427978/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com