首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提高单样本SVC预测性能的研究

提高单样本SVC预测性能的研究
EN

Stack Overflow用户
提问于 2014-01-29 10:16:46
回答 2查看 483关注 0票数 3

我有大型ish模型(~50 am )用于文本分类,我正在尝试在生产环境中使用它们的各种方法。对文档批次进行分类非常有效(使用predictpredict_proba,每分钟大约有1k个文档)。然而,对单个文档的预测是另一回事,正如在对this question的评论中所解释的

你是在批量做预测吗?不幸的是,SVC.predict方法需要大量开销,因为它必须重建一个类似于训练算法生成的LibSVM数据结构,在支持向量中进行浅拷贝,并将测试样本转换为可能不同于NumPy/SciPy格式的LibSVM格式。因此,对单个样本的预测肯定是缓慢的。- larsmans

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

代码语言:javascript
复制
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))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-29 17:39:22

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

自定义服务器

这不是“暖化”的问题。简单地说- libSVM是C库,您需要将数据打包/解压缩成正确的格式。这个过程在整个矩阵上比在每一行上都更有效。克服这一问题的唯一方法是在生产env和libSVM之间编写更高效的包装器(您可以编写基于libsvm的服务器,它将对服务使用某种共享内存)。不幸的是,这是自定义问题,通过现有的实现可以解决。

批次

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

自己分类

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

代码语言:javascript
复制
cl(x) = sgn( SUM_i y_i alpha_i K(SV_i, x) + b)

您可以在应用程序中直接编写此操作,而不需要实际打包/解压缩/将任何内容发送到libsvm。这可以把事情的速度提高一个数量级。显然-概率是比较复杂的恢复,因为它需要普拉特的扇形,但它仍然是可能的。

票数 3
EN

Stack Overflow用户

发布于 2014-01-29 10:39:05

您不能预先构造LibSVM数据结构。当对文档进行分类的请求到达时,您将得到文档的文本,生成一个向量,然后将其转换为LibSVM格式,这样您就可以做出决定了。

LinearSVC应该比使用线性内核的SVC快得多,因为它使用liblinear。如果不降低性能,可以尝试使用不同的分类器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21427978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档