web-dev-qa-db-fra.com

Comment utiliser OneHotEncoder pour plusieurs colonnes et supprimer automatiquement la première variable fictive pour chaque colonne?

Ceci est l'ensemble de données avec 3 colonnes et 3 lignes

Nom Organisation Département

Manie ABC2 FINANCE

Joyce ABC1 HR

AMI NSV2 HR

Voici le code que j'ai:

Maintenant, tout va bien jusqu'ici, comment puis-je supprimer la première colonne variable factice pour chacun?

# 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)

tester:

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 

MISE À JOUR concernant votre erreur avec pd.get_dummies(X, columns =[1:]:

D'après la page de documentation , le paramètre columns prend "Column Names". Ainsi, le code suivant fonctionnerait:

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

production:

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

Si vous voulez vraiment définir vos colonnes de manière positionnelle, vous pouvez le faire de cette façon:

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

C'est assez simple dans la version scikit-learn à partir de 0.21. On peut utiliser le paramètre drop dans OneHotEncoder et l'utiliser pour supprimer l'une des catégories par fonctionnalité. Par défaut, il ne tombera pas. Les détails peuvent être trouvés dans la documentation.

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
Jyoti Prasad Pal

Encodez les variables catégorielles une par une. Les variables factices doivent aller à l'index de début de votre ensemble de données. Ensuite, coupez simplement la première colonne comme ceci:

X = X[:, 1:]

Ensuite, encodez et répétez la variable suivante.

0
Roberto

J'utilise mon propre modèle pour cela:

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

Et pour utiliser ce code, mettez simplement ce modèle dans le répertoire courant avec le nom de fichier supposons CustomeEncoder.py et tapez votre code:

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

Et toutes les données de type d'objet supprimées, encodées, supprimées en premier et réunies pour donner la sortie finale souhaitée.
PS: Que le fichier d'entrée de ce modèle est Pandas Dataframe.

0
MD Rijwan