Python sklearn中如何根据预测概率对实例进行排序
我使用sklearn的支持向量机(Python sklearn中如何根据预测概率对实例进行排序,python,scikit-learn,classification,cross-validation,Python,Scikit Learn,Classification,Cross Validation,我使用sklearn的支持向量机(SVC),如下所示,使用10倍交叉验证,获得我的数据集中实例的预测概率,如下所示 从sklearn导入数据集 iris=数据集。加载\u iris() X=iris.data y=iris.target clf=SVC(类重量=“平衡”) 概率=交叉值预测(clf,X,y,cv=10,方法='predict'u proba') 打印(clf.类别) 打印(proba[:,1]) 打印(np.argsort(proba[:,1])) 我对print(proba[
SVC
),如下所示,使用10倍交叉验证
,获得我的数据集中实例的预测概率,如下所示
从sklearn导入数据集
iris=数据集。加载\u iris()
X=iris.data
y=iris.target
clf=SVC(类重量=“平衡”)
概率=交叉值预测(clf,X,y,cv=10,方法='predict'u proba')
打印(clf.类别)
打印(proba[:,1])
打印(np.argsort(proba[:,1]))
我对print(proba[:,1])
和print(np.argsort(proba[:,1])
的预期输出如下,其中第一个表示类1
的所有实例的预测概率,第二个表示每个概率的数据实例的对应索引
我的第一个问题是,;似乎SVC
不支持predict\u proba
。因此,如果我改用proba=cross\u val\u predict(clf,X,y,cv=10,method='decision\u function')
是否正确
我的第二个问题是如何打印预测概率的类别?我尝试了clf\u类
。但是,我得到一个错误,说AttributeError:'SVC'对象没有属性'classes'
。有没有办法解决这个问题
注意:我想通过交叉验证得到所有实例的预测概率
编辑:
@KRKirov的答案很好。但是,我不需要GridSearchCV
,只想使用普通的交叉验证
。因此,我改变了他的代码使用cross\u val\u score
。现在,我得到了错误notfitteerror:Call fit before prediction
有没有办法解决这个问题
如果需要,我很乐意提供更多细节。Cross_val predict是一个函数,它不会将分类器(在您的例子中是SVC)作为其输出的一部分返回。因此,您无法访问后者及其方法和属性 要执行交叉验证并计算概率,请使用scikit learn的GridSearchCV或RandomizedSearchCV。如果只需要一个简单的交叉验证,则只传递一个参数的参数字典。一旦有了概率,您就可以使用pandas或numpy根据特定类对它们进行排序(下面示例中的1)
你的最终目标是什么?你对实例进行排名是什么意思<代码>决策函数可用于排名,但不是概率estimate@ShihabShahriar我想得到分类器的最高预测。例如,前200名预测:谢谢你的回答。我还想得到相应的概率指数。早些时候,我把它当作
np.argsort(proba[:,1])
。由于代码发生了更改,我不知道如何获取该数据。请让我知道您的建议:)此外,我还希望像我在代码中所做的那样执行交叉验证。如果您还可以添加以下内容,我们将不胜感激:)cross_val_predict只返回一个numpy数组o.f预测类。如果要进行交叉验证,并将分类器和最佳参数作为输出,请使用scikit learn的GridSearchCV或RandomizedSearchCV。请参阅使用GridSearchCV代替cross_val_predict.Final更新的答案。我希望这能解决问题。当然,您可以对概率进行四舍五入,以获得适合您的格式。
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.1 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0.2 0. 0. 0. 0. 0.1 0. 0. 0. 0. 0. 0. 0. 0. 0.9 1. 0.7 1.
1. 1. 1. 0.7 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 0.9 0.9 0.1 1.
0.6 1. 1. 1. 0.9 0. 1. 1. 1. 1. 1. 0.4 0.9 0.9 1. 1. 1. 0.9
1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 0. 0. 0. 0. 0. 0. 0.9 0.
0.1 0. 0. 0. 0. 0. 0. 0. 0.1 0. 0. 0.8 0. 0.1 0. 0.1 0. 0.1
0.3 0.2 0. 0.6 0. 0. 0. 0.6 0.4 0. 0. 0. 0.8 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. ]
[ 0 113 112 111 110 109 107 105 104 114 103 101 100 77 148 49 48 47
46 102 115 117 118 147 146 145 144 143 142 141 140 139 137 136 135 132
131 130 128 124 122 120 45 44 149 42 15 26 16 17 18 19 20 21
22 43 23 24 35 34 33 32 31 30 29 28 27 37 13 25 9 10
7 6 5 4 3 8 11 2 1 38 39 40 12 108 116 41 121 70
14 123 125 36 127 126 134 83 72 133 129 52 57 119 138 89 76 50
84 106 85 69 68 97 98 66 65 64 63 62 61 67 60 58 56 55
54 53 51 59 71 73 75 96 95 94 93 92 91 90 88 87 86 82
81 80 79 78 99 74]
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV
from sklearn import datasets
import pandas as pd
import numpy as np
iris = datasets.load_iris()
X = iris.data
y = iris.target
parameters = {'kernel':(['rbf'])}
svc = SVC(gamma="scale", probability=True)
clf = GridSearchCV(svc, parameters, cv=10)
clf.fit(iris.data, iris.target)
probabilities = pd.DataFrame(clf.predict_proba(X), columns=clf.classes_)
probabilities['Y'] = iris.target
probabilities.columns.name = 'Classes'
probabilities.head()
# Sorting in ascending order by the probability of class 1.
# Showing only the first five rows.
# Note that all information (indices, values) is in one place
probabilities.sort_values(1).head()
Out[49]:
Classes 0 1 2 Y
100 0.006197 0.000498 0.993305 2
109 0.009019 0.001023 0.989959 2
143 0.006664 0.001089 0.992248 2
105 0.010763 0.001120 0.988117 2
144 0.006964 0.001295 0.991741 2
# Alternatively using numpy
indices = np.argsort(probabilities.values[:,1])
proba = probabilities.values[indices, :]
print(indices)
[100 109 143 105 144 122 135 118 104 107 102 140 130 117 120 136 132 131
128 124 125 108 22 148 112 13 115 14 32 37 33 114 35 40 16 4
42 103 2 0 6 36 139 19 145 38 17 47 48 28 49 15 46 129
10 21 7 27 12 39 8 11 1 3 9 45 34 116 29 137 5 31
26 30 141 43 18 111 25 20 41 44 24 23 147 134 113 101 142 110
146 121 149 83 123 127 77 119 133 126 138 70 72 106 52 76 56 86
68 63 54 98 50 84 66 85 78 91 73 51 57 58 93 55 87 75
65 79 90 64 61 60 97 74 94 59 96 81 88 53 95 99 89 80
71 82 69 92 67 62]
# Showing only the first five values of the sorted probabilities for class 1
print(proba[:5, 1])
[0.00049785 0.00102258 0.00108851 0.00112034 0.00129501]