web-dev-qa-db-ja.com

複数の列にOneHotEncoderを使用し、各列の最初のダミー変数を自動的に削除する方法は?

これは、3列3行のデータセットです

名前組織部門

マニーABC2ファイナンス

ジョイスABC1 HR

AMI NSV2 HR

これは私が持っているコードです:

ここまでは問題ありませんが、それぞれの最初のダミー変数列を削除するにはどうすればよいですか?

# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# Importing the dataset
dataset = pd.read_csv('Data1.csv',encoding = "cp1252")
X = dataset.values


# Encoding categorical data
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_X_0 = LabelEncoder()
X[:, 0] = labelencoder_X_0.fit_transform(X[:, 0])
labelencoder_X_1 = LabelEncoder()
X[:, 1] = labelencoder_X_1.fit_transform(X[:, 1])
labelencoder_X_2 = LabelEncoder()
X[:, 2] = labelencoder_X_2.fit_transform(X[:, 2])

onehotencoder = OneHotEncoder(categorical_features = "all")
X = onehotencoder.fit_transform(X).toarray()
8
Vijay
import pandas as pd
df = pd.DataFrame({'name': ['Manie', 'Joyce', 'AMI'],
                   'Org':  ['ABC2', 'ABC1', 'NSV2'],
                   'Dept': ['Finance', 'HR', 'HR']        
        })


df_2 = pd.get_dummies(df,drop_first=True)

テスト:

print(df_2)
   Dept_HR  Org_ABC2  Org_NSV2  name_Joyce  name_Manie
0        0         1         0           0           1
1        1         0         0           1           0
2        1         0         1           0           0 

pd.get_dummies(X, columns =[1:]のエラーに関する更新:

ドキュメントページ ごとに、columnsパラメーターは「列名」を取ります。したがって、次のコードが機能します。

df_2 = pd.get_dummies(df, columns=['Org', 'Dept'], drop_first=True)

出力:

    name  Org_ABC2  Org_NSV2  Dept_HR
0  Manie         1         0        0
1  Joyce         0         0        1
2    AMI         0         1        1

列の位置を本当に定義したい場合は、次のようにできます。

column_names_for_onehot = df.columns[1:]
df_2 = pd.get_dummies(df, columns=column_names_for_onehot, drop_first=True)
11
Max Power

0.21から始まるscikit-learnバージョンでは非常に簡単です。 OneHotEncoderのドロップパラメーターを使用し、それを使用して機能ごとにカテゴリーの1つをドロップできます。デフォルトでは、ドロップされません。詳細はドキュメントに記載されています。

https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html#sklearn.preprocessing.OneHotEncoder

//drops the first category in each feature
ohe = OneHotEncoder(drop='first', handle_unknown='error')
1

カテゴリ変数を一度に1つずつエンコードします。ダミー変数は、データセットの開始インデックスに移動する必要があります。次に、次のように最初の列を切り取ります。

X = X[:, 1:]

次に、次の変数をエンコードして繰り返します。

0
Roberto

そのために独自のテンプレートを使用します。

from sklearn.base import TransformerMixin
import pandas as pd
import numpy as np
class DataFrameEncoder(TransformerMixin):

    def __init__(self):
        """Encode the data.

        Columns of data type object are appended in the list. After 
        appending Each Column of type object are taken dummies and 
        successively removed and two Dataframes are concated again.

        """
    def fit(self, X, y=None):
        self.object_col = []
        for col in X.columns:
            if(X[col].dtype == np.dtype('O')):
                self.object_col.append(col)
        return self

    def transform(self, X, y=None):
        dummy_df = pd.get_dummies(X[self.object_col],drop_first=True)
        X = X.drop(X[self.object_col],axis=1)
        X = pd.concat([dummy_df,X],axis=1)
        return X

そして、このコードを使用するために、このテンプレートを現在のディレクトリにファイル名で置くだけで、CustomeEncoder.pyを想定してコードを入力してみましょう:

from customEncoder import DataFrameEncoder
data = DataFrameEncoder().fit_transormer(data)

そして、すべてのオブジェクトタイプデータが削除され、エンコードされ、最初に削除され、結合されて最終的な目的の出力が得られます。
PS:このテンプレートへの入力ファイルはPandas Dataframeです。

0
MD Rijwan