python - Scikit-learn predict_proba 给出错误答案

标签 python scikit-learn

这是来自 How to know what classes are represented in return array from predict_proba in Scikit-learn 的后续问题

在那个问题中,我引用了以下代码:

>>> import sklearn
>>> sklearn.__version__
'0.13.1'
>>> from sklearn import svm
>>> model = svm.SVC(probability=True)
>>> X = [[1,2,3], [2,3,4]] # feature vectors
>>> Y = ['apple', 'orange'] # classes
>>> model.fit(X, Y)
>>> model.predict_proba([1,2,3])
array([[ 0.39097541,  0.60902459]])

我在那个问题中发现这个结果代表了点属于每个类的概率,按照 model.classes_ 给出的顺序_

>>> zip(model.classes_, model.predict_proba([1,2,3])[0])
[('apple', 0.39097541289393828), ('orange', 0.60902458710606167)]

所以...如果解释正确,这个答案表示该点可能是“橙色”(由于数据量很小,置信度相当低)。但直观地说,这个结果显然是不正确的,因为给出的点与“apple”的训练数据相同。可以肯定的是,我也测试了相反的结果:

>>> zip(model.classes_, model.predict_proba([2,3,4])[0])
[('apple', 0.60705475211840931), ('orange', 0.39294524788159074)]

同样,显然不正确,但方向相反。

最后,我用更远的点试了一下。

>>> X = [[1,1,1], [20,20,20]] # feature vectors
>>> model.fit(X, Y)
>>> zip(model.classes_, model.predict_proba([1,1,1])[0])
[('apple', 0.33333332048410247), ('orange', 0.66666667951589786)]

同样,模型预测了错误的概率。但是,model.predict 函数做对了!

>>> model.predict([1,1,1])[0]
'apple'

现在,我记得在文档中读过一些关于 predict_proba 对于小型数据集不准确的内容,尽管我似乎无法再次找到它。这是预期的行为,还是我做错了什么?如果这是预期的行为,那么为什么 predict 和 predict_proba 函数不同意输出?重要的是,数据集需要多大才能信任 predict_proba 的结果?

-------- 更新--------

好的,所以我对此做了一些“实验”:predict_proba 的行为严重依赖于“n”,但不是以任何可预测的方式!

>>> def train_test(n):
...     X = [[1,2,3], [2,3,4]] * n
...     Y = ['apple', 'orange'] * n
...     model.fit(X, Y)
...     print "n =", n, zip(model.classes_, model.predict_proba([1,2,3])[0])
... 
>>> train_test(1)
n = 1 [('apple', 0.39097541289393828), ('orange', 0.60902458710606167)]
>>> for n in range(1,10):
...     train_test(n)
... 
n = 1 [('apple', 0.39097541289393828), ('orange', 0.60902458710606167)]
n = 2 [('apple', 0.98437355278112448), ('orange', 0.015626447218875527)]
n = 3 [('apple', 0.90235408180319321), ('orange', 0.097645918196806694)]
n = 4 [('apple', 0.83333299908143665), ('orange', 0.16666700091856332)]
n = 5 [('apple', 0.85714254878984497), ('orange', 0.14285745121015511)]
n = 6 [('apple', 0.87499969631893626), ('orange', 0.1250003036810636)]
n = 7 [('apple', 0.88888844127886335), ('orange', 0.11111155872113669)]
n = 8 [('apple', 0.89999988018127364), ('orange', 0.10000011981872642)]
n = 9 [('apple', 0.90909082368682159), ('orange', 0.090909176313178491)]

我应该如何在我的代码中安全地使用这个函数?至少,是否有任何 n 值可以保证与 model.predict 的结果一致?

最佳答案

predict_probas 正在使用 libsvm 的 Platt 缩放功能来调用概率,请参阅:

因此,超平面预测和概率校准确实可能不一致,尤其是当您的数据集中只有 2 个样本时。奇怪的是,在这种情况下,libsvm 为缩放概率所做的内部交叉验证并没有(显式地)失败。也许这是一个错误。必须深入研究 libsvm 的 Platt 缩放代码才能了解发生了什么。

关于python - Scikit-learn predict_proba 给出错误答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17017882/

相关文章:

python - R 函数 density() 的 Python 等价物(即相同的输出)是什么?

Android MediaPlayer Streaming YouTube 音频流意外的大声静态

python - 如何使用 Flask 将复杂对象序列化为 JSON

python - 从 __init__ 中的 Python 子模块导入方法,但不是子模块本身

python - 在删除低方差之前对数据进行归一化,会出错

python - SciKit One-class SVM 分类器训练时间随着训练数据的大小呈指数增长

python - Z3:如何从常数中提取()?

python - 在管道 sklearn 中包含特征提取

python - Scikit 在使用 fit() 函数时学习 GaussianProcessClassifier 内存错误

python - 如何使用 sklearn 对少数因素和许多训练因素进行回归