2017-02-20 5 views
0

私はRのメーリングリストでこの質問をしましたが、ここでは回答とヒントを探すより良い場所だと思います。SVMを使用したテキスト分類に関する特徴空間の違いを扱う

私は現在、特定のクラスに合ったテキストを特定するために、 を試して、学生のエッセイのテキスト分類に取り組んでいます。私は からのテキストを使用して、別の学期の訓練と文章のために(A) の分類子をテストします。

  • Aからすべてのテキストを読んで、およそ1387項(パッケージTM)
  • でDTM(A)をビルドBからすべてのテキストを読んで、およそ626でDTM(B)を構築:私のワークフローは、このようなものです用語SVM(パッケージe1071中)を使用して
  • 電車DTM(A)と分類器、

は今、私はclassifyerを使用してDTM(B)内のすべてのテキストを分類します。しかし、 私はpredict()を使用しようとすると、私はいつもエラーメッセージを受け取ります: eval(expr、envir、enclos)のエラー:オブジェクト 'XY'が見つかりません。 DTM(A)とDTM(B)の語義はそれぞれ と異なるため、DTM(B)で使用できる用語はすべて ではありません。

もちろん、2つの異なるフィーチャスペースで分類するのは問題ですが、この「現実世界の問題」の解決策を見つけたいと思います。この考えは、生徒が他のテキストに合っているかどうかを判断することです。だから私の素朴なアイデアは、ある学期のテキスト(DTM(A))を使って予測モデルを開発し、このモデルを使って別の学期[DTM(B)]から新しいテキストを評価することです。新しいテキストが元のDTMにないため、フィーチャスペースが異なります。これまではすべてのテキストから作成されたDTMを使用するコードしか見つかりませんでしたが、これは新しいDTM(A)を作成し、毎回SVMを再調整する必要があります。

私の質問は:これはどうすればよいですか?同一の特徴空間を得るために、DTM(A)とDTM(B)で使用される用語 に一致させる必要がありますか? これは、DTM(A)またはDTM(B)にいくつかの空/ NA列を追加する の用語の数を減らすことで達成できます。または、別の解決方法がありますか? 私の問題に?

種類はいくつかのより多くの実験といくつかの研究の後

ビョルン

+0

私はhttp://stackoverflow.com/questions/39721737/how-to-handle-errors-in-predict-function-of-rがあなたを助けることができると思います。 – abhiieor

+0

ありがとうございましたが、あなたがリンクした投稿は、DTMの異なる列を意味する異なる機能スペースについてではなく、異なるカテゴリのカテゴリ変数についてです。 – PsyR

+0

あなたは一般化することができます。新しい学習者を扱う機械学習方法はありません。基本的に新しいレベルのカテゴリ変数のダミー変数を作成すると得られます。ですから、本質的に私の答えで言われたように、あなたはトレーニングの一部である変数のリストを維持する必要があります。このリストに基づいてテスト/予測データをフィルタリングし、訓練されたオブジェクトのスコアリングに進みます。 – abhiieor

答えて

0

について、私は「)(create_matrix」RTextToolsパッケージとその機能に出くわしました。この関数は新しいDTMを作成し、モデルをトレーニングするために使用されたoriginalMatrixに行列を調整することもできます。これはまさに私が探していたものでした。だから私は、元のコード(https://github.com/timjurka/RTextTools/blob/master/RTextTools/R/create_matrix.R)を見て、これを思い付いた:

# get all the terms which are in the training df, but not in the test df 
terms <- colnames(train.df[,which(!colnames(train.df) %in% colnames(test.df))]) 
# weight is set, this is just in case that weightTfIdf was used, otherwise it should be 0 
weight <- 0.000000001 
# now create a new matrix with the missing terms 
amat <- matrix(weight, nrow = nrow(test.df), ncol = length(terms)) 
colnames(amat) <- terms 
rownames(amat) <- rownames(test.df) 

# create a new test df with the original values plus the new matrix with the missing terms 
test.df.fixed <- cbind(test.df[,which(colnames(test.df) %in% colnames(train.df))],amat) 
test.df.fixed <- test.df.fixed[, sort(colnames(test.df.fixed))] 

結果は訓練のために使用されたデータフレームのすべての機能(列)を持っているテストデータフレームです。基本的には、ダウンフィルタリングの代わりに「アップフィルタリング」です。クイックテストはそれがかなりうまくいくことを示しました(精度:.91、河童:.88)。

0

実際の設定では、トレーニングデータとテストデータは完全に独立しています。これは、あなたのテストドキュメントについて何も知らないことを意味します。これを念頭に置いて、問題を解決する最良の方法は、データセットBのTDMを、データセットAで使用されている語彙(たとえば、Aで発生した単語のみカウントする)に基づいて設定することです。

関連する問題