Scikit-learn 0.15.2 - 由于predict_proba不可用,OneVsRestClassifier不起作用

时间:2014-12-08 19:02:58

标签: python-2.7 scikit-learn classification document-classification

我正在尝试进行如下的一个分类:

classifier = Pipeline([('vectorizer', CountVectorizer()),('tfidf', TfidfTransformer()),('clf', OneVsRestClassifier(SVC(kernel='rbf')))])

classifier.fit(X_train, Y)

predicted = classifier.predict(X_test)

我得到错误'当probability = false'时,predict_proba不可用。我看到有一个错误报告,下面的一个: https://github.com/scikit-learn/scikit-learn/issues/1946

它被关闭了,所以我杀了scikit-从我的Windows PC学习并完全重新下载scikit - 学习版本0.15.2。但我仍然得到这个错误。有什么建议?或者我理解错了,除非我指定probability = true,否则我仍然无法将SVC与OneVSRestClassifier一起使用?

更新:只是为了澄清,我试图实际实现多标签分类,这里是数据源:

df = pd.read_csv(fileIn, header = 0, encoding='utf-8-sig')
rows = random.sample(df.index, int(len(df) * 0.9))

work = df.ix[rows]

work_test = df.drop(rows)

X_train = []

y_train = []

X_test = []

y_test = []
for i in work[[i for i in list(work.columns.values) if i.startswith('Change')]].values:
    X_train.append(','.join(i.T.tolist()))

X_train = np.array(X_train)

for i in work[[i for i in list(work.columns.values) if i.startswith('Corax')]].values:
    y_train.append(list(i))


for i in work_test[[i for i in list(work_test.columns.values) if i.startswith('Change')]].values:
    X_test.append(','.join(i.T.tolist()))

X_test = np.array(X_test)

for i in work_test[[i for i in list(work_test.columns.values) if i.startswith('Corax')]].values:
    y_test.append(list(i))


lb = preprocessing.MultiLabelBinarizer()

Y = lb.fit_transform(y_train)

然后我将它发送到前面提到的管道

1 个答案:

答案 0 :(得分:2)

好的,我在代码中做了一些调查。 OneVsRestClassifier尝试首先调用decision_function,如果失败 - 它将用于基类分类器的predict_proba函数(在我们的例子中是svm.svc)。

据我所知,我的X_test是numpy.array的字符串列表。在它经历了管道CountVectorizer中指定的一系列转换之后 - > TfidfTransformer它变成了一个稀疏矩阵(通过设计这些东西)。正如我所看到的,目前decision_function不适用于稀疏矩阵,甚至在github上有一个开放的建议:https://github.com/scikit-learn/scikit-learn/issues/73

因此,总而言之,看起来您无法使用svm.svc进行多标记分类,除非您指定probability = True。如果你这样做,你会给classifier.fit过程带来一些开销,但它会起作用。