web-dev-qa-db-fra.com

TypeError: __init __ () a obtenu un argument de mot-clé inattendu 'categorical_features'

Spyder (python 3.7)

Je suis confronté aux erreurs suivantes ici. J'ai déjà mis à jour toutes les bibliothèques à partir d'anaconda Prompt. Mais je ne peux pas trouver la solution du problème.

from sklearn.preprocessing import LabelEncoder, OneHotEncoder
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 = [1])
X = onehotencoder.fit_transform(X).toarray()
Traceback (most recent call last):

File "<ipython-input-4-05deb1f02719>", line 2, in <module>
onehotencoder = OneHotEncoder(categorical_features = [1])

TypeError: __init__() got an unexpected keyword argument 'categorical_features'
5
Rafsan Sadman

Donc, en fonction de votre code, vous devez:

from sklearn.preprocessing import LabelEncoder, OneHotEncoder
from sklearn.compose import ColumnTransformer

# Country column
ct = ColumnTransformer([("Country", OneHotEncoder(), [1])], remainder = 'passthrough')
X = ct.fit_transform(X)

# Male/Female
labelencoder_X = LabelEncoder()
X[:, 2] = labelencoder_X.fit_transform(X[:, 2])

Vous avez remarqué comment le premier LabelEncoder a été supprimé, vous n'avez plus besoin d'appliquer à la fois l'étiquette encodée et l'encodeur à chaud sur la colonne.

(J'ai supposé que votre exemple venait du cours ML Udemy, et la première colonne était une liste de pays, tandis que la seconde était un choix binaire masculin/féminin)

3
Antoine Jaussoin

Selon la documentation c'est la __init__ ligne:

class sklearn.preprocessing.OneHotEncoder(categories='auto', drop=None, sparse=True, dtype=<class 'numpy.float64'>, handle_unknown='error')

Comme vous pouvez le voir, l'init n'obtient pas la variable categorical_features

Vous avez un indicateur categories:

categories'auto 'ou une liste de catégories de type tableau, par défaut =' auto '(valeurs uniques) par fonctionnalité:

"Auto": déterminez automatiquement les catégories à partir des données d'entraînement.

list: categories [i] contient les catégories attendues dans la ième colonne. Les catégories transmises ne doivent pas mélanger des chaînes et des valeurs numériques dans une seule entité et doivent être triées en cas de valeurs numériques.

Les catégories utilisées se trouvent dans l'attribut categories _.

Attributs: categories_list de tableaux Les catégories de chaque fonctionnalité déterminées lors de l'ajustement (dans l'ordre des fonctionnalités dans X et correspondantes avec la sortie de transform). Cela inclut la catégorie spécifiée dans drop (le cas échéant).

2
Amiram
from sklearn.preprocessing import OneHotEncoder, LabelEncoder

from sklearn.compose import ColumnTransformer

label_encoder_x_1 = LabelEncoder()
X[: , 2] = label_encoder_x_1.fit_transform(X[:,2])
transformer = ColumnTransformer(
    transformers=[
        ("OneHot",        # Just a name
         OneHotEncoder(), # The transformer class
         [1]              # The column(s) to be applied on.
         )
    ],
    remainder='passthrough' # donot apply anything to the remaining columns
)
X = transformer.fit_transform(X.tolist())
X = X.astype('float64')

travailler comme un charme :)

1
Samuel Arthurs

En supposant que c'est un problème du cours ML du code complet d'Udemy, j'ai remplacé l'encodeur 1 par le transformateur de colonne comme suggéré par Antoine Jaussoin dans le commentaire ci-dessus.

Données catégoriques

from sklearn.preprocessing import LabelEncoder,OneHotEncoder
from sklearn.compose import ColumnTransformer
ct = ColumnTransformer([("Geography", OneHotEncoder(), [1])], remainder = 'passthrough')
X = ct.fit_transform(X)

Votre colonne Sexe aura désormais l'index 4

 labelencoder_x_2=LabelEncoder()
 X[:,4]=labelencoder_x_2.fit_transform(X[:,4])

pour éviter le piège variable factice

 X=X[:, 1:]
1
RaviSole
    from sklearn.preprocessing import OneHotEncoder
    from sklearn.compose import ColumnTransformer
    columnTransformer = ColumnTransformer([('encoder', OneHotEncoder(), [0])],     remainder='passthrough')
    X=np.array(columnTransformer.fit_transform(X),dtype=np.str)

Depuis la dernière version de la bibliothèque sklearn supprimée categorical_features paramètre pour la classe onehotencoder. Il est conseillé d'utiliser la classe ColumnTransformer pour les jeux de données catégoriels. Reportez-vous à la documentation officielle de sklearn pour plus de précisions.

1
Vishaal S