尤度推定を使用したカテゴリ変数のエンコード


22

尤度推定を使用してカテゴリ変数をエンコードする方法を理解しようとしていますが、これまでのところほとんど成功していません。

どんな提案も大歓迎です。


ターゲットラベルがない場合の予測時間中に何をすべきか?
ランジートシン

回答:


24

私もこのトピックを学んでいましたが、これらは私が見つけたものです:

  • このタイプのエンコーディングは、尤度エンコーディングインパクトコーディング、またはターゲットコーディングと呼ばれます

  • 目的は、ターゲット変数(タスクに応じて連続的またはカテゴリカル)を使用してカテゴリ変数をエンコードすることです。たとえば、回帰タスクがある場合は、カテゴリ変数をターゲットの平均でエンコードできます。すべてのカテゴリについて、(このカテゴリ間で)ターゲットの対応する平均を計算し、カテゴリの値をこの平均で置き換えます。

  • 分類タスクがある場合は、すべてのカテゴリ値に関してターゲットの相対頻度を計算します。

  • 数学的な観点から見ると、このエンコードは、各カテゴリ値に応じて、ターゲットの確率を意味します。

  • 上記の簡単な方法でそれを行うと、おそらく偏った推定値が得られます。そのため、Kaggleコミュニティでは、通常2レベルの相互検証を使用します。読むここraddarでこのコメントを。対応するノートブックはこちらです。

引用:

yの平均値を取っています。しかし、単純な意味ではなく、クロスバリデーションの方法でのクロスバリデーションです。

20倍の相互検証があるとします。#2折り目からの情報のみを使用して、#1折り目の特徴の平均値を計算する必要があります。

したがって、#2〜#20の折り目を取り、その中に別の相互検証セットを作成します(10倍にしました)。Leave-One-Outフォールドごとに平均値を計算します(最終的に10の平均値を取得します)。これらの10個の平均を平均し、そのベクトルをプライマリ#1検証セットに適用します。残りの19の折り畳みについてもこれを繰り返します。

説明するのは難しく、理解するのも習得するのも難しいです:)しかし、正しく行われれば多くの利点をもたらすことができます:)

  • このエンコーディングの別の実装はこちらです。

  • Rライブラリvtreatでは、インパクトエンコーディングが実装されています。この投稿を参照してください。

  • CatBoostライブラリ彼らがターゲットエンコーディングを含むカテゴリ変数のエンコーディングのための多くのオプションを持っています。

  • sklearnにはそのようなエンコーディングはまだありません。


1
ターゲットエンコーディングはでありSklearn-contribのカテゴリ・エンコーダ
ジョシュ・

どのようにあなたがターゲットエンコーディングを使用した場合の機能の相互作用を実現するのでしょうか?たとえば、F1とF2をターゲットエンコードされました。あなただけの多重暗号化値F1 * F2のでしょうか?
マイケル

各LOOフォールドの平均を計算し、それらの平均を取ると、#2〜#20フォールドの平均を取るのとまったく同じになります。これがなぜCVと見なされるかわかりません。また、10個の平均を平均すると、彼が「ベクトル」で何を意味するのか理解できません。
SiXUlm

後半のコメント; Category Encodersのターゲットエンコーディングは、単純な平均エンコーディングです。raddarで説明されているfolds-with-folds正則化は実行されません。
ダンScally

7

target_encoders パッケージを介して、sklearnでターゲットエンコーディングを使用できるようになりました

ターゲットエンコーダ

class category_encoders.target_encoder.TargetEncoder(verbose = 0、cols = None、drop_invariant = False、return_df = True、im​​pute_missing = True、handle_unknown = 'impute'、min_samples_leaf = 1、smoothing = 1)

カテゴリ機能のターゲットエンコード。休暇1アウト・アプローチに基づきます。

上記のコメントにジョシュで述べたように。


1

尤度エンコーディングは、scikit学習ではまだ利用できません。辞書を作成してから、置換関数を実行してください。

dict1 = {'cate1':1,'cate2':1,'cate3':2,'cate4':2}
for i in df.shape[0]:
    df.iloc[i] = dict1[df.iloc[i]] 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.