不知为何,使用SVC的GridSearchCV在给定相同输入时会产生略有不同的概率结果。在我下面发布的样本中,差异很小,但在其他问题上我遇到过更大的差异。每次给定相同的输入,GridSearch不应该产生相同的结果吗?
另请参阅另一位用户之前提出的问题,predict_proba或decision_function作为估计器的“置信度”,该问题讨论了逻辑回归的相同问题,但后来发现那是一个错误——或许这也是一个错误?还是GridSearchCV使用了随机种子?在这个演示问题中,差异还不算太大,但我有其他更复杂的问题,其中概率差异足以预测二元状态的另一面。
from sklearn import svm, grid_search, datasetsiris = datasets.load_iris()parameters = {'kernel':('linear', 'rbf'), 'C':[1, 10]}svr = svm.SVC(probability=True)clf = grid_search.GridSearchCV(svr, parameters)clf.fit(iris.data, iris.target)clf.predict_proba(iris.data)array([[ 9.75883684e-01, 1.55259588e-02, 8.59035759e-03], [ 9.61565216e-01, 2.74888948e-02, 1.09458891e-02], [ 9.74605121e-01, 1.68928925e-02, 8.50198656e-03], [ 9.58212635e-01, 2.97479036e-02, 1.20394616e-02],....
当我再次运行完全相同的代码时,我得到的是:
array([[ 9.76047242e-01, 1.54138902e-02, 8.53886802e-03], [ 9.61893348e-01, 2.72510317e-02, 1.08556202e-02], [ 9.74780630e-01, 1.67675046e-02, 8.45186573e-03], [ 9.58586150e-01, 2.94842759e-02, 1.19295743e-02],'
我可以反复运行并得到更多不同的结果。
这对于SVC上的GridSearchCV来说是正常的吗,还是我做错了什么,或者这是一个错误?
我使用的是scikit-learn 0.14.1版本。
谢谢你。
回答:
SVM不支持概率计算。解决这个问题的一个技巧是实质上对每个数据点到SVM决策边界的边缘距离进行逻辑回归。如果我们直接这样做,可能会因为所有支持向量的距离为±1而出现一些问题。为了避免这种偏差,会创建3个折叠,并进行类似CV的过程,一次处理1/3的数据(在其他2/3的数据上进行训练)。然后对这些值进行逻辑回归,并在整个数据集上重新训练SVM。这被称为Platt缩放。随机性来自于CV部分。
我有一篇文章,其中有几个二维示例和更多解释。