Scikit-Learn Foregnet_proba дает неправильные ответы

Это дополнительный вопрос отКак узнать, какие классы представлены в массиве return из предиката_proba в 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)]

Итак ... этот ответ, если его правильно интерпретировать, говорит о том, чтооранжевый' (с довольно низкой достоверностью, из-за небольшого количества данных). Но, интуитивно, этот результат явно неверен, поскольку данный пункт был идентичен данным обучения дляяблоко', Просто чтобы быть уверенным, я также проверил обратное:

>>> 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'

Теперь я помню, как читал что-то в документации о том, что предикат предиката является неточным для небольших наборов данных, хотя я могуКажется, я снова его нашел. Это ожидаемое поведение, или я делаю что-то не так? Если это ожидаемое поведение, то почему функция предиката и предиката не согласна с выводом? И, что важно, насколько большим должен быть набор данных, прежде чем я смогу доверять результатам вgnett_proba?

-------- ОБНОВИТЬ --------

Итак, я сделал еще немногоэксперименты в это: поведение предиката_проба сильно зависит от «п», но никак не предсказуемо!

>>> 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?

Ответы на вопрос(4)

Ваш ответ на вопрос