Использование Scikit LabelEncoder правильно в нескольких программах

Основная задача, которую я имею под рукой, -

a) Прочитайте отдельные данные, разделенные вкладкой.

b) Проделайте основную предварительную обработку

c) Для каждого категориального столбца используйте LabelEncoder для создания сопоставления. Это немного похоже на это

mapper={}
#Converting Categorical Data
for x in categorical_list:
     mapper[x]=preprocessing.LabelEncoder()

for x in categorical_list:
     df[x]=mapper[x].fit_transform(df.__getattr__(x))

где df - это pandas dataframe, а categorical_list - список заголовков столбцов, которые необходимо преобразовать.

d) Обучите классификатор и сохраните его на диск с помощью pickle

e) Теперь в другой программе загружена модель.

f) Загружаются тестовые данные и выполняется одна и та же предварительная обработка.

g) LabelEncoder's используются для преобразования категориальных данных.

h) Модель используется для прогнозирования.

Теперь вопрос, который у меня есть, правильно ли будет выполняться шаг g)?

Как говорится в документации для LabelEncoder

It can also be used to transform non-numerical labels (as long as 
they are hashable and comparable) to numerical labels.

Итак, каждый хеш входа будет иметь то же самое значение каждый раз?

Если нет, то это хороший способ. Любой способ получить отображения кодера? Или совсем другой путь от LabelEncoder?

Ответ 1

В соответствии с LabelEncoder описанный вами трубопровод будет работать правильно, если и только если вы fit LabelEncoders на время тестирования с данными, которые имеют точно такой же набор уникальных значений.

Там несколько хакерский способ повторного использования LabelEncoders вы получили во время поездов. LabelEncoder имеет только одно свойство, а именно classes_. Вы можете разложить его, а затем восстановить как

Поезд:

encoder = LabelEncoder()
encoder.fit(X)
numpy.save('classes.npy', encoder.classes_)

Тест

encoder = LabelEncoder()
encoder.classes_ = numpy.load('classes.npy')
# Now you should be able to use encoder
# as you would do after `fit`

Это кажется более эффективным, чем установка его с использованием тех же данных.

Ответ 2

Что для меня работает LabelEncoder().fit(X_train[col]), травление этих объектов для каждого категориального столбца col, а затем повторное использование тех же объектов для преобразования одного и того же категориального столбца col в набор данных валидации. В основном у вас есть объект-кодер метки для каждой из ваших категориальных столбцов.

  • Итак fit() по данным тренинга и рассортировать объекты/модели, соответствующие каждому столбцу в учебном фрейме X_train.
  • Для каждого col в столбцах набора проверки X_cv загрузите соответствующий объект/модель и примените преобразование, обратившись к функции преобразования как: transform(X_cv[col]).

Ответ 3

Для меня самый простой способ - экспортировать LabelEncoder в .pkl файла .pkl для каждого столбца. Вы должны экспортировать кодировщик для каждого столбца после использования функции fit_transform()

Например

from sklearn.preprocessing import LabelEncoder
import pickle
import pandas as pd
df_train = pd.read_csv('traing_data.csv')
le = LabelEncoder()    
df_train['Departure'] = le.fit_transform(df_train['Departure'])
#exporting the departure encoder
output = open('Departure_encoder.pkl', 'wb')
pickle.dump(le, output)
output.close()

Затем в проекте тестирования вы можете загрузить объект LabelEncoder и напрямую применить функцию transform()

from sklearn.preprocessing import LabelEncoder
import pandas as pd
df_test = pd.read_csv('testing_data.csv')
#load the encoder file
import pickle 
pkl_file = open('Departure_encoder.pkl', 'rb')
le_departure = pickle.load(pkl_file) 
pkl_file.close()
df_test['Departure'] = le_departure.transform(df_test['Departure'])