Возможно ли применить PCA на любую текстовую классификацию?

Я пытаюсь классифицировать с помощью python. Я использую классификатор Naive Bayes MultinomialNB для веб-страниц (извлечение веб-формы данных в текст, позже я классифицирую этот текст: классификация в Интернете).

Теперь я пытаюсь применить PCA к этим данным, но python дает некоторые ошибки.

Мой код для классификации с Naive Bayes:

from sklearn import PCA
from sklearn import RandomizedPCA
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
vectorizer = CountVectorizer()
classifer = MultinomialNB(alpha=.01)

x_train = vectorizer.fit_transform(temizdata)
classifer.fit(x_train, y_train)

Эта классификация наивных заливов дает результат:

>>> x_train
<43x4429 sparse matrix of type '<class 'numpy.int64'>'
    with 6302 stored elements in Compressed Sparse Row format>

>>> print(x_train)
(0, 2966)   1
(0, 1974)   1
(0, 3296)   1
..
..
(42, 1629)  1
(42, 2833)  1
(42, 876)   1

Чем я пытаюсь применить PCA к своим данным (temizdata):

>>> v_temizdata = vectorizer.fit_transform(temizdata)
>>> pca_t = PCA.fit_transform(v_temizdata)
>>> pca_t = PCA().fit_transform(v_temizdata)

но это поднимает следующие erros:

raise TypeError ('Разрешенная матрица передана, но плотная' TypeError: A была разрешена разреженная матрица, но необходимы плотные данные. Использовать X.toarray() для преобразования в плотный массив numpy.

Преобразую матрицу в матрицу densematrix или numpy. Затем я попытался создать новую densematrix, но у меня есть ошибка.

Моя основная цель заключается в том, что тест PCA влияет на классификацию текста.

Преобразовать в плотный массив:

v_temizdatatodense = v_temizdata.todense()
pca_t = PCA().fit_transform(v_temizdatatodense)

Наконец, попробуйте classfy:

classifer.fit(pca_t,y_train)

ошибка для final classfy:

повысить значение ValueError ( "Вход X должен быть неотрицательным" ) ValueError: Input X должен быть неотрицательным

С одной стороны мои данные (temizdata) помещаются только в Naive Bayes, с другой стороны temizdata сначала помещаются в PCA (для уменьшения входов), чем классифицируются. __

Ответ 1

Вместо преобразования матрицы sparse в dense (что обескуражено), я бы использовал scikits-learn TruncatedSVD, который является PCA-подобным алгоритмом уменьшения яркости (используя по умолчанию Randomized SVD), который работает с разреженными данными:

svd = TruncatedSVD(n_components=5, random_state=42)
data = svd.fit_transform(data) 

И, ссылаясь на документацию TruncatedSVD:

В частности, усеченный SVD работает на матрицах count count/tf-idf, возвращаемых векторизаторами в sklearn.feature_extraction.text. В этом контексте он известен как скрытый семантический анализ (LSA).

который является именно вашим прецедентом.

Ответ 2

Классификатору NaiveBayes нужны дискретнозначные функции, но PCA нарушает это свойство функций. Вам нужно будет использовать другой классификатор, если вы хотите использовать PCA.

Могут быть другие методы уменьшения размерности, которые работают с NB, но я не знаю об этом. Возможно, может работать простой выбор функции.

Примечание: вы можете попытаться дискретировать функции после применения СПС, но я не думаю, что это хорошая идея.

Ответ 3

Проблема в том, что, применяя уменьшение размерности, вы будете генерировать негативные особенности. Тем не менее, Multinominal NB не принимает отрицательных черт. Пожалуйста, обратитесь к этим вопросам.

Попробуйте другой классификатор, такой как RandomForest, или попробуйте использовать sklearn.preprocessing.MinMaxScaler() для масштабирования ваших тренировочных функций до [0,1]