【问题标题】:why the predict_proba function of sklearn.svm.svc is giving probability greater than 1?为什么 sklearn.svm.svc 的 predict_proba 函数给出的概率大于 1?
【发布时间】:2018-05-07 09:35:03
【问题描述】:

我有一个 sklearn.svm.svc(RBF 内核)模型在两个类上训练,每个类包含 140 个样本。当我尝试预测时,概率设置为 true,并且这两个类别的预测概率是不同的。

  1. 对于某些测试样本,它给出一个大于 1 的概率
    和其他少于一个

    例如 ('sample-1': 1.55478334, 'sample-2': 0.999984)。

  2. 在某些情况下,它给出的两个概率都小于一

    例如 ('sample-1':0.4182294947776875,'sample-2': 0.58177035052223113)。

我的模型是否运行良好,或者我的训练或测试有问题。 Probability greater then 1Probability less then 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'))

我的sn-ps结果如下

【问题讨论】:

  • 是舍入错误吗?
  • 请添加一些样本的实际输出。不要在你的措辞中操纵它。看起来简单的舍入已关闭。另请显示您使用的代码。 (从声明SVC到概率)
  • 感谢 Kumar 建议编辑和添加的编辑,它不是舍入错误机器给出的结果,我很困惑为什么请重读这篇文章

标签: python scikit-learn svm svc


【解决方案1】:

请注意这些概率中的e-06e-08。这相当于科学计数法中的 10^(-08)。所以上面1个你认为的概率非常非常小。

例如:

2.798594e-06 = 0.000002798594

同样,

7.7173288137e-08 = 0.000000077173288137

因此,当您将这些值相加时,您将得到 1。如果不是 1,那么它将类似于 0.99999999...。由于显示的结果四舍五入,这是预期的结果。

所以predict_proba 结果并没有不一致。他们实际上是正确的。

现在至于为什么预测结果与最高预测概率不匹配,这在文档中进行了描述,并且是由于算法内部而导致的预期行为。请查看文档:-

概率估计可能与分数不一致,在 感觉分数的“argmax”可能不是 概率。 (例如,在二元分类中,样本可能是 由 predict 标记为属于概率

【讨论】:

  • 谢谢,Vivek Kumar 解决了我的问题。
猜你喜欢
  • 2017-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 2018-09-06
  • 2019-03-17
  • 2018-11-19
  • 1970-01-01
相关资源
最近更新 更多