Поезд и тестовый набор имеют разную длину уникальных меток - PullRequest
0 голосов
/ 07 ноября 2019

Я пробую разные алгоритмы, включая NN для задачи мультиклассовой последовательной классификации.

Набор данных состоит из 66 хоралов Баха, 12 двоичных столбцов музыкальных нот и целевой переменной "chord", которая имеет 102уникальные метки.

> dim(d)
[1] 5664   17

> head(d)
      c_id event   c c_sh   d d_sh   e   f f_sh   g g_sh   a a_sh   b bass meter chord
1 000106b_     2 YES   NO  NO   NO YES  NO   NO YES   NO  NO   NO  NO    E     5   C_M
2 000106b_     3 YES   NO  NO   NO YES  NO   NO YES   NO  NO   NO  NO    E     2   C_M
3 000106b_     4 YES   NO  NO   NO  NO YES   NO  NO   NO YES   NO  NO    F     3   F_M
4 000106b_     5 YES   NO  NO   NO  NO YES   NO  NO   NO YES   NO  NO    F     2   F_M
5 000106b_     6  NO   NO YES   NO  NO YES   NO  NO   NO YES   NO  NO    D     4   D_m
6 000106b_     7  NO   NO YES   NO  NO YES   NO  NO   NO YES   NO  NO    D     2   D_m

> levels(e$chord)
  [1] " A#d"  " A#d7" " A_d"  " A_m"  " A_M"  " A_m4" " A_M4" " A_m6" " A_M6" " A_m7" " A_M7" " Abd"  " Abm" 
 [14] " AbM"  " B_d"  " B_d7" " B_m"  " B_M"  " B_M4" " B_m6" " B_m7" " B_M7" " Bbd"  " Bbm"  " BbM"  " Bbm6"
 [27] " BbM7" " C#d"  " C#d6" " C#d7" " C#m"  " C#M"  " C#M4" " C#m7" " C#M7" " C_d6" " C_d7" " C_m"  " C_M" 
 [40] " C_M4" " C_m6" " C_M6" " C_m7" " C_M7" " D#d"  " D#d6" " D#d7" " D#m"  " D#M"  " D_d7" " D_m"  " D_M" 
 [53] " D_M4" " D_m6" " D_M6" " D_m7" " D_M7" " Dbd"  " Dbd7" " Dbm"  " DbM"  " Dbm7" " DbM7" " E_d"  " E_m" 
 [66] " E_M"  " E_M4" " E_m6" " E_m7" " E_M7" " Ebd"  " EbM"  " EbM7" " F#d"  " F#d7" " F#m"  " F#M"  " F#M4"
 [79] " F#m6" " F#m7" " F#M7" " F_d"  " F_d7" " F_m"  " F_M"  " F_M4" " F_m6" " F_M6" " F_m7" " F_M7" " G#d" 
 [92] " G#d7" " G#m"  " G#M"  " G_d"  " G_m"  " G_M"  " G_M4" " G_m6" " G_M6" " G_m7" " G_M7"

> length(unique(e$chord))
[1] 102

> nrows_split_d # number of observations for each class label
  [1]   5   4   5 258 352   2  16  10   2  11  56   1   2  37  17   8 217 143   3   2  19  46   5  26 312   6
 [27]   3  10   2  15  24  39   2   9   7   2   2 144 488  16  17   6  20  66   7   1   4   2   2   4 165 503
 [53]  16  12   3  33  58   2   2   4  21   3   1   6 241 295  14  14  24  43   1 146   1  14   1 143  90  12
 [79]   7  19  34   3   1  42 388  14   3   4   7  38  11   6   6   1   3 179 489   8   3   3  18  52
> 

Я сталкиваюсь с проблемами из-за того, что у некоторых меток классов так мало наблюдений. Когда дело доходит до случайной выборки / разделения данных на обучающие и тестовые наборы, я смог найти обходной путь, который сводит на нет некоторые элементы случайности;найдите семя, которое позволяет обучающему набору иметь хотя бы 1 из каждого из 102 ярлыков класса. При наличии 5664 наблюдений и обучающей совокупности, включающей 70-80% данных, это было легко достижимо. Кроме того, кажется, что он работает нормально, когда алгоритм, который я решаю использовать, не требует матричного ввода / вывода.

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

Даже когда я уменьшаю размер обучающего набора и выборки с заменой,Я не могу найти начальное число, в котором как наборы поездов, так и наборы тестов содержат 1 из каждой из 102 меток классов.

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

1) Могу ли я "разрешить" / это "хорошая практика" манипулировать семенем, чтобы убедиться, что тренировочный набор содержит 1 изкаждый из уникальных ярлыков классов?

2) Есть ли какие-либо решения для этой проблемы, которые не включают манипулирование семенами / введение дубликатов?

Если бы я не обеспечил 102 уникальности в обучающем наборе, я бы не смог передать данные большинству алгоритмов, поскольку из-за несоответствия возникнут ошибки.

> length(unique(test$chord))
[1] 75
> length(unique(train$chord))
[1] 102

t <- table(predict=pre, actual=test_t)

> length(unique(pre))
[1] 62
> length(unique(test_t))
[1] 85

nn_accuracy <- sum(diag(t) / sum(t))
> nn_accuracy
[1] 0.4077125
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...