Чтобы ответить на первую часть вашего вопроса: почему вы получаете эту ошибку? Ваш OrdinalEncoder был обучен с использованием массива numpy, полученного из значений pandas Ser ie.
Как вы прокомментировали, (действительно ли здесь необходимо изменение формы?) (Np.asarray не должен необходимо, поскольку fit_transform уже дает массив numpy)
catergoryEncoder.inverse_transform(np.asarray(unscaled.Exchange))
приведет к ошибке, поскольку массив numpy не имеет понятия имен столбцов. Вместо этого вам следует вернуть данные Exchange по index :
catergoryEncoder.inverse_transform(unscaled[:,1])
, где 1 - это индекс столбцов, которые вы хотите выбрать. Это должно вернуть вам ваши исходные данные.
Теперь, о правильном / чистом способе реализации таких вещей, стиль Pipelines - это путь к go ( пример ).
PS: использование One Hot Encoding должно устранить необходимость масштабирования данных, поскольку все значения кодируются в диапазоне от 0 до 1.
РЕДАКТИРОВАТЬ
Чтобы ответить на ваши комментарии, см. Полный пример ниже:
Давайте начнем с кадра данных:
df = pd.DataFrame({'Numeric':[0,1,2,3,4,5],'Categorial1':['A','A','A','B','B','B'],'Categorial2':['A','C','A','C','B','C']})
Numeric Categorial1 Categorial2
0 0 A A
1 1 A C
2 2 A A
3 3 B C
4 4 B B
5 5 B C
Теперь, применяя кодировщик:
from sklearn.preprocessing import OrdinalEncoder
encoder = OrdinalEncoder()
#dtype 'O' mean that columns is of type object, this will get all your non numeric data
categorial_column = [col for col in df.columns if df[col].dtype == 'O']
df[categorial_column] = encoder.fit_transform(df[categorial_column])
Обратите внимание, что если вы хотите работать с массивом numpy вместо DataFrame, вы можете "сохранить" индекс ваших категориальных столбцов с помощью:
categorial_index = np.where(df.columns.isin(categorial_column))
n_categorial = len(categorial_column)
df.values[:,categorial_index].reshape(-1,n_categorial)
, предоставив вам следующее (с полным фреймом данных):
Numeric Categorial1 Categorial2
0 0 0.0 0.0
1 1 0.0 2.0
2 2 0.0 0.0
3 3 1.0 2.0
4 4 1.0 1.0
5 5 1.0 2.0
Тогда вы уже сделали проклятие:
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaled = scaler.fit_transform(df)
unscaled = scaler.inverse_transform(scaled)
Затем вернитесь к фрейму данных:
df = pd.DataFrame(unscaled, columns=df.columns)
df[categorial_column] = encoder.inverse_transform(df[categorial_column])
, давая вам назад:
Numeric Categorial1 Categorial2
0 0.0 A A
1 1.0 A C
2 2.0 A A
3 3.0 B C
4 4.0 B B
5 5.0 B C
Теперь вы можете встроить все этапы предварительной обработки в какую-либо функцию или конвейер sklearn и сделать это с помощью й это!