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

Однако, так как это кажется довольно неуклюжим, я уверен, что есть лучший подход к этому.

Ответы на вопрос(7)

Ваш ответ на вопрос