Я задул свои мозги за последние 2-3 недели по этой проблеме. У меня проблема с несколькими метками (не многоклассы), где каждый образец может принадлежать нескольким ярлыкам.
У меня около 4,5 миллионов текстовых документов в качестве учебных данных и около 1 миллиона в качестве тестовых данных. Этикетки составляют около 35K.
Я использую scikit-learn. Для извлечения функций я ранее использовал TfidfVectorizer, который вообще не масштабировался, теперь я использую HashVectorizer, который лучше, но не настолько масштабируемый, учитывая количество документов, которые у меня есть.
vect = HashingVectorizer(strip_accents='ascii', analyzer='word', stop_words='english', n_features=(2 ** 10))
SKlearn предоставляет OneVsRestClassifier, в который я могу подать любую оценку. Для multi-label я нашел LinearSVC и SGDClassifier только для правильной работы. В соответствии с моими показателями SGD превосходит LinearSVC как в памяти, так и во времени. Итак, у меня есть что-то вроде этого
clf = OneVsRestClassifier(SGDClassifier(loss='log', penalty='l2', n_jobs=-1), n_jobs=-1)
Но это связано с серьезными проблемами:
- OneVsRest не имеет метода partial_fit, который делает невозможным обучение из-за ядра. Есть ли альтернативы для этого?
- HashingVectorizer/Tfidf работают на одном ядре и не имеют никакого параметра n_jobs. Это требует слишком много времени для хэширования документов. Любые альтернативы/предложения? Правильно ли значение n_features?
- Я опробовал 1 миллион документов. Хешинг занимает 15 минут, и когда дело доходит до clf.fit(X, y), я получаю MemoryError, потому что OvR внутренне использует LabelBinarizer и пытается выделить матрицу измерений (y x classes), которую довольно трудно выделить. Что мне делать?
- Любые другие библиотеки, которые имеют надежные и масштабируемые алгоритмы с несколькими метками? Я знаю о гениальности и махауте, но у обоих из них нет ничего для многоадресных ситуаций?