7

カテゴリデータをsklearn.linear_modelLogisticRegressionの機能として使用する方法を理解しようとしています。Skateganical DataをSkype LogisticRegressionの機能として使用する

もちろん私はそれをエンコードする必要があります。私は理解していない何

  1. は、それがカテゴリ機能として処理されますので、ロジスティック回帰へのエンコード機能を渡す方法で、標準定量化機能として符号化するとき、それが得たint値を解釈しません。

  2. (あまり重要ではありません)preprocessing.LabelEncoder()DictVectorizer.vocabularyを使用するか、カテゴリデータを簡単なdictでエンコードするだけの違いを誰かが説明できますか? Alex A.'s comment hereは被験者には触れるが、深くは触れない。

特に最初のものと!

答えて

1
  1. 数値に範疇の機能を変換するスタンダール・アプローチ - OneHotEncoding
  2. それは完全に異なるクラスです:

    [DictVectorizer][2].vocabulary_

    インデックスを搭載した辞書マッピング機能の名前。

    すなわち後fit()DictVectorizerは、可能なすべての機能名を持ち、今では、特定のどの列に、それは機能の特定の値を配置します知っています。したがって、DictVectorizer.vocabulary_は、のフィーチャーのを含みますが、値は含まれていません。

    LabelEncoderそれぞれの可能なラベル(Labelは文字列または整数)をいくつかの整数値にマッピングし、これらの整数値の1Dベクトルを返します。

+0

reply.The変換自体のおかげで(と思う)問題の少ない、私の主な関心事は、猫が1としてエンコードされるので、もしロジスティックREGは、標準数値として数値を検討するということです犬は2であると見なされますが、割り当てられた値が無意味であることがわかっている間は、「犬」とそのプロパティの「より多く」の観測を想定します。 – Optimesh

+0

@Optimesh、「エンコードされた」とはどういう意味ですか?ターゲット変数について話している場合、ターゲット[1,2,3]に何も問題はないので、LogisticRegressionは(この特定のケースでは)3つの分類子を作成してOneVsRestスキームで組み合わせます。 OneHotEncoderは、各カテゴリの機能をバイナリ形式でエンコードします。つまり、カテゴリ機能の各値の代わりに新しいバイナリ機能を作成します。つまり、結果のデータセットに値のバイナリ機能(列) 1、犬= 2、犬= 3、猫= 1など公式文書の例を見てください。 –

3

異なるカテゴリの区分変数を作成することができます。たとえば:

animal_names = {'mouse';'cat';'dog'} 

Indicator_cat = strcmp(animal_names,'cat') 
Indicator_dog = strcmp(animal_names,'dog') 

その後、我々は持っている:

   [0       [0 
Indicator_cat = 1  Indicator_dog = 0 
       0]       1] 

そして、あなたはあなたの元のデータマトリックス上にこれらを連結することができます:にせずに、1つのカテゴリを残すものの

X_with_indicator_vars = [X, Indicator_cat, Indicator_dog] 

は覚えておいてください定数項がデータ行列に含まれている場合のインジケータ!それ以外の場合は、データ行列は完全な列のランクではありません(または計量経済学的には、あなたはマルチ共直線性を持っています)。

[1 1 0 0   Notice how constant term, an indicator for mouse, 
1 0 1 0   an indicator for ca,t and an indicator for dog 
1 0 0 1]  leads to a less than full column rank matrix: 
        the first column is the sum of the last three. 
+0

お返事ありがとうございます。それは私の心に持っている特徴は40種類以上のカテゴリの値(猫、犬、象、ライオン、..............)です。より良い方法が必要です。 – Optimesh

+0

あなたはそれから何を望んでいるのか分かりませんか?より大きなカテゴリにグループ化できますか?または、カテゴリをいくつかの「n」次元のベクトル空間にマップしますか? (例えば、動物名を2次元ベクトル空間(高さ、重量)にマップする)。しかし、各カテゴリを独自のカテゴリとして扱いたい場合、これは(一般的には回帰のために)行う必要があります。また、効果をカテゴリー別に変えることができると仮定した場合、カテゴリーのすべての相互作用条件も他の回帰分析と同じにする必要があります。多分sklearnがあなたのためにこれをやってくれるかもしれませんが(私は考えていませんが)、これはおそらく起こることです。 –

+0

@Optimesh、よりよい方法はありませんが、FeatureHashingやPCAなどのより複雑なテクニックで次元を減らすことができます また、この記事では同じOne Hot Encodingテクニックを提案しています。 –

0

各カテゴリ変数のタイプが「オブジェクト」であるとします。まず、あなたは、カテゴリ列名のpanda.indexを作成することができます。

import pandas as pd  
catColumns = df.select_dtypes(['object']).columns 

その後、あなたはforループ下に使用して標識変数を作成することができます。バイナリカテゴリ変数の場合は、を使用して01に変換します。 2つ以上のカテゴリを持つカテゴリ変数の場合は、pd.getDummies()を使用してインジケータ変数を取得し、1つのカテゴリを削除します(マルチ共線性の問題を回避するため)。

from sklearn import preprocessing 
le = preprocessing.LabelEncoder() 

for col in catColumns: 
    n = len(df[col].unique()) 
    if (n > 2): 
     X = pd.get_dummies(df[col]) 
     X = X.drop(X.columns[0], axis=1) 
     df[X.columns] = X 
     df.drop(col, axis=1, inplace=True) # drop the original categorical variable (optional) 
    else: 
     le.fit(df[col]) 
     df[col] = le.transform(df[col]) 
+1

最近のsklearnバージョンでは、2つ以上のクラスを持つカテゴリ変数にle.fitを使用できるようになりました。 – Bismarck

関連する問題