TypeError: __init __ () otrzymał nieoczekiwany argument słowa kluczowego „categorical_features” One Hot Encoder

Nov 20 2020

Próbuję rozwiązać powyższy kod, który dostałem od Kaggle, ale próbowałem go uruchomić i wyrzuca ten błąd:

return f (** kwargs) TypeError: init () pobrał nieoczekiwany argument słowa kluczowego „categorical_features”

To jest cały kod:

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),'%')

Jak więc sobie poradzić z tym błędem?

Odpowiedzi

StupidWolf Nov 20 2020 at 15:13

Na podstawie tego kodu nie jestem pewien, czy ma sens jednorazowe kodowanie wszystkich kolumn. W tym liczbowe.

Powiedzmy, że celem jest przekonwertowanie kolumny car namena kategoryczne i jedno gorące kodowanie.

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

Jak @ Jacky1205 wskazał w drugiej odpowiedzi, ta funkcja jest przestarzała. I lepiej będzie użyć data.frames niż trzymać je w tablicy, jeśli chcesz z nich skorzystać ColumnTransformer. Na przykład:

from sklearn.compose import ColumnTransformer

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

Możesz także pracować na poziomie macierzy, może się to pogmatwać iw tym przypadku, ponieważ twoje dane nie są duże, możesz zachować je jako gęstą matrycę:

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

Przestarzałe od wersji 0.20: słowo kluczowe categorical_features zostało wycofane w wersji 0.20 i zostanie usunięte w wersji 0.22. Zamiast tego możesz użyć ColumnTransformer .

Zobacz Scikit-learn 0.20: sklearn.preprocessing.OneHotEncoder po więcej szczegółów

A to pytanie o przepełnienie stosu : 54345667 pokazuje, jak przepisać za pomocą ColumnTransformer

from sklearn.compose import ColumnTransformer

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