ツリーモデル(Pythonコード)でカテゴリ変数を処理する7つの方法

データマイニングプロジェクトのデータでは、データタイプは2つのタイプに分けることができます:順序付けられた連続数値と順序付けられていないカテゴリ機能。

xgboostやGBDTなどのブースティングツリーモデルの場合、基本的な学習は通常、カート回帰ツリーであり、カートツリーの入力は通常、連続数値タイプのみをサポートします。年齢や収入などの連続変数は、カートで適切に処理できますが、無秩序な変数カテゴリ変数(職業、地域など)、カートツリーの処理はより面倒です。カテゴリ機能のすべての可能な組み合わせを直接かつ激しく列挙すると、カテゴリ機能の分割点を簡単に見つけることができます。

この記事では、分類的特徴処理のためのツリーモデルの一般的な方法をリストします。それについて深く議論することを歓迎します。好きな場合は、好き、フォロー、お気に入りを忘れないでください。

[注]コード、データ、および技術交換の完全版は、記事の最後で入手できます。

1.ワンホットエンコーディング処理

写真カテゴリ機能に対してOnehot処理を直接実行でき(これも最も一般的な方法です)、各カテゴリの値は単一ビット0/1で表されます。つまり、「性別」カテゴリ機能を変換できるかどうかに変換できます。次のように「」「男性」、「女性」または「その他」です。

display(df.loc[:,['Gender_Code']].head())

# onehot 
pd.get_dummies(df['Gender_Code']).head()

ただし、onehotの主な欠点は、値が多いカテゴリフィーチャの場合、高次元のスパースフィーチャになり、ツリーモデルの過剰適合につながる可能性があることです。前述のように、高次元でスパースなワンホットフィーチャに直面すると、分割条件が満たされると、ツリーモデルは簡単に深くなります。ノイズ(つまり、過剰適合)である可能性があります。

使用に関する推奨事項:Onehotは当然ニューラルネットワークモデルに適しており、ニューラルネットワークは高次元のスパース特徴から低密度の密な表現を簡単に学習できます。ツリーモデルでonehotを使用すると、カテゴリフィーチャの数が少ない場合でも、より重要なインタラクティブフィーチャを学習できますが、値が大きい場合(100を超える場合など)は、過剰適合を引き起こしやすくなります。適していません。onehot+ツリーモデルを使用しています。写真(注:さらに、onehotには、メモリオーバーヘッドの増加やトレーニング時間のオーバーヘッドなどの欠点があります)

二、 Ordinal Encoder

OrdinalEncoderはシーケンシャルエンコーディングとも呼ばれ(ラベルエンコーディングと同じ、両方の関数は基本的に同じです)、機能/ラベルは序数整数(0からn_categories-1)に変換されます

使用法の提案:順序特徴に適しています。つまり、カテゴリの特徴ですが、固有の順序があります。たとえば、服のサイズ「S」、「M」、「L」などの特徴は整数に適しています。小さいものから大きいものへのエンコーディング。写真

from sklearn.preprocessing import  LabelEncoder
encoder = LabelEncoder()
df[col] = encoder.transform(df[col])

3.ターゲットエンコーディング

ターゲットエンコーディングは、平均エンコーディングとも呼ばれ、各カテゴリ機能に対応するラベル情報を使用してエンコードされます(たとえば、2つのカテゴリは、サンプルに対応するラベル値「0/1」の平均値を使用します。カテゴリ機能の各値)は、(従来のWoEコーディングに加えて)一般的に使用される監視されたコーディング方法の一種であり、ロジスティック回帰などの弱いモデルに非常に適しています。

使用に関する推奨事項:ツリーモデルがターゲットエンコーディングを使用する場合、ターゲットエンコーディング方法によって引き起こされる条件付きバイアスの現象を減らすためにいくつかの正則化手法を追加する必要があります(条件付きバイアスは、トレーニングデータセットのデータ構造と分布時に発生します。テストデータセットは異なります。主流の方法は、Catboostコーディングを使用するか、相互検証を使用してターゲット平均またはベイジアン平均を見つけることです。

写真

# 如下简单的target  mean代码。也可以用:from category_encoders import TargetEncoder 

target_encode_columns = ['Gender_Code']
target = ['y']

target_encode_df = score_df[target_encode_columns + target].reset_index().drop(columns = 'index', axis = 1)
target_name = target[0]
target_df = pd.DataFrame()
for embed_col in target_encode_columns:
    val_map = target_encode_df.groupby(embed_col)[target].mean().to_dict()[target_name]
    target_df[embed_col] = target_encode_df[embed_col].map(val_map).values
    
score_target_drop = score_df.drop(target_encode_columns, axis = 1).reset_index().drop(columns = 'index', axis = 1)
score_target = pd.concat([score_target_drop, target_df], axis = 1)

第四に、CatBoostEncoder

CatBoostEncoderは、CatBoostモデルがカテゴリ変数(順序付きTSエンコーディング)を処理するメソッドであり、ターゲットエンコーディングに基づいて条件付きオフセットを削減します。その計算式は次のとおりです。写真

  • TargetCount:指定されたカテゴリ機能のターゲット値の合計

  • 以前:データセット全体について、ターゲット値の合計/すべての観測された変数の数

  • FeatureCount:データセット全体で観察された特徴リストの出現数。

CBE_encoder = CatBoostEncoder()
train_cbe = CBE_encoder.fit_transform(train[feature_list], target)
test_cbe = CBE_encoder.transform(test[feature_list])

5. CountEncoder

頻度コーディングとも呼ばれ、各カテゴリ機能の値はトレーニングセットでの発生頻度に変換されます。直感的には、カテゴリ値の頻度が、高頻度カテゴリと低頻度カテゴリを分割するための基礎として使用されます。カテゴリー。効果については、ビジネスと実シーンを組み合わせる必要があります。

## 也可以直接 from category_encoders import  CountEncoder

bm = []
tmp_df=train_df
for k in catefeas:
    t = pd.DataFrame(tmp_df[k].value_counts(dropna=True,normalize=True)) # 频率
    t.columns=[k+'vcount']
    bm.append(t)
for k,j in zip(catefeas, range(len(catefeas))):# 联结编码
    df = df.merge(bm[j], left_on=k, right_index=True,how='left')

6、ニューラルネットワークの埋め込み

カテゴリに値が多い場合(onehotは高次元)、直接onehotを実行すると、パフォーマンスや効果の点で劣ります。現時点では、ニューラルネットワーク埋め込みを使用することをお勧めします。カテゴリ変数onehotをニューラルネットワークに入力して、word2vecを学習する、または監視対象のニューラルネットワークエンコーディングに基づく、従来の教師なし単語ベクトル表現などの低次元の高密度ベクトルを学習します。

使用に関する推奨事項:これは、多数のカテゴリ変数、onehot後の高次元スパースネスに特に適しており、NN低次元表現変換後にツリーモデルに適用されます。写真

# word2vec
from gensim.models import word2vec
# 加载数据
raw_sentences = ["the quick brown fox jumps over the lazy dogs","yoyoyo you go home now to sleep"]
# 切分词汇
sentences= [s.encode('utf-8').split() for s in sentences]

# 构建模型
model = word2vec.Word2Vec(sentences,size=10)  # 词向量的维数为10

#  各单词学习的词向量
model['dogs']  
# array([-0.00449447, -0.00310097,  0.02421786, ...], dtype=float32)

7、lgbカテゴリの機能処理

カテゴリ機能を処理するためのワンホットエンコーディング(1対多)の不十分さを解決するため。lgbは、多対多のセグメンテーション手法を採用しています。簡単に言えば、各カテゴリの値に対して数値エンコーディングを実行し(ターゲットエンコーディングと同様)、エンコードされた値に従ってより適切なセグメンテーションポイントを見つけ、カテゴリ機能セットの分類を実現します。 。より良いセグメンテーション。

  • 特定のアルゴリズムの原則:

1.機能値の数が4以下(パラメーターmax_cat_to_onehot):ワンホットエンコーディングを指示し、各ビンコンテナーを1つずつスキャンして、最適な分割点を見つけます。

2.機能値の数が4より大きい:最大ビンのデフォルト値は256です。値の数が最大ビンの数よりも大きい場合、頻度の低い値が除外されます。 。次に、各固有値に対応するサンプルの1次勾配の合計と2次勾配の合計をカウントし、1次勾配の合計/(2次勾配の合計+正則化)を取得します。係数)特徴値のエンコーディングとして。カテゴリを数値コードに変換した後、それらを大きいものから小さいものに並べ替え、ヒストグラムをトラバースして最適なセグメンテーションポイントを見つけます

簡単に言えば、Lightgbmは勾配統計を利用してカテゴリの特徴をエンコードします。私の個人的な理解では、このように、カテゴリ機能グループは学習の難しさに応じて分類できます。たとえば、特定の機能には、[オオカミ、犬、猫、豚、ウサギ]と[の下の5つのカテゴリの値があります。 wolf、dog]タイプサンプルの分類の難易度は非常に高く(この機能の値の下の勾配が大きい)、勾配コーディング後のカテゴリ機能では、より適切な分割点を探すと[wolf、dog]|vsになる可能性があります。 | [猫、豚、ウサギ]

写真

使用に関する推奨事項:通常はlgbカテゴリの機能処理を使用します。効果はワンホットエンコーディングよりも優れており、使用するのにも便利です。

# lgb类别处理:简单转化为类别型特征直接输入Lgb模型训练即可。
 for ft in category_list:
        train_x[ft] = train_x[ft].astype('category')
clf = LGBMClassifier(**best_params)
clf.fit(train_x, train_y)

経験の概要

  • 値の数が少ない(<10)カテゴリ機能の場合、各値の下の対応するサンプル数も比較的多く、Onehotで直接エンコードできます。

  • 多数の値(10から数百)の場合、onehotはlightgbmグラデーションエンコーディングやcatboostターゲットエンコーディングほど効率的または効果的ではなく、直接使用するのも非常に便利です。(個人的な慣習では、これらの2つの方法は、多くのカテゴリの値で比較的簡単に過剰適合することに注意してください。現時点では、カテゴリの値は、最初に経験と組み合わされるか、特定のカテゴリの機能を削除しようとした後、モデル効果が良いでしょう)

  • 数百または数千のカテゴリがある場合、最初にワンホット、次に(高次元スパース)、ニューラルネットワークモデルを使用して低次元の密な表現を行うことができます。

上記は、カテゴリ機能のメインツリーモデルのエンコード方法です。

おすすめ記事

テクノロジーエクスチェンジ

転載、収集、いいね、サポートへようこそ!

ここに画像の説明を挿入

現在、技術交流グループが開設されており、2,000人以上のメンバーがいます。追加する際のコメントとしては、情報源+興味の方向性が最適です。これは、志を同じくする友人を見つけるのに便利です。

  • 方法1.次の画像をWeChatに送信し、長押しして識別し、バックグラウンドで返信します。グループを追加します。
  • 方法②、マイクロ信号を追加:dkl88191、注:CSDNから
  • 方法③、WeChat検索パブリックアカウント:Python学習とデータマイニング、バックグラウンド応答:グループを追加

長押しフォロー

おすすめ

転載: blog.csdn.net/weixin_38037405/article/details/124298560