出于某种原因,给定相同输入的带有svc的GridSearchCV会产生轻微的概率结果。我在下面发布的样本中,差异很小,但我对其他问题的影响要大得多。每次给定相同的输入时,GridSearch不应该产生相同的结果吗?
另请参阅其他用户predict_proba or decision_function as estimator "confidence"的上一个问题,该问题解决了与Logistic回归相同的问题,但结果证明这是一个错误 - 也许这也是?或者GridSearchCV是否使用随机种子?在这个演示问题中差别并不算太差,但我还有其他更复杂的问题,其中概率差异足以预测二元状态的另一面。
from sklearn import svm, grid_search, datasets
iris = 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 .14.1。
谢谢。
答案 0 :(得分:2)
SVM不支持概率。解决此问题的技巧是基本上对每个数据点到SVM决策边界的边距进行逻辑回归。如果我们直接这样做,可能会出现一些问题,即所有支持向量的距离都为+ - 1.为了避免这种偏差,会创建3个折叠并执行类似CV的过程以获得1/3的边距值一次数据(在另外2/3的数据上训练)。然后对这些值进行逻辑回归,并在整个数据集上重新训练SVM。这称为Platt Scaling。 CV部分是随机性的来源。
我有一个post,其中包含一些2D示例和更多解释。