分類子のエンコーディング

Aug 24 2020

ロジスティック回帰やSVMなどのモデルのパラメーターとして使用するためのカテゴリー変数のエンコード(私はこれらのようなタスクに精通していません)に関していくつか疑問があります。私のデータセットは次のようになります

Text                                  Symbol    Note    Account    Age   Label 
There is a red car                      !        red      John    24   1
My bag was very expensive               ?       orange    Luke    36  0
Where are my keys?                      @        red      Red     58  1
I promise: I will never let you go!    ...       green    Aoife   28  0

テキストには、コミュニティのユーザーからのコメントが保存されています。シンボルには、ユーザーが最もよく使用するシンボルが含まれます。注はそのレベルを表します。緑はより経験豊富で、赤は新しい参加者です。アカウントはユーザー名です。ラベルは、ユーザーの信頼できる情報を提供します。0の場合、ユーザーは偽物ではありません。1つであれば、ユーザーはボットの可能性があります。

現在の情報に基づいて新しいユーザーを分類したいと思います(上記の列を参照)。私のデータセットには、1000行以上と400ユーザーが含まれています。分類子を使用するには、カテゴリフィールドをエンコードする必要があるためMultiColumnLabelEncoder、sklearnで使用して次のようにしようとしました。

MultiColumnLabelEncoder(columns = ['Text', 'Symbol', 'Note', 'Account']).fit_transform(df)

ここで、dfは私のデータフレームです。しかし、私は、onehotencoderも望ましいはずだと理解しました。同じアカウントからのコメントが多い可能性があるため、アカウントも含めました。そのため、アカウントを偽物として分類し、同じアカウントから新しいコメントを受け取った場合、このアカウントは簡単に偽物として検出される可能性があります。先に述べたように、目的は、与えられた情報(記号、メモ、年齢、テキスト)に基づいて、テストセットから新しい要素を特定の精度で分類することです。つまり、これらの変数間の可能な相関関係を探します。新しいアカウントは偽物(1)か偽物(0)かを言うことができます。

ご覧のとおり、この問題は、パラメーターが数値であるだけでなく、カテゴリーでもある分類子に関連しています。
データの前処理(ストップワードの削除とデータのクリーニング)には、nltkのPythonパッケージを使用しました。特徴抽出(次のステップにリンクされているため、これは重要なポイントになるはずです。つまり、分類子を使用してクラス-1または0を予測します)、エンコードからどのような出力を期待するかを理解するのが難しいことがわかりました。上記の情報をモデルの入力として使用できます(ターゲットはラベルと呼ばれ、バイナリ値です)。分類器のロジスティック回帰として使用していますが、SVMも使用しています。

私が期待する出力は、16歳のユーザーXの場合、記号#、メモWonderful、メモred(新しいジョイナー)は、特定の割合の偽物として分類されます。

新しいユーザーのラベル(偽物か偽物ではないか)を決定するためにロジスティック回帰内で変数を使用できるデータセットにデータセットを変換する方法を誰かが段階的に説明してくれれば幸いです。

回答

1 hssay Aug 28 2020 at 19:05

テキスト処理と1つのホットエンコーディングを組み合わせて使用​​する必要があります。テキスト列は、データセット内の一意の文ごとに1つの新しい変数を作成しようとするため、ワンホットエンコードとして扱われるべきではありません。これは非常に多くなります(学習にはあまり役立ちません)。テキストベクトライザーは、そこに表示される単語/トークンのタイプに基づいてテキスト列を要約します。

したがって、最初にテキスト列のみを処理するには、テキストベクトライザーを使用する必要があります。これにより、1つのデータフレーム(たとえばA)が得られます。このデータフレームには、データセット内のトークン/単語に対応する列があります。したがって、テキストベクトライザーが100個の一意の単語を取得すると、1000x100サイズのデータ​​フレームが作成されます。これらの100列は、テキストベクトライザーによってのみ生成されていることに注意してください。

記号やメモには、ワンホットエンコーディングを使用できます。これにより、別のデータフレーム(たとえばB)が取得されます。次に、共通キーでAとBを結合して、入力された場合に最終的なデータフレームを取得する必要があります。ここでの共通キーは行IDです(ただし、ユーザーレベルでのデータの集計に関する次のコメントを読んでください)。

ユーザー名(アカウント)列がデータ内で一意であるかどうかは明確ではありませんか?1000行あるが400ユーザーしかない場合、ユーザーごとに複数の行が存在する可能性があることを意味します。その場合、ユーザーレベルでデータを集約することを検討できます(テキスト列の場合、同じユーザーのすべての文字列を単純に連結できます)。