Кодирование обычных значений в Python - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь закодировать Порядковые Категориальные Значения в 3-м столбце моего набора данных, где «Tiny Mongra» имеет наименьшее значение, а «1st Wand» имеет наивысшие значения.Это синоним использования малых, средних и больших размеров, когда текущий набор данных обозначает размер рисового зерна.

Я продолжаю получать следующую ошибку при запуске этого фрагмента:

Traceback (most recent call last):

  File "<ipython-input-1-ae4501cc0ac1>", line 19, in <module>
    X[:, 2] = ordinalencoder_X_3.fit_transform(X[:, 2])

  File "/Users/anhad/anaconda3/lib/python3.6/site-packages/sklearn/base.py", line 462, in fit_transform
    return self.fit(X, **fit_params).transform(X)

  File "/Users/anhad/anaconda3/lib/python3.6/site-packages/sklearn/preprocessing/_encoders.py", line 794, in fit
    self._fit(X)

  File "/Users/anhad/anaconda3/lib/python3.6/site-packages/sklearn/preprocessing/_encoders.py", line 61, in _fit
    X = self._check_X(X)

  File "/Users/anhad/anaconda3/lib/python3.6/site-packages/sklearn/preprocessing/_encoders.py", line 47, in _check_X
    X_temp = check_array(X, dtype=None)

  File "/Users/anhad/anaconda3/lib/python3.6/site-packages/sklearn/utils/validation.py", line 552, in check_array
    "if it contains a single sample.".format(array))

ValueError: Expected 2D array, got 1D array instead:
array=['1st Wand' '1st Wand' '1st Wand' ... '1st Wand' '1st Wand' '1st Wand'].

При дальнейшей проверке я обнаружил, что ошибка не предупреждала меня о списке категориальных данных, а имела в виду столбец, который я хотел закодировать.По какой-то причине он считает, что столбец - это одномерный массив в форме:

array=['1st Wand' '1st Wand' '1st Wand' '1st Wand' '1st Wand' 'Dubar' '2nd Wand'
 'Tibar' 'Mongra' '1st Wand' '1st Wand' '1st Wand' '1st Wand' '1st Wand'
 '1st Wand' '2nd Wand' 'Super Dubar' 'Super Tibar' ... '1st Wand' '1st Wand'].

Это странно, поскольку я использую LabelEncoder для подгонки_трансформирования других категориальных значений в моем наборе данных, и они отлично работают.

Вот ссылка на данные.См. «Данные»:

https://docs.google.com/spreadsheets/d/12nAU5QztVnVroRYDsRDsZGUyBpBTwAD5yMmbMaAxnHQ/edit?usp=sharing

Вот полный код.Обратитесь к последней части:

import numpy as np
import pandas as pd

# Importing the dataset
dataset = pd.read_csv('Ryze Price NN Data.csv')
X = dataset.iloc[:, 1:7].values
y = dataset.iloc[:, 7].values

# Encoding categorical data
from sklearn.preprocessing import LabelEncoder, OneHotEncoder, OrdinalEncoder

labelencoder_X_1 = LabelEncoder()
X[:, 0] = labelencoder_X_1.fit_transform(X[:, 0])

labelencoder_X_2 = LabelEncoder()
X[:, 1] = labelencoder_X_2.fit_transform(X[:, 1])

# SEE THIS PART
category_array = ["Tiny Mongra","Mini Mongra","Mongra","Super Mongra","Mini Dubar","Dubar","Super Dubar","Mini Tibar","Tibar","Super Tibar","2nd Wand","Super 2nd Wand","1st Wand"]
ordinalencoder_X_3 = OrdinalEncoder(categories=category_array)
X[:, 2] = ordinalencoder_X_3.fit_transform(np.array(X[:,2])

Я ожидаю, что категориальные данные закодированы следующим образом: «Tiny Mongra» должен быть закодирован как 0.,«1-й жезл» должен быть закодирован как 12

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Вместо использования Ordinal Encoder, еще один вариант - использовать функцию Pandas Applymap и передать словарь сопоставления с помощью лямбда-функции.

Вот словарь сопоставления:

mapping = { "Tiny Mongra" : 0,"Mini Mongra" : 1,"Mongra":2,"Super Mongra" : 3,"Mini 
Dubar":4,"Dubar":5,"Super Dubar":6,"Mini Tibar":7,"Tibar":8,"Super Tibar":9,"2nd 
Wand":10,"Super 2nd Wand" :11,"1st Wand":12}

Позволяет сказатьниже мой фрейм данных:

df = pd.DataFrame(['Tiny Mongra', 'Mini Dubar' ,'Mongra', '1st Wand' ,'1st Wand' 
,'Dubar' ,'2nd Wand','Tibar', 'Mongra', 'Super Dubar', '1st Wand', '1st Wand', '1st 
 Wand' ,'1st Wand','1st Wand', '2nd Wand' ,'Super Dubar' ,'Super Tibar' ,'1st Wand', 
'1st Wand'],   columns = ['category'])

Затем вы можете создать еще один закодированный столбец отображения, используя следующий код:

df['mapped_category'] = df.applymap(lambda x : mapping[x])
0 голосов
/ 30 января 2019

Основное различие между LabelEncoder и OrdinalEncoder заключается в их назначении:

  • LabelEncoder следует использовать для target переменных,
  • OrdinalEncoder следует использовать для функции переменных.

Обычно они работают одинаково, но:

  • LabelEncoder нужны у: форма массива [n_samples] ,
  • OrdinalEncoder нуждается X: форма массива [n_samples, n_features] .

Если вы просто хотите закодировать значения вашей категориальной переменной в 0, 1, ..., n, используйте LabelEncoder так же, как вы делали с X1 и X2.

labelencoder_X_3 = LabelEncoder()
X[:, 2] = labelencoder_X_3.fit_transform(X[:, 2])

Но я бы преобразовал все три переменные с помощью OrdinalEncoderодновременно:

ordinalencoder_X = OrdinalEncoder()
X[:, 0:3] = ordinalencoder_X.fit_transform(X[:, 0:3])
...