Я попытался добиться многоуровневой классификации с помощью классификатора Pipeline\onevsrest в scikit-learn. Код приведен ниже, но сначала позвольте мне упомянуть, что я строю свои примеры с несколькими метками из кадра данных 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
. predict_proba
недоступен на svm.SVC
, если вы не укажете probability=True
. С другой стороны, как я вижу в коде, decision_function
не реализовано для разреженных матриц. Таким образом, мой код не работает, поскольку ни один из этих двух обязательных методов недоступен. Но может я что-то не так делаю? Можно ли каким-то образом добиться многоуровневой классификации с помощью svm.SVC
без указания probability=True?
(это значительно увеличивает нагрузку на обучение классификатора), возможно, каким-то образом заставив TfidfTransformer выводить плотную матрицу вместо разреженной?