web-dev-qa-db-ja.com

カテゴリーデータをsklearnロジスティック回帰の機能として使用する

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

もちろん、エンコードする必要があることは理解しています。

  1. 私が理解していないのは、エンコードされた機能をロジスティック回帰に渡してカテゴリカル機能として処理し、標準の定量化可能な機能としてエンコードしたときに取得したint値を解釈しない方法です。

  2. (それほど重要ではありません)誰かがpreprocessing.LabelEncoder()、_DictVectorizer.vocabulary_を使用するか、単純にdictを使用してカテゴリデータを自分でエンコードするかの違いを説明できますか? アレックスA.のコメントはこちら 主題に触れますが、それほど深くはありません。

特に最初のものと!

12
Optimesh

さまざまなカテゴリのインジケータ変数を作成できます。例えば:

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.
4
Matthew Gunn
  1. カテゴリ特徴を数値に変換するスタンダートアプローチ- OneHotEncoding
  2. それは完全に異なるクラスです:

    _[DictVectorizer][2].vocabulary__

    機能名を機能インデックスにマッピングする辞書。

    つまり、fit()の後、DictVectorizerにはすべての可能な機能名があり、機能の特定の値を特定の列に配置することがわかります。したがって、_DictVectorizer.vocabulary__には、機能のインデックスが含まれますが、値は含まれません。

    LabelEncoderは、反対の可能性のある各ラベル(ラベルは文字列または整数)を整数値にマップし、これらの整数値の1Dベクトルを返します。

1
Ibraim Ganiev

各カテゴリー変数のタイプが「オブジェクト」であるとします。まず、カテゴリー列名の_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])
_
0
Yongkai