sklearn.LabelEncoder с невидимыми ранее значениями

Если sklearn.LabelEncoder установлен на обучающем наборе, он может сломаться, если он встретит новые значения при использовании в тестовом наборе.

Единственное решение, которое я мог бы предложить для этого, – сопоставить все новое в тестовом наборе (т. Е. Не принадлежащее к существующему классу) до "<unknown>" , а затем явно добавить соответствующий класс в LabelEncoder :

 # train and test are pandas.DataFrame's and c is whatever column le = LabelEncoder() train[c] = le.fit_transform(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>') 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 

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

  • Стратифицированный поезд / тест-раскол в scikit-learn
  • Случайное состояние (псевдослучайное число) в Scikit learn
  • CountVectorizer удаляет функции, которые появляются только один раз
  • Как использовать фиктивную переменную для представления категориальных данных в python scikit-learn random forest
  • Как вывести RandomForest классификатор из python?
  • Получение предупреждения об устаревании в Sklearn над массивом 1d, несмотря на отсутствие массива 1D
  • Как я могу анализировать матрицу путаницы?
  • Лучший способ объединить вероятностные классификаторы в scikit-learn
  • 2 Solutions collect form web for “sklearn.LabelEncoder с невидимыми ранее значениями”

    Я закончил переход на Pandas ' get_dummies из-за этой проблемы невидимых данных.

    • создать манекены в данных обучения
      dummy_train = pd.get_dummies(train)
    • создайте макеты в новом (невидимые данные)
      dummy_new = pd.get_dummies(new_data)
    • переиндексировать новые данные в столбцы данных обучения, заполняя недостающие значения с помощью 0
      dummy_new.reindex(columns = dummy_train.columns, fill_value=0)

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

    У меня создается впечатление, что то, что вы сделали, очень похоже на то, что делают другие люди, столкнувшись с такой ситуацией.

    Было предпринято некоторое усилие, чтобы добавить возможность кодирования невидимых меток LabelEncoder (см. Особенно https://github.com/scikit-learn/scikit-learn/pull/3483 и https://github.com/scikit-learn/ scikit-learn / pull / 3599 ), но изменение существующего поведения на самом деле сложнее, чем кажется на первый взгляд.

    На данный момент похоже, что обработка надписей «вне словарного запаса» предоставляется отдельным пользователям scikit-learn.

    Python - лучший язык программирования в мире.