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(入力を減らすため)に配置されます。 __
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)として知られています。
これはまさにあなたのユースケースです。
NaiveBayes
分類器には離散値の特徴が必要ですが、PCAは特徴のこの特性を破ります。 PCAを使用する場合は、別の分類子を使用する必要があります。
NBで機能する他の次元削減方法があるかもしれませんが、私はそれらについて知りません。多分単純 特徴選択 うまくいくかもしれません。
補足:PCAを適用した後で機能を離散化することもできますが、これは良い考えではないと思います。
問題は、次元削減を適用することにより、ネガティブな特徴が生成されることです。ただし、Multinominal NBは否定的な機能を取りません。 this の質問を参照してください。
RandomForestなどの別の分類子を試すか、sklearn.preprocessing.MinMaxScaler()
を使用してトレーニング機能を[0,1]
にスケーリングしてみてください