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

     2023-03-12     133

关键词:

【中文标题】提高单个样本的 SVC 预测性能【英文标题】:Improving SVC prediction performance on single samples 【发布时间】:2014-02-21 01:44:56 【问题描述】:

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

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

我已经将 SVC 模型作为 Flask Web 应用程序提供服务,因此一部分开销已经消失(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))

【问题讨论】:

不要使用SVC进行文本分类,不值得。 嗨,我明白你的意思,但我应该指定它是一个多类情感分类(非常不同的类大小)。目前,我正在努力达到最高精度。到目前为止,带有 RBF 内核的 SVC 的性能优于其他所有分类器,尽管差距很小(例如 SVC 0.898、PassiveAggressiveClassifier 0.868、MultinomialNB 0.837)。然而,SVC 在很大程度上优于最小类别的竞争(例如 F1 SVC 0.84、PAC 0.76、MNB 0.68)。如果 SVC 对单个文档的处理速度稍微快一点,我看不出有任何理由不将它用于我当前的数据。 【参考方案1】:

不能提前构造LibSVM数据结构。当对文档进行分类的请求到达时,您会获取文档的文本,从 if 中制作一个向量,然后才转换为 LibSVM 格式,以便您做出决定。

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

【讨论】:

当然,您无法避免处理您应要求获得的一份文件。但是,取决于样本数量的性能差异如此之大,以至于我仍然想知道是否可以提前做点什么。例如,在每个文档上同时调用 predictpredict_proba:100 个文档 5.6157s、10 个文档 0.9705s、2 个文档 0.4969s、1 个文档 0.4551s 更改分类器不是问题的一部分。 LinearSVC 只是SVC 的优化版本,所以你并没有真正改变分类器。 ***.com/questions/11508788/… 您知道LinearSVCSVC 选项之间的区别吗(阅读:非线性内核)?我再说一遍:这不是我的问题的一部分,无需建议更改分类器。【参考方案2】:

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

自定义服务器

这不是“加热”任何东西的问题。简单地说 - 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 标度,但它仍然是可能的。

【讨论】:

非常有帮助,谢谢。我认为分批是目前的解决方案,但我会尽快尝试分类:-)

r语言使用线性回归模型来预测(predict)单个样本的目标值(响应值response)实战

R语言使用线性回归模型来预测(predict)单个样本的目标值(响应值、response)实战目录 查看详情

十大经典预测算法六---集成学习(模型融合算法)

...的原因  1、单个模型容易过拟合,多个模型融合可以提高范化能力  2、单个模型预测能力不高,多个模型往往能提高预测能力  3、对于数据集过大或过小,可以分别进行划分和有放回的操作,产生不同的数据子集,然后... 查看详情

提高 SVM 的准确度性能

】提高SVM的准确度性能【英文标题】:ImprovetheaccuracyperformanceonSVM【发布时间】:2014-08-0519:33:27【问题描述】:我正在研究使用HOG和LBP两种不同功能进行检测的人。我使用SVM来训练正样本和负样本。在这里,我想问一下如何提高SV... 查看详情

python - 如何在python scikit-learn中进行字典向量化后预测单个新样本?

】python-如何在pythonscikit-learn中进行字典向量化后预测单个新样本?【英文标题】:Howtopredictasinglenewsampleafterdict-vectorizationinpythonscikit-learn?【发布时间】:2016-06-1302:41:28【问题描述】:我正在使用逻辑回归分类器来预测种族类别... 查看详情

训练准确度提高但验证准确度保持在 0.5,并且模型为每个验证样本预测几乎相同的类别

】训练准确度提高但验证准确度保持在0.5,并且模型为每个验证样本预测几乎相同的类别【英文标题】:Trainingaccuracyimprovingbutvalidationaccuracyremainat0.5,andmodelpredictsnearlythesameclassforeveryvalidationsample【发布时间】:2019-12-1912:34:43【问... 查看详情

sklearn之svm-葡萄酒质量预测

...ne)C-Support向量分类。实现基于libsvm。拟合时间复杂度大于样本数量的二次型,这使其难以扩展到包含10000个以上样本的数据集。多类支持是根据一对一方案处理的。核函数的精确数学公式以及gamma、coef0和degree这些参数是比较... 查看详情

r语言基于库克距离统计量识别(cook’sdistance)对于回归模型性能或者预测影响(influentialobservation)很大的观测样本可视化库克距离并添加阈值线识别影响力大的样本

R语言基于库克距离统计量来识别(Cook’sdistance,orCook’sD)对于回归模型性能或者预测影响(Influentialobservations)很大的观测样本、可视化库克距离并添加阈值线识别影响力大的样本目录 查看详情

spss模型预测准确率是哪个

...、均方误差、残差等来评估模型预测准确率。另外,为了提高预测准确率,我们可以尝试使用更多样本数据、调整模型参数、选择更合适的变量等方法 参考技术BSPSS是一款统计分析软件,可以用来建立和测试各种预测模型。在使... 查看详情

SVM 预测(SVC 与 SVR)

】SVM预测(SVC与SVR)【英文标题】:SVMprediction(SVCvsSVR)【发布时间】:2020-07-0521:08:58【问题描述】:我正在尝试使用SKlearnSVM预测我的数据集中的值。在Sklearnwebsite,我有更多的模型:我的数据集是完整的数字数据集(如Iris数据集... 查看详情

分类器

分类器是数据挖掘中对样本进行分类的方法的统称,包含决策树、逻辑回归、朴素贝叶斯、神经网络等算法。分类器的构造和实施步骤:选定样本(正负样本),分成训练样本和测试样本两部分。在训练样本上执行分类器算法,... 查看详情

随机森林算法梳理

...,然后得到最终预测结果。那么,为什么集成学习会好于单个学习器呢?原因可能有三:训练样本可能无法选择出最好的单个学习器,由于没法选择出最好的学习器,所以干脆结合起来一起用;假设能找到最好的学习器,但由于... 查看详情

分类模型的性能评估指标总结(代码片段)

...二分类问题,通常将两个类别称为正类和负类。正类中的样本为正例,负类中的样本为负例。假设我们有一组样本对应的y真实标签记为y_test=[110111],相应的y预测标签记为y_pre=[100101],预测结果可分为4种情况:正例1被判定为正例... 查看详情

提高在大型矩阵中计算加权 Jaccard 的性能

】提高在大型矩阵中计算加权Jaccard的性能【英文标题】:ImproveperformanceforcomputingWeightedJaccardinalargematrix【发布时间】:2018-10-0917:37:09【问题描述】:R输入:一个矩阵(测量x个样本)(2291x265)(矩阵[i,j]=0到1之间的值)输出:在所... 查看详情

第14篇umop

...如FPN、YOLO)和重采样技巧(例如焦点损失、ATSS)极大地提高了单级检测器的性能。然而,如何通过逐级优化特征金字塔来提高性能仍然有待探索。我们发现,在训练期间,正样本 查看详情

集成方法

... 顾名思义,集成方法就是聚集多个分类器的预测来提高分类准确率。即通过改变训练样本的权重,构建一组基分类器,然后将这些分类器进行线性组合,通过对每个基分类器的预测进行投票来,提高分类的... 查看详情

提高数据库的性能

1.增加缓存(把常使用的数据存在缓存中)mysql缓存redis缓存2.使用索引3.优化数据库的数据类型(使用能存储数据的最短类型uchar(16))4.对表进行拆分项目开发过程中,我们数据的数据库数据越来越大,随之而来的是单个表中... 查看详情

性能评价

...”、“不相关的”。精确率:“相关的”子集中的正确的样本的比例。召回率:实际“相关的”子集中正确标注的样本的比例。  预测结果标注结果  正例负例黄金标准正例真正的正例(tp)错误的负例(fn)标注结果负... 查看详情

运用优化器提高网络测试性能

...测的结果的正确率比较低,这个时候我们就在想如何提高网络的性能呢?模型需要训练,如何进行训练?2方法我们在没有经过训练的时候网络测试性能比较低,128个数字正确率不到百分之十,这个时候我 查看详情