Проблема с OneHotEncoder для категориальных функций
Я хочу кодировать 3 категориальных объекта из 10 объектов в моих наборах данных. Я использую preprocessing
С sklearn.препроцессирование сделать это следующим образом:
from sklearn import preprocessing
cat_features = ['color', 'director_name', 'actor_2_name']
enc = preprocessing.OneHotEncoder(categorical_features=cat_features)
enc.fit(dataset.values)
однако я не мог продолжить, поскольку я получаю эту ошибку:
array = np.array(array, dtype=dtype, order=order, copy=copy)
ValueError: could not convert string to float: PG
Я удивлен, почему он жалуется на строку, как она должна преобразовать ее!! Я что-то упускаю?
5 ответов
если Вы читаете документы для OneHotEncoder
вы увидите ввод для fit
- "входной массив типа int". Поэтому вам нужно сделать два шага для ваших горячих закодированных данных
from sklearn import preprocessing
cat_features = ['color', 'director_name', 'actor_2_name']
enc = preprocessing.LabelEncoder()
enc.fit(cat_features)
new_cat_features = enc.transform(cat_features)
print new_cat_features # [1 2 0]
new_cat_features = new_cat_features.reshape(-1, 1) # Needs to be the correct shape
ohe = preprocessing.OneHotEncoder(sparse=False) #Easier to read
print ohe.fit_transform(new_cat_features)
выход:
[[ 0. 1. 0.]
[ 0. 0. 1.]
[ 1. 0. 0.]]
вы можете применить оба преобразования (из текстовых категорий в целочисленные категории, затем из целочисленных категорий в одном-горячая векторов) в одном кадре с помощью класса LabelBinarizer:
cat_features = ['color', 'director_name', 'actor_2_name']
encoder = LabelBinarizer()
new_cat_features = encoder.fit_transform(cat_features)
new_cat_features
обратите внимание, что это возвращает плотный массив NumPy по умолчанию. Вместо этого вы можете получить разреженную матрицу, передав sparse_output=True для конструктора LabelBinarizer.
источник практическое машинное обучение с помощью Scikit-Learn и TensorFlow
из документации:
categorical_features : “all” or array of indices or mask
Specify what features are treated as categorical.
‘all’ (default): All features are treated as categorical.
array of indices: Array of categorical feature indices.
mask: Array of length n_features and with dtype=bool.
имена столбцов фрейма данных pandas не будут работать. если категориальными признаками являются номера столбцов 0, 2 и 6, Используйте :
from sklearn import preprocessing
cat_features = [0, 2, 6]
enc = preprocessing.OneHotEncoder(categorical_features=cat_features)
enc.fit(dataset.values)
следует также отметить, что если эти категориальные функции не закодированы меткой, вам нужно использовать LabelEncoder
на этих функциях перед использованием OneHotEncoder
Если набор данных находится во фрейме данных pandas, используя
панды.get_dummies
будет более простым.
*исправлены от Панды.get_getdummies панд.get_dummies
@Medo,
я столкнулся с тем же поведением и нашел его разочаровывающим. Как указывали другие, Scikit-Learn требует все данные должны быть числовыми, прежде чем он даже рассматривает выбор столбцов, предусмотренных в .
в частности, выбор столбца осуществляется _transform_selected()
метод в /sklearn/preprocessing/data.py и самая первая строка этого метода -
X = check_array(X, accept_sparse='csc', copy=copy, dtype=FLOAT_DTYPES)
.
эта проверка не выполняется, если любой данных в таблицы данных X
не удается успешно преобразовать в float.
Я согласен, что документация sklearn.предварительная обработка.OneHotEncoder очень вводит в заблуждение в этом отношении.