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 

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

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.

Interesting Posts

Как по-разному умножить матрицу scipy.sparse на широковещательный плотный массив 1d?

изменение выхода

Класс импорта без выполнения .py он находится внутри?

Как передать переменные другим методам с помощью пакета Python для набора кликов (Command Line Interface Creation Kit)

В чем разница между ndarray и array в numpy?

Невозможно установить гибкую библиотеку без прав root

Использование Python 3.1 с TextMate

Печать байтовой строки с кодировкой UTF-8

Сравните файлы по строкам, чтобы убедиться, что они одинаковые, если они выводят их

Преобразование изображения RGB-> Лаборатория с помощью python

Python: Удаление \ xa0 из строки?

python pandas преобразует dataframe в словарь с несколькими значениями

Программа торгового автомата (подсчитайте сумму, которую необходимо вставить, и т. Д.)

Как использовать PIL с PyPy?

Обновление с Django 1.6 (с юга) до 1.8 не изменяет «last_login» в пользовательской таблице

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