почему функция predict_proba sklearn.svm.svc дает вероятность больше 1?

У меня есть модель sklearn.svm.svc (ядро RBF), обученная на двух классах, содержащих по 140 образцов в каждом. Для вероятности установлено значение true, когда я пытался предсказать, и вероятность предсказания этих двух классов различается.

  1. Для некоторых тестовых образцов это дает одну вероятность больше 1
    , а для других меньше единицы.

    например («образец-1»: 1,55478334, «образец-2»: 0,999984).

  2. В некоторых случаях он дает обе вероятности меньше единицы.

    например («образец-1»: 0,4182294947776875, «образец-2»: 0,58177035052223113).

Хорошо ли работает моя модель или в моем обучении или тестировании есть ошибка? Вероятность больше 1Вероятность меньше 1

мой код выглядит следующим образом:

#Training code      
        tcdf512_d1=np.empty(280,(18)),dtype=float)
            lables=np.empty((0))
            model512_d1=SVC(probability=True)
            for img,img2 in map(None,catA,catB):
                if img!=None:
                    tcdf512_d1[k]=img(18 features i.e. skewness,variance, standard deviation etc)
                    k+=1
                    lables=np.append(lables,'Cat-VI')
                    pass
                if img2!=None:
                    tcdf512_d1[k]=img2(18 features i.e. skewness,variance, standard deviation etc)
                    k+=1
                    lables=np.append(lables,'Cat-VII')
                    pass
                if k%50==0:
                    print (k)

            print ("LBP Calculated")
            print (time.strftime('%d/%m/%Y %H:%M:%S'))
            model512_d1.fit(tcdf512_d1,lables)
            tcdf512_d1=None
            lables=None
            k=None
            print ("Model Trained")
            print (time.strftime('%d/%m/%Y %H:%M:%S'))
            joblib.dump(model512_d1,"Cat/momentsCat_6-7_128_d1.pkl",compress=3)
            print ("Model Saved")
            print (time.strftime('%d/%m/%Y %H:%M:%S'))
            model512_d1=None
#Testing Code

    size=128
    Cat_I_II       =  joblib.load("Cat/momentsCat_6-7_128_d1.pkl")
    name1="VII"
    print (name1)
    images_address="Catagory/Testbg/"+name1+"/"
    name1="Cat-"+str(name1)
    test_images = cvutils.imlist(images_address)

    count =images_address.rfind("/")+1
    results1=[]
    print (len(test_images))
    print ("Start Time ")
    print (time.strftime('%d/%m/%Y %H:%M:%S'))
    j=float(len(test_images))
    k=0
#    testdata=[]
    for img3 in test_images:
        results1.append("Image : "+str(img3[count:]))
        results1.append("\n")
    varientarray=[]        
        array=[]
        array.append(img3(18 features i.e. skewness,variance, standard deviation etc))
        print array
        prediction = Cat_I_II.predict(array)[0]
        prob=Cat_I_II.predict_proba(array)[0]
        prob_per_class_dictionary = dict(zip(Cat_I_II.classes_, prob))
        print(prediction,prob_per_class_dictionary)
        results1.append("Result of Cat_I_II is : "+str(prediction) +"\t"+str(prob_per_class_dictionary))
        varientarray.append(prediction)

        print (k)
        print ("Final Result of image "+str(i[count:]) + " is : "+str(collections.Counter(varientarray).most_common(1)[0][0]))
        results1.append("Final Result of image "+str(i[count:]) + " is : "+str(collections.Counter(varientarray).most_common(1)[0][0]))

        if str(i[count:i.index('0')])==collections.Counter(varientarray).most_common(1)[0][0]:
            j-=1
        gc.collect()
        k+=1
    k=float(j*100/len(test_images))
    Accuracy=float((len(test_images)-j)*100/len(test_images))
    print (j)
    print (k)
    print (Accuracy)
    with open("CatResults/_Finalresults.txt", 'a') as f:
        f.write(str("The accuracy for "+str(name1)+" is :"+str(Accuracy)) +"\n")
    results1.append("Incorrect Results are :"+str(j))
    results1.append("The percentage of incorrect result is :"+str(k))
    results1.append("The accuracy is :"+str(Accuracy))
    with open("CatResults/Cat-"+str(name1)+"resultsp2.txt", 'w') as f:
        for s in results1:
            f.write(str(s) +"\n")
    print ("End Time")
    print(time.strftime('%d/%m/%Y %H:%M:%S'))

Фрагменты моих результатов следующие

Фрагмент изображения результатов

Результаты


person Owais Ch    schedule 23.11.2017    source источник
comment
Это ошибка округления?   -  person Heikki    schedule 23.11.2017
comment
Пожалуйста, добавьте фактический результат для некоторых образцов. Не манипулируйте им в своих формулировках. Похоже, простое округление отключено. Также, пожалуйста, покажите код, который вы использовали. (Прямо от объявления SVC до вероятности)   -  person Vivek Kumar    schedule 23.11.2017
comment
Спасибо, Кумар, за предложение правок и правок, и это не ошибка округления, машина дает такой результат, и я смущен, почему, пожалуйста, перечитайте сообщение   -  person Owais Ch    schedule 23.11.2017


Ответы (1)


Обратите внимание на e-06 или e-08 в этих вероятностях. Это эквивалентно 10^(-08) в экспоненциальном представлении. Таким образом, указанная выше 1 вероятность, о которой вы думаете, очень и очень мала.

Например:

2.798594e-06 = 0.000002798594

Сходным образом,

7.7173288137e-08 = 0.000000077173288137

Поэтому, когда вы суммируете эти значения, вы получите 1. Если не 1, то это будет что-то вроде 0,99999999... . Ожидается из-за округления отображаемых результатов.

Таким образом, результаты predict_proba не противоречат друг другу. На самом деле они правильные.

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

Оценки вероятностей могут не соответствовать оценкам в том смысле, что «argmax» оценок может не совпадать с argmax вероятностей. (Например, в бинарной классификации выборка может быть помечена с помощью прогнозирования как принадлежащая к классу с вероятностью ‹½ в соответствии с прогнозированием_пробы.)

person Vivek Kumar    schedule 23.11.2017
comment
Спасибо, Вивек Кумар, он решил мою проблему. - person Owais Ch; 23.11.2017