2015-05-01 41 views
3

机器学习分类器的性能可以通过各种度量来衡量,如精度,召回率和分类精度等度量指标。scikit-learn分类器拟合目标函数,精度和召回率

鉴于这样的代码:

clf = svm.SVC(kernel='rbf') 
clf.fit(X_train, y_train) 
  1. 什么度量拟合函数努力,进而优化?

  2. 当精度比召回重要得多时,如何调整模型以提高精度?

回答

2
  1. 据我所知,支持向量机减少铰链的损失。

  2. 我不知道有任何通用的方法来使支持向量分类器优先考虑精度而不是回忆。与往常一样,您可以使用交叉验证,然后使用超参数来查看是否有任何帮助。或者,您可以训练一个输出值为[0,1]而不是分类器的回归器。然后,通过选择一个适当的阈值,以便您将所有得分高于该阈值的示例放入类别'1'中,您将得到一个带有可调阈值参数的分类器,您可以将其设置为任意高以最大化调用精度。

2

您可以使用Grid Search Cross Validation来调整SVM的参数,以最大限度地提高精度。要做到这一点,设置参数“得分王”之类

sklearn.grid_search.GridSearchCV(clf, param_grid, scoring="precision") 

这里clf是您的SVC分类,当然,你还需要设置的参数param_grid电网。参见示例here

+0

我不确定这个想法有多好,因为您可以通过适当设置阈值来获得100%的...可能这不会发生,但仍不是那么原则性的。 –

+0

@Andreas Mueller当然,有几个_strategies_改善模型的表现。这是您在探索数据集时所做的实际工作。没有关于数据集的任何信息,我想这个问题是关于scikit-learn API的。 – lanenok

2

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

最理想的是,你应该两者兼而有之。

我不会试图只对精度进行优化,因为通常通过设置非常高的阈值并获得非常低的回忆率而获得100%的精度。所以如果可能的话,你可以定义一个你喜欢的精度和回忆之间的平衡,以及网格搜索。

如果您确实选择了单独的阈值,您可能会获得更好的结果。您可以使用SVC.decision_function获取连续输出,然后选择您想实现的折衷的最佳阈值。为了选择阈值,你需要一个验证集,但是,这使得在网格搜索中做到这一点有点棘手(但不是不可能)。

我通常发现的一个很好的折衷办法就是优化你想要的和管道的复杂性,以便在网格中进行优化 - 搜索需要考虑精度的内容,例如“roc_auc”,在网格搜索之后,搜索根据您喜欢的折衷选择验证集的阈值。

roc_auc基本上同时优化所有可能的阈值,因此参数对于您想要的阈值而言可能不是特定的。

+0

你是对的,虽然你会得到NaN的精度,如果你从来没有预测过任何事情。修正了我的答案。 –

+0

免费下跌。你的评论绝对有价值;) –

相关问题