[英]scikit-learn - making multilabel classification with svm.svc classifier, is it possible without probability=True?
我试图在scikit-learn中使用Pipeline \\ onevsrest分类器实现多标签分类。 代码在下面,但首先让我提及,我是从pandas数据框构造多标签示例的。
代码如下:
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)
classifier = Pipeline([('vectorizer', CountVectorizer()),('tfidf', TfidfTransformer()),('clf', OneVsRestClassifier(SVC(kernel='rbf')))])
classifier.fit(X_train, Y)
predicted = classifier.predict(X_test)
但是问题是,当您使用以下一组转换时: CountVectorizer -> TfidfTransformer
您将获得一个稀疏矩阵。 问题是,当你试图预测标签使用OneVsRest分类它看起来decision_function
或predict_proba
方法。 除非您指定svm.SVC
probability=True
否则predict_proba
上的svm.SVC
不可用。 在另一方面,正如我在代码中看到, decision_function
没有为稀疏矩阵来实现。 因此,我的代码失败了,因为这两个必需方法都不可用。 但是也许我做错了什么? 是否可以通过svm.SVC
以某种方式实现多svm.SVC
分类而无需指定probability=True?
(这样做会给分类器训练增加一些可观的开销),也许是通过强迫TfidfTransformer输出密集矩阵而不是稀疏矩阵来实现的?
这是一个众所周知的问题 ,目前尚不存在简单的解决方案。
您可以使用Pipeline来“ .toarray
”稀疏数据(通过调用.toarray
),但这会消耗大量内存。 您可以执行TruncatedSVD (AFAIK,这是唯一适用于稀疏数据的降维方法),但是它可能会使您的数据混乱,从而降低SVM的性能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.