205

カテゴリ変数が 80% の機械学習分類問題があります。分類に分類器を使用したい場合、1 つのホット エンコーディングを使用する必要がありますか? エンコーディングなしでデータを分類子に渡すことはできますか?

機能選択のために次のことをしようとしています。

  1. 私は電車のファイルを読みました:

    num_rows_to_read = 10000
    train_small = pd.read_csv("../../dataset/train.csv",   nrows=num_rows_to_read)
    
  2. カテゴリ機能のタイプを「カテゴリ」に変更します。

    non_categorial_features = ['orig_destination_distance',
                              'srch_adults_cnt',
                              'srch_children_cnt',
                              'srch_rm_cnt',
                              'cnt']
    
    for categorical_feature in list(train_small.columns):
        if categorical_feature not in non_categorial_features:
            train_small[categorical_feature] = train_small[categorical_feature].astype('category')
    
  3. 私は 1 つのホット エンコーディングを使用します。

    train_small_with_dummies = pd.get_dummies(train_small, sparse=True)
    

問題は、強力なマシンを使用しているにもかかわらず、3 番目の部分が頻繁に動かなくなることです。

したがって、1 つのホット エンコーディングがなければ、機能の重要性を判断するために機能を選択することはできません。

おすすめは何ですか?

4

21 に答える 21

109

基本的なワンホット エンコーディングに Pandas を使用する方がはるかに簡単です。より多くのオプションを探している場合は、 を使用できますscikit-learn

Pandasでの基本的なワンホット エンコーディングでは、データ フレームをget_dummies関数に渡します。

たとえば、 imdb_movies というデータフレームがある場合:

ここに画像の説明を入力

...そして、Rated 列をワンホット エンコードしたい場合は、次のようにします。

pd.get_dummies(imdb_movies.Rated)

ここに画像の説明を入力

これは、存在する評価の「 leveldataframe 」ごとの列を含む新しい を返します。また、特定の観察に対するその評価の存在を指定する 1 または 0 も返します。

通常、これをオリジナルの一部にしたいと考えていますdataframe。この場合、「column-binding .

Pandas concat関数を使用して列バインドできます。

rated_dummies = pd.get_dummies(imdb_movies.Rated)
pd.concat([imdb_movies, rated_dummies], axis=1)

ここに画像の説明を入力

これで、完全に分析を実行できますdataframe

シンプルなユーティリティ機能

これをすばやく行うには、自分自身をユーティリティ関数にすることをお勧めします。

def encode_and_bind(original_dataframe, feature_to_encode):
    dummies = pd.get_dummies(original_dataframe[[feature_to_encode]])
    res = pd.concat([original_dataframe, dummies], axis=1)
    return(res)

使用法:

encode_and_bind(imdb_movies, 'Rated')

結果:

ここに画像の説明を入力

また、@pmalbu コメントに従って、関数で元の feature_to_encode を削除する場合は、次のバージョンを使用します。

def encode_and_bind(original_dataframe, feature_to_encode):
    dummies = pd.get_dummies(original_dataframe[[feature_to_encode]])
    res = pd.concat([original_dataframe, dummies], axis=1)
    res = res.drop([feature_to_encode], axis=1)
    return(res) 

次のように、複数の機能を同時にエンコードできます。

features_to_encode = ['feature_1', 'feature_2', 'feature_3',
                      'feature_4']
for feature in features_to_encode:
    res = encode_and_bind(train_set, feature)
于 2018-10-22T18:07:06.280 に答える