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

Nov 20 2020

J'essaie de résoudre le code ci-dessus, que j'ai obtenu de Kaggle, mais j'ai essayé de l'exécuter et cela génère cette erreur:

return f (** kwargs) TypeError: init () a obtenu un argument de mot-clé inattendu 'categorical_features'

Voici le code complet:

data = pd.read_csv('auto-mpg.csv',sep = ',')
print(data.columns);
print(data.isnull().sum())

data['horsepower'] = data['horsepower'].replace('?','100')
print(data['horsepower'].value_counts())

print('O maior MPG é ',data.mpg.max(),'milhoes por galao')
print('O menor MPG é',data.mpg.min(),'milhoes por galao')

f,ax = plt.subplots(1,2,figsize=(12,6))
sns.boxplot(data.mpg,ax=ax[0])
sns.distplot(data.mpg,ax=ax[1])

print("Skewness: ",data['mpg'].skew())
print("Kurtosis: ",data['mpg'].kurtosis())

corr = data.corr()
print(corr)

x = data.iloc[:,1:].values
y = data.iloc[:,0].values

lb = LabelEncoder()
x[:,7] = lb.fit_transform(x[:,7])


onehot = OneHotEncoder(categorical_features = x)
x = onehot.fit_transform(x).toarray()


xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size = 0.2,random_state = 0)


sc = StandardScaler()
x = sc.fit_transform(x)


rfr = RandomForestRegressor(n_estimators = 200,random_state = 0)
rfr.fit(xtrain,ytrain)

ypred_rfr = rfr.predict(xtest)
print('Accuracy of the random forest model:',round(r2_score(ytest,ypred_rfr)*100,2),'%')

Alors, comment puis-je gérer cette erreur?

Réponses

StupidWolf Nov 20 2020 at 15:13

À partir de ce code, je ne suis pas si sûr qu'il soit logique d'encoder en un instant toutes les colonnes. Y compris les numériques.

Disons que le but est de convertir la colonne car nameen un encodage catégorique et à chaud.

import pandas as pd
from scipy.sparse import csr_matrix
from sklearn.preprocessing import LabelEncoder,OneHotEncoder
from sklearn.ensemble import RandomForestRegressor

data = pd.read_csv('auto-mpg.csv',sep = ',')
data.columns

Index(['mpg', 'cylinders', 'displacement', 'horsepower', 'weight',
       'acceleration', 'model year', 'origin', 'car name'],
      dtype='object')

Comme @ Jacky1205 l'a souligné dans l'autre réponse, cette fonction est obsolète. Et il sera préférable d'utiliser les data.frames plutôt que de les conserver dans un tableau, si vous souhaitez les utiliser ColumnTransformer. Par exemple:

from sklearn.compose import ColumnTransformer

ct = ColumnTransformer([
    ('one hot', OneHotEncoder(), ["car name"])], remainder="passthrough")
x = ct.fit_transform(data.iloc[:,1:])

Vous pouvez également travailler au niveau du tableau, cela peut devenir compliqué et dans ce cas, comme vos données ne sont pas volumineuses, vous pouvez les conserver sous forme de matrice dense:

x = data.iloc[:,1:].values
y = data.iloc[:,0].values

lb = LabelEncoder()
x[:,7] = lb.fit_transform(x[:,7])

onehot = OneHotEncoder(sparse=False)
x = np.concatenate([x[:,:7],onehot.fit_transform(x[:,7].reshape(-1,1))],axis=1)
Jacky1205 Nov 20 2020 at 08:31

Obsolète depuis la version 0.20: Le mot clé categorical_features est obsolète dans la version 0.20 et sera supprimé dans la version 0.22. Vous pouvez utiliser le ColumnTransformer à la place.

Voir Scikit-learn 0.20: sklearn.preprocessing.OneHotEncoder pour plus de détails

Et cette question de débordement de pile : 54345667 montre comment réécrire avec ColumnTransformer

from sklearn.compose import ColumnTransformer

ct = ColumnTransformer([
    ('<Name>', OneHotEncoder(), x)], remainder="passthrough")
ct.fit_transform(x)