sklearn.LabelEncoder с невиданными ранее значениями
Еслиsklearn.LabelEncoder
был установлен на тренировочном наборе, он может сломаться, если встретится с новыми значениями при использовании на тестовом наборе.
Единственное решение, которое я мог бы предложить для этого, - сопоставить все новое в наборе тестов (то есть не принадлежащее ни к одному из существующих классов) с"<unknown>"
и затем явно добавьте соответствующий класс кLabelEncoder
потом:
# train and test are pandas.DataFrame's and c is whatever column
le = LabelEncoder()
le.fit(train[c])
test[c] = test[c].map(lambda s: '<unknown>' if s not in le.classes_ else s)
le.classes_ = np.append(le.classes_, '<unknown>')
train[c] = le.transform(train[c])
test[c] = le.transform(test[c])
Это работает, но есть ли лучшее решение?
Обновить
Как указывает @sapo_cosmico в комментарии, кажется, что вышеупомянутое больше не работает, учитывая, что я предполагаю, что это изменение реализации вLabelEncoder.transform
который теперь, кажется, используетnp.searchsorted
(Я не знаю, было ли это раньше). Таким образом, вместо добавления<unknown>
класс кLabelEncoder
список уже извлеченных классов, его нужно вставить в отсортированном порядке:
import bisect
le_classes = le.classes_.tolist()
bisect.insort_left(le_classes, '<unknown>')
le.classes_ = le_classes
Однако, так как это кажется довольно неуклюжим, я уверен, что есть лучший подход к этому.