Vowpal Wabbit как представить категориальные функции

у меня есть следующие данные со всеми категориальными переменными:

    class  education    income    social_standing
    1       basic       low       good
    0        low        high      V_good
    1        high       low       not_good
    0        v_high     high      good

здесь образование имеет четыре уровня (базовый, низкий, высокий и v_high). доход имеет два уровня низкий и высокий ; и social_standing имеет три уровня (good, v_good и not_good).

что касается моего понимания преобразования вышеуказанных данных в формат VW, это будет что-то вроде этого:

    1 |person education_basic income_low social_standing_good
    0 |person education_low income_high social_standing_v_good
    1 |person education_high income_low social_standing_not_good
    0 |person education_v_high income_high social_standing_good

здесь "person" - это пространство имен, а все остальные-это значения объектов с префиксом соответствующие имена. Я прав? Почему-то это представление значений объектов меня озадачивает. Есть ли другой способ представления объектов? Будем благодарны за помощь.

1 ответов


Да, вы правы.

это представление определенно будет работать с vowpal wabbit, но при некоторых условиях,мая не быть оптимальным (это зависит).

представлять не заказывал, категориальные переменные (с дискретными значениями), стандартный трюк vowpal wabbit заключается в использовании логических/булевых значений для каждого возможного (имя, значение) комбинации (например,person_is_good, color_blue, color_red). Причина этого работает это vw неявно принимает значение 1 где бы ни отсутствовало значение. Нет никакой практической разницы между color_red, color=red, color_is_red, или даже (color,red) и color_red:1 кроме хэш-местоположений в памяти. Единственный символы нельзя использовать в имени переменной являются специальные разделители (: и |) и пробела.

терминология Примечание: этот трюк преобразования каждой пары (функция + значение) в отдельную функцию иногда называют "One Hot Encoding".

но в этом случае значения переменных не могут быть "строго категориальными". Они могут быть:

  • строго приказал, электронной.г (low < basic < high < v_high)
  • вероятно монотонном отношении с ярлыком, который вы пытаетесь предсказать

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

в вашем конкретном случае вы можете получить лучший результат, преобразовав значения в числовые, например (1, 2, 3, 4) для образование. Я. e вы можете использовать что-то вроде:

1 |person education:2 income:1 social_standing:2
0 |person education:1 income:2 social_standing:3
1 |person education:3 income:1 social_standing:1
0 |person education:4 income:2 social_standing:2

набор обучения в вопросе должен работать нормально, потому что даже когда вы преобразуете все свои дискретные переменные в логические переменные, как вы это сделали, vw должен самостоятельно-узнайте, как упорядоченность и монотонность с меткой из самих данных, если два свойства выше истинны, и есть достаточно данных, чтобы вывести их.

вот короткий чит-лист для кодирования переменных в vowpal wabbit:

Variable type       How to encode                readable example
-------------       -------------                ----------------
boolean             only encode the true case    is_alive
categorical         append value to name         color=green
ordinal+monotonic   :approx_value                education:2
numeric             :actual_value                height:1.85

конечные ноты:

  • на vw все переменные являются числовыми. Трюки кодирования - это просто практические способы сделать вещи появляется as categorical или boolean. Логический переменные являются просто числовыми 0 или 1; категориальные переменные могут быть закодированы как boolean: name+value:1.
  • любая переменная, значение которой не является монотонным с меткой, может быть менее полезной при числовом кодировании.
  • любая переменная, которая не линейно связана с меткой, может извлечь выгоду из нелинейного преобразования перед обучением.
  • любая переменная с нулевым значением не будет иметь значения для модели (исключение: когда --initial_weight <value> используется опция) так что можно выбросить из тренировочного набора
  • при разборе функции только : считается специальным разделителем (между именем переменной и ее числовым значением) все остальное считается частью имени, а вся строка имени хэшируется в место в памяти. Пропавший :<value> часть подразумевает :1

Edit: как насчет имен-пробелов?

пространства имен добавляются к именам объектов с помощью специального разделителя символов таким образом, они сопоставляют идентичные объекты с различными местоположениями хэша. Пример:

|E low |I low

по существу эквивалентно (без имен пробелов плоский пример):

|  E^low:1 I^low:1

основное использование пространства имен-это легко переопределить все члены пространства имен на что-то другое, игнорировать полное пространство имен функций, пересекать функции пространства имен с другим и т. д. (см. -q, --cubic, --redefine, --ignore, --keep параметры).