我正在处理一个分类问题,希望找到输入被分类为”[1,0]”和”非[1,0]”的概率
我尝试使用SVC的predict_proba
方法,但它给出了我不需要的类的概率
from sklearn.svm import SVCmodel = SVC(probability=True)model.fit(final_data,foreclosure_y)results = model.predict_proba(final_data_test)[0]
我期望的输出格式如下
index,y--------- 0,0.451,0.622,0.433,0.124,0.55
注意:上述输出格式为.csv,其中y是test_y
这里的列y是每个实例从0到4的概率,这些实例可能被分类为0或1
例如:索引0有0.45的概率被分类为0或1
回答:
请注意
sum([0.58502114, 0.41497886])# 1.0
predict_proba
给出了两个类的概率(因此数组元素的总和为1),按照model.classes_
中出现的顺序;引用文档(在这种情况下,文档总是你最好的朋友):
返回模型中每个类的样本概率。列对应于属性classes_中按排序顺序出现的类。
这里有一个使用玩具数据的例子来说明这个概念:
from sklearn.svm import SVCmodel = SVC(probability=True)X = [[1,2,3], [2,3,4]] # 特征向量Y = [0, 1] # 类model.fit(X, Y)
现在让我们获取训练集中第一个实例[1,2,3]
的预测概率:
model.predict_proba(X)[0]# array([0.39097541, 0.60902459])
好的,顺序是什么 – 即哪个概率属于哪个类?
model.classes_# array([0, 1])
所以,这意味着实例属于类0
的概率是数组的第一个元素0.39097541
,而属于类1
的概率是第二个元素0.60902459
;正如预期的那样,它们的总和为1:
sum([0.39097541, 0.60902459])# 1.0
更新
现在,在像你要求的输出中,我们不放入两个概率;按照惯例,对于二元分类,我们只包括每个实例属于类1的概率;这里是如何对上面的只有两个实例的玩具数据集X
进行操作的:
pred = model.predict_proba(X)pred# array([[ 0.39097541, 0.60902459],# [ 0.60705475, 0.39294525]])import pandas as pdout = pd.DataFrame(pred[:,1],columns=['y']) # 只保留pred中数组的第二个元素,即类1的概率print(out)
结果:
y0 0.6090251 0.392945