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
все переменные являются числовыми. Трюки кодирования - это просто практические способы сделать вещи появляется ascategorical
или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
параметры).