首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于预测概率的滑雪板实例排序方法

基于预测概率的滑雪板实例排序方法
EN

Stack Overflow用户
提问于 2019-08-24 09:02:04
回答 1查看 1.1K关注 0票数 1

我正在使用sklearn的支持向量机(SVC),如下所示,使用10-fold cross validation获得数据集中实例的预测概率。

代码语言:javascript
运行
复制
from sklearn import datasets
iris = datasets.load_iris()

X = iris.data
y = iris.target

clf=SVC(class_weight="balanced")
proba = cross_val_predict(clf, X, y, cv=10, method='predict_proba')

print(clf.classes_)
print(proba[:,1])
print(np.argsort(proba[:,1]))

对于print(proba[:,1])print(np.argsort(proba[:,1])),我的预期输出如下:第一个表示类1的所有实例的预测概率,第二个表示每个概率的数据实例的相应索引。

代码语言:javascript
运行
复制
[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]

我的第一个问题是:SVC似乎不支持predict_proba。因此,如果我使用proba = cross_val_predict(clf, X, y, cv=10, method='decision_function')来代替它是正确的吗?

我的第二个问题是如何打印预测概率的类别?我试过clf_classes_。但是,我说AttributeError: 'SVC' object has no attribute 'classes_'时出错了。有没有办法解决这个问题?

注意:我想通过交叉验证得到所有实例的预测概率。

编辑:

“KRKirov”的回答很棒。但是,我不需要GridSearchCV,只想使用普通的cross validation。因此,我更改了他的代码使用cross_val_score。现在,我得到了错误NotFittedError: Call fit before prediction

有没有办法解决这个问题?

如果需要,我很乐意提供更多的细节。

EN

Stack Overflow用户

回答已采纳

发布于 2019-08-24 11:24:59

Cross_val预测是一个函数,它不返回分类器(在您的例子中是SVC)作为其输出的一部分。因此,您无法访问后者及其方法和属性。

要执行交叉验证和计算概率,请使用scikit-learn的GridSearchCV或RandomizedSearchCV。如果您只想进行简单的交叉验证,请传递一个只有一个参数的参数字典。一旦你有了这个概率,你就可以用熊猫或者小熊来根据特定的类对它们进行排序(在下面的例子中是1)。

代码语言:javascript
运行
复制
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]
票数 3
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57636500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档