我正在尝试进行如下的一个分类:
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)
然后我将它发送到前面提到的管道
答案 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过程带来一些开销,但它会起作用。