6

私は、いくつかのドキュメントを 2 つのクラスに分類しようとしています。このクラスでは、TfidfVectorizer を特徴抽出手法として使用しています。

入力データは、浮動データ、ラベル、およびドキュメント本文のテキスト BLOB の約 12 個のフィールドを含むデータ行で構成されます。本体を使用するために、TfidfVectorizer を適用し、スパース行列を取得しました ( toarray() を介して配列に変換することで調べることができます)。通常、この行列は非常に大きく、数千から数千の次元があります。これを 1000 x 15000 のサイズの F としましょう。

Scikit で分類子を使用するには、(行数 * 特徴数) である入力行列 X を与えます。本体を使用しない場合は、サイズ 1000 x 15 の X を持っている可能性があります。

ここに問題があります。この F を X に水平にスタックすると、X は 1000 x 15015 になり、いくつかの問題が発生します。2) メモリ不足。

Scikit は、TfidfVectorizer 入力のみを使用する例を提供していますが、メタデータと一緒に使用する方法については明らかにしていません。

私の質問は、TfidfVectorizer の出力をメタデータと一緒に使用して、トレーニング用の分類器に適合させるにはどうすればよいですか?

ありがとうございました。

4

3 に答える 3

8
  1. bag of words (tf-idf) の特徴を抽出し、これらを と呼びますX_tfidf

  2. メタデータ機能を抽出し、これらを呼び出しますX_metadata

  3. それらを一緒に積み重ねます:

    X = scipy.sparse.hstack([X_tfidf, X_metadata])
    
  4. 期待どおりに動作しない場合は、再正規化を試してください。

    from sklearn.preprocessing import normalize
    X = normalize(X, copy=False)
    

LinearSVCLogisticRegressionまたはなどの線形推定量を使用する場合SGDClassifier、特徴が分類で果たす役割について心配する必要はありません。これは見積もり担当者の仕事です。線形推定器は、個々の特徴に重みを割り当て、その特徴がどれほど有益であるかを示します。つまり、これを計算します。

(カーネル SVM や k-NN な​​どの非パラメトリックな距離/類似度ベースのモデルは、そのようなデータセットでは困難な場合があります。)

于 2013-10-19T17:26:29.970 に答える
0

考えられる解決策は、 sklearn.decomposition.NMFX_tfidfなどのトピック モデルを使用してセマンティック プロジェクションを実行することです。

これにより、スパース行列の入力が可能になり、非スパース小次元の特徴のセットが出力されます。したがって、これにより、上記の回答で言及されている 2 つの問題 (スパース入力と限られたメモリ) が克服されます

X_tfidfベクトルを 20 次元の特徴ベクトルに射影する例:

nmf = NMF(n_components=20)
nmf.fit(data)
X_transformed = nmf.transform(X_tf_idf)

ここで「データ」とは、因数分解モデルに適合するために与えられた機能のセット (理想的には、保留された機能のセット) です。

そして、それを他の機能と安全にマージできます

X = scipy.sparse.hstack([X_transfored, X_metadata])

PCA などの他の予測も可能ですが、テキスト分類では、NMF やSVDなどの行列分解によるトピック モデルが一般的です。

于 2016-04-28T12:49:33.230 に答える