Machine learning 当精确性比回忆更重要时,如何调整模型以提高精确性?

Machine learning 当精确性比回忆更重要时,如何调整模型以提高精确性?,machine-learning,scikit-learn,svm,Machine Learning,Scikit Learn,Svm,机器学习分类器的性能可以通过多种度量标准来衡量,如精度、召回率和分类精度等 给定如下代码: clf = svm.SVC(kernel='rbf') clf.fit(X_train, y_train) fit函数试图优化的指标是什么 当精确性比回忆更重要时,如何调整模型以提高精确性 据我所知,支持向量机使铰链损失最小化 我不知道有什么通用的方法可以让支持向量分类器优先于查全率。一如既往,您可以使用交叉验证,然后使用hyperparameters查看是否有任何帮助。或者,您可以训练回归器输出[0,

机器学习分类器的性能可以通过多种度量标准来衡量,如精度、召回率和分类精度等

给定如下代码:

clf = svm.SVC(kernel='rbf')
clf.fit(X_train, y_train)
  • fit函数试图优化的指标是什么

  • 当精确性比回忆更重要时,如何调整模型以提高精确性

  • 据我所知,支持向量机使铰链损失最小化

  • 我不知道有什么通用的方法可以让支持向量分类器优先于查全率。一如既往,您可以使用交叉验证,然后使用hyperparameters查看是否有任何帮助。或者,您可以训练回归器输出[0,1]中的值,而不是分类器。然后,通过选择一个合适的阈值,将所有得分高于该阈值的示例放入类别“1”,您将得到一个具有可调阈值参数的分类器,您可以将该参数设置为任意高,以最大程度地提高查全率


  • 您可以通过使用来调整SVM的参数,以最大限度地提高精度。为此,将参数“scoring”设置为


    这里
    clf
    是您的SVC分类器,当然,您还需要设置参数网格
    param\u grid
    。参见示例

    我看到了两种方法:按照@laneok的建议通过网格搜索参数进行优化,或者按照@cfh的建议通过调整阈值进行优化

    最好你两者都做

    我不会试图只优化精度,因为通常通过设置非常高的阈值和非常低的召回率来获得100%的精度。因此,如果可能的话,您可以定义精度和您喜欢的回忆之间的权衡,以及网格搜索

    如果你真的选择了一个单独的阈值,你可能会得到更好的结果。您可以使用SVC.decision_函数获得连续输出,然后为要实现的折衷选择最佳阈值。不过,要选择阈值,需要一个验证集,这使得在网格搜索中执行此操作有点棘手(尽管并非不可能)

    我通常会发现,在优化您想要的内容和管道复杂性之间有一个很好的折衷,即在网格搜索中优化一些需要考虑精度的内容,比如“roc_auc”,在网格搜索之后,根据您喜欢的折衷选择验证集的阈值


    roc_auc基本上同时对所有可能的阈值进行优化,因此参数不会像它们可能的那样特定于您想要的阈值。

    有一种技术,您可以编写自己的损失函数,将重点放在排名指标上,如(auc,精度召回),而不是分类损失,如(铰链损耗或原木损耗)

    请参阅本文第4节(以固定精度最大化召回率)
    不可分解目标的可扩展学习()有关更多详细信息。

    我不确定这是一个多么好的主意,因为通过适当设置阈值,您可以获得100%的收益……可能这不会发生,仍然没有原则。@Andreas Mueller当然,有几种策略可以提高模型性能。这是您在探索数据集时所做的实际工作。没有关于对于数据集,我认为,这个问题是关于scikit学习API的。你是对的,但是如果你从来没有预测过任何东西,你会得到NaN精度。修复了我的答案。自由了。你的评论绝对有价值;)
    sklearn.grid_search.GridSearchCV(clf, param_grid, scoring="precision")