#python #machine-learning #scikit-learn
#python #машинное обучение #scikit-учиться
Вопрос:
У меня проблема, которая требует использования системы классификации одного класса. В настоящее время я использую python для разработки, и в результате я использую sci-kit learn для задач машинного обучения.
Из их документации следует, что OneClassSVM должен работать так, как можно было бы ожидать (приводить положительные примеры только для обучения), но результирующая модель дает мне очень неточные результаты — даже по исходным данным обучения.
X = generate_data() # Generate matrix of tf-idf document vectors
cls = OneClassSVM(kernel='rbf', gamma=0.1, nu=0.1)
cls.fit(X)
y = cls.predict(X)
print y[y == 1].size / y.size
Приведенный выше (упрощенный) фрагмент кода возвращает показатель точности 40-55% для обучающих данных. Он намного хуже работает с новыми данными (как и следовало ожидать), и почти все результаты неверны.
Точность 40-55% по сути так же хороша, как и случайный классификатор, так что я делаю не так? Я попытался поиграть с параметрами gamma и nu, но, похоже, это мало что дало для меня.
Я знаю, что в реализации OneClassSVM используются методы, предложенные Scholkopf et. кроме того, альтернативой является метод описания данных опорных векторов (Tax и Duin), но это не реализовано в scikitlearn и потребует от меня самостоятельной реализации интерфейса для libsvm. Кроме того, насколько я понимаю, SVDDS примерно так же точны, как реализация OneClassSVM, поэтому существует вероятность того, что моя проблема вообще не будет решена.
Генерируемые обучающие данные представляют собой матрицу документов, представленных стандартным tf-idf.
Комментарии:
1. Ваши данные могут иметь чрезвычайно высокую размерность (судя по вашему комментарию о том, что это данные tf-idf). Гауссово ядро часто плохо работает в этой настройке.
2. Это действительно очень многомерно. Какие альтернативы (если таковые имеются) я должен рассмотреть в этом случае?
3. использование линейного ядра действительно повышает производительность, но оно все еще далеко от того, чтобы быть таким же хорошим, как при тестировании задач двоичной классификации. Это просто неотъемлемая проблема с классификацией одного класса?
4. К сожалению, это непростой случай, в моем сценарии довольно сложно создать хороший набор репрезентативных отрицательных данных. Это не значит, что я не могу генерировать отрицательные данные, просто существует так много отрицательных данных, что невозможно сгенерировать достаточно, чтобы действительно представлять отрицательное пространство экземпляров.
5. На странице Википедии PU learning приведена некоторая литература, которая может быть интересной. В книге Бинга Лю, в частности, показано, как адаптировать готовые классификаторы, такие как в scikit-learn, к задаче одного класса.