В чем разница между моими горячими ярлыками и созданием ярлыков с функциями? - PullRequest
0 голосов
/ 26 января 2019

Я новичок в Python и машинном обучении, так как я учусь день ото дня. Я хочу кое-что прояснить, и на этот раз о своих лейблах. У меня есть 2004 классы для классификации. И я создаю ярлыки вручную из имен файлов. Как ниже

import numpy as np

path = "D:/data/image/1/1/asas1231231231.jpg"

label = np.zeros(2004)

# The line to read the 4th index from path and converting it into integer and then pass it on to the array to have the label
label[int(path.rsplit('/')[4]) - 1 ] = 1

# Which gives me
print(label[0])
1.0

Теперь у меня есть имена файлов до 2004 года, и на каждой итерации чтения изображений я также делаю метки в метке, а затем добавляю их в список, как

training_labels = []

training_labels.append(label)

Но после некоторого исследования этикеток я узнал о np_utils.to_categorical

np_utils.to_categorical(1,2004)

дает мне

array([[1., 0., 0., ..., 0., 0., 0.]])

Мой вопрос: в чем разница между ними обоими? Может кто-нибудь, пожалуйста, объясните мне. Я также печатаю форму для моего, это было

(2004,)

И с помощью np_utils я получаю

(1,2004)

1 Ответ

0 голосов
/ 27 января 2019

Я думаю, что есть некоторая путаница, что на самом деле означает «горячая этикетка».Я предполагаю, что вы имеете в виду «одно горячее кодирование», которое обычно используется для кодирования категориальных переменных в одном горячем кодированном объекте ( см. Также здесь ).Например, если у вас есть переменная мужчины / женщины, вы можете представить эту переменную 0 для мужчины и 1 для женщины.Возможно, это регрессионная перспектива, но для ваших учебных ярлыков она работает в основном так же.В вашем коде похоже, что вы используете «сырые» числа в качестве меток.Неотъемлемой проблемой здесь (в классификации) является то, что обычно классы не связаны друг с другом.Предположим, ваши ярлыки красные, зеленые и желтые.В своем подходе вы бы сопоставили их с классами 1,2 и 3. Одна из проблем этого подхода заключается в том, что порядок не имеет смысла, например, почему желтый (3) выше красного (1)?И почему расстояние между красным (1) и зеленым (2) меньше, чем между красным (1) и желтым (3)?

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

from keras.utils import np_utils
np_utils.to_categorical([0, 1,2], 2004)
>>array([[1., 0., 0., ..., 0., 0., 0.],
       [0., 1., 0., ..., 0., 0., 0.],
       [0., 0., 1., ..., 0., 0., 0.]])

Вы увидите, что функция to_categorical фактически начинает классы с 0. Форма (3, 2004), потому что я ввожу 3 разных класса ([0, 1, 2]) и указали количество классов со вторым аргументом 2004 .Каждый из этих векторов длины 2004 представляет отдельный класс .В зависимости от положения 1 в векторе определяются классы.Обратите внимание, что каждый вектор уникален для класса.

Наконец, взгляните на некоторые примеры из документации scikit-learn .

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

HTH

...