カテゴリデータを_sklearn.linear_model
_のLogisticRegression
の機能として使用する方法を理解しようとしています。
もちろん、エンコードする必要があることは理解しています。
私が理解していないのは、エンコードされた機能をロジスティック回帰に渡してカテゴリカル機能として処理し、標準の定量化可能な機能としてエンコードしたときに取得したint値を解釈しない方法です。
(それほど重要ではありません)誰かがpreprocessing.LabelEncoder()
、_DictVectorizer.vocabulary
_を使用するか、単純にdictを使用してカテゴリデータを自分でエンコードするかの違いを説明できますか? アレックスA.のコメントはこちら 主題に触れますが、それほど深くはありません。
特に最初のものと!
さまざまなカテゴリのインジケータ変数を作成できます。例えば:
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]
そして、これらを元のデータマトリックスに連結できます。
X_with_indicator_vars = [X, Indicator_cat, Indicator_dog]
ただし、定数項がデータマトリックスに含まれている場合は、1つのカテゴリをそのままにしておくインジケーターを忘れないでください。そうでない場合、データマトリックスは完全な列ランクにはなりません(または計量経済学の用語では、多重共線性になります)。
[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.
それは完全に異なるクラスです:
_[DictVectorizer][2].vocabulary_
_
機能名を機能インデックスにマッピングする辞書。
つまり、fit()
の後、DictVectorizer
にはすべての可能な機能名があり、機能の特定の値を特定の列に配置することがわかります。したがって、_DictVectorizer.vocabulary_
_には、機能のインデックスが含まれますが、値は含まれません。
LabelEncoder
は、反対の可能性のある各ラベル(ラベルは文字列または整数)を整数値にマップし、これらの整数値の1Dベクトルを返します。
各カテゴリー変数のタイプが「オブジェクト」であるとします。まず、カテゴリー列名の_panda.index
_を作成できます。
_import pandas as pd
catColumns = df.select_dtypes(['object']).columns
_
次に、以下のforループを使用してインジケーター変数を作成できます。バイナリカテゴリ変数の場合、LabelEncoder()
を使用して、それを_0
_および_1
_に変換します。 3つ以上のカテゴリーを持つカテゴリー変数の場合、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])
_