Разные значения Label Encoder на обучающем и тестовом наборе плохие? - PullRequest
0 голосов
/ 12 декабря 2018

В моем наборе данных у меня есть категориальная функция , называемая product .

Допустим, в обучающем наборе его значения в {"apple", "banana", "durian", "orange",....}.С другой стороны, в тестовом наборе значения теперь могут быть {"banana", "orange", pineapple"}.Есть некоторые значения, которых нет в обучающем наборе (например, Ананас ).

Я знаю, что, если у нас есть все возможные значения заранее, мы можемсоздайте переменную Label Encoder и fit со всеми значениями, которые может иметь функция.Но в этом случае я не могу гарантировать, что обучающий набор сможет охватить все значения в тестовом наборе (т. Е. Когда появятся некоторые новые продукты).

Это меня очень беспокоит, потому что я боюсь, что при использовании Label Encoding , обучающий набор может быть сопоставлен как {"apple": 1, "банан": 2, "дуриан": 3, "апельсин": 4, ... (еще тысячи) } , но когда дело доходит досопоставляя с тестовым набором 1039 *, мы получим {"банан": 1, "апельсин": 2, ананас ": 3} .

Мои вопросыявляются:

    1. Оказывает ли это негативное влияние на классификационную модель ? Например, если apple становится важным значением вproduct особенность, насколько мне известно, модель будет относиться к 1 (числовое значение apple ) с большей озабоченностью. Это вводит в заблуждение, когда 1 banana в тестовом наборе ?
  • Есть ли какой-нибудь способ, которым я могу справиться с проблемами кодировщика этикеток, у которых разные значения в обучении и наборе тестов?

Я нашел некоторые релевантнымиссылки вроде этой , но это не совсем моя проблема.

Обновление: обратите внимание, что product может иметь тысяч значений , поэтому я использую метку Кодер здесь, а не One Hot Coding .

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Вы должны использовать одну горячую кодировку при подаче категориальных переменных в модели ML.В противном случае модель должна будет обработать apple < banana < durian < orange, что на самом деле не так.

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

X= [["apple"], ["banana"], ["durian"], ["orange"]]
from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder(handle_unknown='ignore')
enc.fit(X)

enc.categories_

категории:

[array(['apple', 'banana', 'durian', 'orange'], dtype=object)]

Во время тестовых данных

enc.transform([["banana"], ["orange"], ["pineapple"]]).toarray()

вывод:

array([[0., 1., 0., 0.],
       [0., 0., 0., 1.],
       [0., 0., 0., 0.]])
0 голосов
/ 12 декабря 2018

Если бы я был на вашем месте, я буду использовать словарь для тренировочных данных.Тот же словарь будет использоваться и в тестовых данных.Может быть случай, когда у тестовых данных есть какое-то значение / слово, с которым данные поезда не встречались.Я буду использовать специальный индекс с именем неизвестного токена для этих случаев.Поэтому мой словарь будет: {"UNK": 0, яблоко ": 1," банан ": 2," дуриан ": 3," апельсин ": 4}

Тогда для тестовых данных {" банан,апельсин, ананас "}, у меня будет {2,4,0}

Надеюсь, это будет полезно.

...