web-dev-qa-db-ja.com

任意のテキスト分類にPCAを適用することは可能ですか?

Pythonで分類しようとしています。私はWebページにNaiveBayes MultinomialNB分類器を使用しています(Webからテキストへのデータの取得。後でこのテキストを分類します:Web分類)。

今、私はこのデータにPCAを適用しようとしていますが、pythonはいくつかのエラーを出します。

ナイーブベイズで分類するための私のコード:

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)

しかし、これは次のエラーを発生させます:

raise TypeError( 'スパース行列は渡されましたが、密です' TypeError:スパース行列は渡されましたが、密データが必要です。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)

最終分類のエラー:

値を上げるError( "入力Xは非負でなければなりません")ValueError:入力Xは非負でなければなりません

一方では、私のデータ(temizdata)はナイーブベイズのみに配置され、もう一方では、temizdataは分類するよりも最初にPCA(入力を減らすため)に配置されます。 __

11
zer03

sparse行列をdenseに変換するのではなく(推奨されません)、PCAに似たscikits-learnの TruncatedSVD を使用します。スパースデータで機能する次元縮小アルゴリズム(デフォルトではランダム化SVDを使用):

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

そして、TruncatedSVDドキュメントから引用:

特に、切り捨てられたSVDは、sklearn.feature_extraction.textのベクトライザーによって返されるterm count/tf-idf行列で機能します。その文脈では、それは潜在意味解析(LSA)として知られています。

これはまさにあなたのユースケースです。

14
Imanol Luengo

NaiveBayes分類器には離散値の特徴が必要ですが、PCAは特徴のこの特性を破ります。 PCAを使用する場合は、別の分類子を使用する必要があります。

NBで機能する他の次元削減方法があるかもしれませんが、私はそれらについて知りません。多分単純 特徴選択 うまくいくかもしれません。

補足:PCAを適用した後で機能を離散化することもできますが、これは良い考えではないと思います。

4
kazemakase

問題は、次元削減を適用することにより、ネガティブな特徴が生成されることです。ただし、Multinominal NBは否定的な機能を取りません。 this の質問を参照してください。

RandomForestなどの別の分類子を試すか、sklearn.preprocessing.MinMaxScaler()を使用してトレーニング機能を[0,1]にスケーリングしてみてください

0
Justin Lange