Одна горячая кодировка одного столбца - PullRequest
1 голос
/ 29 мая 2019

Я пытаюсь использовать один горячий кодировщик для целевого столбца («Виды») в наборе данных Iris.

Но я получаю следующие ошибки:

ValueError:Ожидаемый 2D-массив, вместо него получен 1D-массив:

Измените ваши данные, используя array.reshape (-1, 1), если ваши данные имеют один объект, или array.reshape (1, -1), если он содержитодин образец.

Id SepalLengthCm SepalWidthCm PetalLengthCm PetalWidthCm    Species
0   1   5.1 3.5 1.4         0.2     Iris-setosa
1   2   4.9 3.0 1.4         0.2     Iris-setosa
2   3   4.7 3.2 1.3         0.2     Iris-setosa
3   4   4.6 3.1 1.5         0.2     Iris-setosa
4   5   5.0 3.6 1.4         0.2     Iris-setosa

Я решил проблему с Google, и обнаружил, что большинству оценок обучения scikit необходим двумерный массив, а не одномерный массив.

В то же времяЯ также обнаружил, что мы можем попробовать передать фрейм данных с его индексом для кодирования отдельных столбцов, но это не сработало

onehotencoder = OneHotEncoder(categorical_features=[df.columns.tolist().index('pattern_id')
X = dataset.iloc[:,1:5].values
y = dataset.iloc[:, 5].values

from sklearn.preprocessing import LabelEncoder, OneHotEncoder

labelencoder= LabelEncoder()
y = labelencoder.fit_transform(y)


onehotencoder = OneHotEncoder(categorical_features=[0])
y = onehotencoder.fit_transform(y)

Я пытаюсь кодировать один категориальный столбец и разбить его на несколько столбцов (как обычно работает кодировка)

Ответы [ 2 ]

3 голосов
/ 29 мая 2019

ValueError: Ожидаемый двумерный массив, вместо него получен одномерный массив: измените форму данные либо с помощью array.reshape (-1, 1), если ваши данные имеют один feature или array.reshape (1, -1), если он содержит один образец.

Говорит, что вам нужно преобразовать ваш массив в вектор. Вы можете сделать это:

from sklearn import datasets
from sklearn.decomposition import PCA
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
import pandas as pd
import numpy as np

# load iris dataset 
>>> iris = datasets.load_iris()
>>> iris = pd.DataFrame(data= np.c_[iris['data'], iris['target']], columns= iris['feature_names'] + ['target'])
>>> y = iris.target.values
>>> onehotencoder = OneHotEncoder(categories='auto')
>>> y = onehotencoder.fit_transform(y.reshape(-1,1))
# y - will be sparse matrix of type '<class 'numpy.float64'>
# if you want it to be a array you need to 
>>> print(y.toarray())
[[1. 0. 0.]
 [1. 0. 0.]
    . . . . 
 [0. 0. 1.]
 [0. 0. 1.]]

Также вы можете использовать функцию get_dummies ( документы )

>>> pd.get_dummies(iris.target).head()
   0.0  1.0  2.0
0    1    0    0
1    1    0    0
2    1    0    0
3    1    0    0
4    1    0    0

Надеюсь, это поможет!

2 голосов
/ 29 мая 2019

Для вашего случая, поскольку похоже, что вы используете набор данных kaggle, я бы просто использовал

import pandas as pd
pd.get_dummies(df.Species).head()

Out[158]: 
   Iris-setosa  Iris-versicolor  Iris-virginica
0            1                0               0
1            1                0               0
2            1                0               0
3            1                0               0
4            1                0               0

Обратите внимание, что значение по умолчанию здесь кодирует все классы (3 вида), где оно является общим дляиспользуйте только два и сравните различия в средствах с базовой группой (например, по умолчанию в R или обычно при выполнении регрессии / ANOVA, что может быть достигнуто с помощью аргумента drop_first).

...