5

Как я могу обрабатывать неизвестные значения для кодировки меток в sk-learn? Кодировщик меток будет взорваться только за исключением того, что были обнаружены новые метки.Обработка неизвестных значений для кодировки меток

То, что я хочу это кодирование категориальных переменных через один докрасна -encoder. Однако sk-learn не поддерживает строки для этого. Поэтому я использовал кодировщик меток для каждого столбца.

Моя проблема заключается в том, что на моем этапе перекрестной проверки на конвейере отображаются неизвестные ярлыки. В базовом однострочном кодере есть возможность игнорировать такие случаи. Недостаточно apriori pandas.getDummies /cat.codes, так как трубопровод должен работать с реальными свежими входящими данными, которые могут содержать неизвестные метки.

Можно ли использовать для этой цели CountVectorizer?

+2

У вас есть образец иллюстрации для такой цели? –

+0

Можете ли вы поймать исключение, запишите его (или что-то еще), затем перейдите? Или просто игнорировать их? – wwii

+0

Если интеллектуальная модель развернута как API, весьма вероятно, что она будет сталкиваться с еще неизвестными ярлыками функций. Как я могу справиться с этим в sklearn? Вы предложили бы распространять ошибку в API? –

ответ

4

Есть несколько ответов, которые упоминают pandas.get_dummies как метод для этого, но я считаю, что подход labelEncoder является более чистым для реализации модели. Другие аналогичные ответы упоминаются с использованием DictVectorizer для этого, но снова преобразование всего DataFrame в dict, вероятно, не является отличной идеей.

Давайте предположим, что следующие проблемные столбцы:

from sklearn import preprocessing 
import numpy as np 
import pandas as pd 

train = {'city': ['Buenos Aires', 'New York', 'Istambul', 'Buenos Aires', 'Paris', 'Paris'], 
     'letters': ['a', 'b', 'c', 'd', 'a', 'b']} 
train = pd.DataFrame(train) 

test = {'city': ['Buenos Aires', 'New York', 'Istambul', 'Buenos Aires', 'Paris', 'Utila'], 
     'letters': ['a', 'b', 'c', 'a', 'b', 'b']} 
test = pd.DataFrame(test) 

Utila является более редким городом, и его нет в обучающих данных, но в тестовом наборе, что мы можем рассмотреть новые данные в момент вывода.

Трюк преобразует это значение в «другое» и включает это в объект labelEncoder. Затем мы можем использовать его в производстве.

c = 'city' 
le = preprocessing.LabelEncoder() 
train[c] = le.fit_transform(train[c]) 
test[c] = test[c].map(lambda s: 'other' if s not in le.classes_ else s) 
le_classes = le.classes_.tolist() 
bisect.insort_left(le_classes, 'other') 
le.classes_ = le_classes 
test[c] = le.transform(test[c]) 
test 

    city letters 
0 1 a 
1 3 b 
2 2 c 
3 1 a 
4 4 b 
5 0 b 

Чтобы применить его к новым данным все, что нам нужно, чтобы сохранить le объект для каждого столбца, который может быть легко сделано с соленья.

Этот ответ основан на этом question, который, как мне кажется, не совсем ясен, поэтому добавил этот пример.

+0

Вы имеете в виду разницу в том, что ваше решение требует только одного столбца в памяти, тогда как моему решению нужны все столбцы в памяти? –

+0

Sehr Вы бы предложили другие или нулевые? Я думаю, что нуль хорош, потому что код предварительной обработки будет обрабатывать его вызываемым перед кодировщиком меток. –

+0

Я считаю, что это более безопасное решение по сравнению с 'get_dummies' или' DictVectorizer'. Я думаю об использовании кодировки one-k после labelEncoder, поэтому любое значение будет делать. – marbel