2017-01-13 15 views
1

これは、MLとPythonでの文書分類の私の最初の試みです。新しい文書を分類する - ランダムフォレスト、単語の束

私は最初のマネーロンダリングに関連する5000件の記事を抽出し、その後、私はマネーロンダリングに関連していない500件の記事を抽出しても、私は連結DF
  • をパンダに変換DF
  • をパンダにそれらを変換するために、自分のデータベースを照会
    1. DFSのいずれか「マネーロンダリング」や
    2. 「その他」のラベルを付け、私は(句読点とストップワード、下部ケースなどを取り除く)
    3. を前処理しないし、次に以下のように言葉原理の袋に基づくモデルを養う両方:

      vectorizer = CountVectorizer(analyzer = "word", 
              tokenizer = None,  
              preprocessor = None, 
              stop_words = None, 
              max_features = 5000) 
      
      text_features = vectorizer.fit_transform(full_df["processed full text"])  
      text_features = text_features.toarray()  
      labels = np.array(full_df['category']) 
      X_train, X_test, y_train, y_test = train_test_split(text_features, labels, test_size=0.33)  
      forest = RandomForestClassifier(n_estimators = 100)  
      forest = forest.fit(X_train, y_train)  
      y_pred = forest.predict(X_test)  
      accuracy_score(y_pred=y_pred, y_true=y_test) 
      

    それは(私に99%をあまりにも高い精度を与えていても)今まで正常に動作します。しかし、私は完全に新しいテキスト文書でこれをテストしたいと思っています。私はそれをベクトルとforest.predict(test)をすれば、それは明らかに言う:

    ValueError: Number of features of the model must match the input. Model n_features is 5000 and input n_features is 45 
    

    私は、これは全く新しい記事を分類することができるように克服するかどうかはわかりません。

  • +0

    ベクトル化関数は、テキストのコーパスを(多次元の)空間にマッピングします。あなたはチェックするべきですが、私の視点では、マッピング関数はコーパス依存であるため、テキストの最初のコーパスではない新しいテキストを追加すると、以前のマッピングはこの新しいテキスト。これがあなたのケースでは、まったく新しいテキストで、コードが実行されない理由です。あなたの質問を解決するためのML /統計的方法がありますが、プログラミングの質問よりも統計的に難しいと思います。 – probaPerception

    +1

    あなたのベクタライザを再フィットしているようです。訓練の段階では、ベクタライザとクラシファイアを合わせることを忘れないでください。予測ステージでは、ベクトル化器で変換を呼び出し、分類器で予測します。 – bogs

    +0

    @probaPerceptionあなたが正しいです、新しい記事がモデルに収まるはずでした。それ以外の場合は意味がありません。 – pawelty

    答えて

    2

    まず、私の命題がうまくいくかもしれませんが、私は強く、このコードを実行する前に理解しておく必要がある統計的および計算上の結果があることを強く強調します。 テキストの最初のコーパスがfull_df["processed full text"]で、testがテストしたい新しいテキストであるとします。 次に、full_dftestというテキストのコーパスをfull_addedと定義します。

    text_features = vectorizer.fit_transform(full_added)  
    text_features = text_features.toarray()  
    

    あなたの列車セット(X_train = full_df["processed full text"]y_train = np.array(full_df['category']))としてfull_dfを使用することができます。 そしてあなたはもちろん

    forest = RandomForestClassifier(n_estimators = 100)  
    forest = forest.fit(X_train, y_train)  
    y_pred = forest.predict(test)  
    

    を実行することができますが、このソリューションでは、あなたはすでにあなたのパラメータを定義している、あなたは新しいデータにモデルが堅牢考えます。

    別の言葉では、解析する入力として新しいテキストのストリームがある場合、新しいvectorizer.fit_transform(full_added)を計算する計算時間が劇的に増加するため、このソリューションは恐ろしいでしょう。

    私はそれが役に立ちそうです。

    +0

    ありがとうございます。ええ、それは理にかなっています。私はそれがマトリックスを再計算する必要があるすべての新しい記事と同じように最善の解決策ではないことに同意します。私もネイティブベイズを試してみましたが、トレーニングの時間がかかり過ぎ、最終的には記憶がなくなりました... – pawelty

    1

    Naive Bayesの最初の実装は、Text Blobライブラリからのものでした。それは非常に遅く、私のマシンは最終的にメモリ不足になりました。

    2回目の試行はこの記事http://zacstewart.com/2015/04/28/document-classification-with-scikit-learn.htmlに基づき、sklearn.naive_bayesライブラリのMultinomialNBを使用しました。そして、それは働いていた魅力を気に入っ:

    #initialize vectorizer 
    count_vectorizer = CountVectorizer(analyzer = "word", 
              tokenizer = None,  
              preprocessor = None, 
              stop_words = None, 
              max_features = 5000) 
    counts = count_vectorizer.fit_transform(df['processed full text'].values) 
    targets = df['category'].values 
    
    #divide into train and test sets 
    X_train, X_test, y_train, y_test = train_test_split(counts, targets, test_size=0.33) 
    
    #create classifier 
    classifier = MultinomialNB() 
    
    classifier.fit(X_train, y_train) 
    
    #check accuracy 
    y_pred = classifier.predict(X_test) 
    accuracy_score(y_true=y_test, y_pred=y_pred) 
    
    #check on completely new example 
    new_counts = count_vectorizer.transform([processed_test_string]) 
    prediction = classifier.predict(new_counts) 
    prediction 
    

    出力:

    array(['money laundering'], 
         dtype='<U16') 
    

    と精度は約91%ので、より現実的な99.96パーセントより..です

    まさに私が望むもの。最も有益な機能を見てもいいですか、私はそれを解決しようとします。みんな、ありがとう。

    関連する問題