小编Jos*_*lle的帖子

是否可以为sklearn SVM明确设置可能的类的列表?

我有一个使用sklearn的SVC类的程序。确实,我正在使用使用SVC类的OneVsRestClassifier类。我的问题是predict_proba()方法有时返回的向量太短。这是因为classes_属性缺少一个类,这种情况发生在训练过程中不存在标签时。

考虑下面的示例(下面显示的代码)。假设所有可能的类分别是1、2、3和4。现在假设训练数据恰好不包含任何用3类标记的数据。这很好,除非当我调用predict_proba()时我想要一个长度为4的向量。 ,我得到一个长度为3的向量。也就是说,predict_proba()返回[p(1)p(2)p(4)],但是我想要[p(1)p(2)p(3)p(4) )],其中p(3)= 0。

我想clf.classes_是由培训期间看到的标签隐式定义的,在这种情况下是不完整的。有什么方法可以显式设置可能的类标签?我知道一个简单的解决方法是仅采用predict_proba()输出并手动创建所需的数组。但是,这很不方便,可能会使我的程序变慢。

# Python 2.7.6

from sklearn.svm import SVC
from sklearn.multiclass import OneVsRestClassifier
import numpy as np

X_train = [[1], [2], [4]] * 10
y = [1, 2, 4] * 10
X_test = [[1]]

clf = OneVsRestClassifier(SVC(probability=True, kernel="linear"))
clf.fit(X_train, y)

# calling predict_proba() gives: [p(1) p(2) p(4)]
# I want: [p(1) p(2) p(3) p(4)], where p(3) = 0
print clf.predict_proba(X_test)
Run Code Online (Sandbox Code Playgroud)

我想到的变通方法会创建一个新的概率列表,并通过多个append()调用一次将其构建为一个元素(请参见下面的代码)。与让predict_proba()自动返回我想要的东西相比,这似乎要慢一些。我还不知道它是否会大大减慢我的程序的速度,因为我还没有尝试过。无论如何,我想知道是否有更好的方法。

def workAround(probs, classes_, all_classes):
    """
    probs: list of probabilities, output of predict_proba (but 1D)
    classes_: …
Run Code Online (Sandbox Code Playgroud)

python classification svm scikit-learn

5
推荐指数
1
解决办法
1159
查看次数

标签 统计

classification ×1

python ×1

scikit-learn ×1

svm ×1