关键词:
【中文标题】提高单个样本的 SVC 预测性能【英文标题】:Improving SVC prediction performance on single samples 【发布时间】:2014-02-21 01:44:56 【问题描述】:我有用于文本分类的大型 SVC 模型(~50Mb cPickles),我正在尝试在生产环境中使用它们的各种方法。对文档批次进行分类效果非常好(使用predict
和predict_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
。如果不会过多降低性能,您可以尝试使用不同的分类器。
【讨论】:
当然,您无法避免处理您应要求获得的一份文件。但是,取决于样本数量的性能差异如此之大,以至于我仍然想知道是否可以提前做点什么。例如,在每个文档上同时调用predict
和 predict_proba
:100 个文档 5.6157s、10 个文档 0.9705s、2 个文档 0.4969s、1 个文档 0.4551s
更改分类器不是问题的一部分。
LinearSVC
只是SVC
的优化版本,所以你并没有真正改变分类器。 ***.com/questions/11508788/…
您知道LinearSVC
和SVC
选项之间的区别吗(阅读:非线性内核)?我再说一遍:这不是我的问题的一部分,无需建议更改分类器。【参考方案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个数字正确率不到百分之十,这个时候我 查看详情