我正在尝试像下面这样进行onevsrest分类:
classifier = Pipeline([('vectorizer', CountVectorizer()),('tfidf', TfidfTransformer()),('clf', OneVsRestClassifier(SVC(kernel='rbf')))])
classifier.fit(X_train, Y)
predicted = classifier.predict(X_test)
我得到错误"当概率 = false 时predict_proba不可用"。我看到报告了一个错误,如下所示:https://github.com/scikit-learn/scikit-learn/issues/1946
它被关闭为固定,所以我从我的Windows PC上杀死了scikit-learn,并完全重新下载了scikit-learn版本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)
之后,我将其发送到前面提到的管道
好的,我在代码中做了一些调查。OneVsRestClassifier首先尝试调用decision_function如果失败 - 它将用于基本分类器predict_proba函数(在我们的例子中为svm.svc)。
据我所知,我的X_test是 numpy.array of string of strings。在它经历管道 CountVectorizer -> TfidfTransformer 中指定的一系列转换后,它变成了一个稀疏矩阵(通过这些东西的设计)。正如我目前所看到的,decision_function不适用于稀疏矩阵,甚至在 github 上有一个公开的建议:https://github.com/scikit-learn/scikit-learn/issues/73
因此,总而言之,除非您指定 probability=True,否则您似乎无法使用 svm.svc 进行多标签分类。如果这样做,则会给分类器.fit进程带来一些开销,但它会起作用。