designecoc

Матрица кодирования для уменьшения выходного кода с исправлением ошибок до двоичного

Описание

пример

M = designecoc(K,name) возвращает матрицу кодирования M что уменьшает проект выходного кода с исправлением ошибок (ECOC), заданную name и K классы к двоичной задаче. M имеет K строки и L столбцы с каждой строкой, соответствующей классу, и каждый столбец, соответствующий двоичному ученику. name и K определить значение L.

Можно просматривать или настраивать M, а затем укажите его как матрицу кодирования для настройки многоклассового классификатора ECOC с помощью fitcecoc.

пример

M = designecoc(K,name,Name,Value) возвращает матрицу кодирования с дополнительными опциями, заданными одним или несколькими Name,Value аргументы в виде пар.

Для примера можно задать количество испытаний при генерации плотной или разреженной матрицы случайного кодирования.

Примеры

свернуть все

Рассмотрим arrhythmia набор данных. В исследовании 16 классов, 13 из которых представлены в данных. Первый класс указывает, что у субъекта не было аритмии, а последний класс указывает, что состояние аритмии субъекта не было записано. Предположим, что другие классы являются порядковыми уровнями, указывающими на тяжесть аритмии. Обучите классификатор ECOC с помощью пользовательского проекта кодирования, заданного описанием классов.

Загрузите arrhythmia набор данных.

load arrhythmia
K = 13; % Number of distinct classes

Создайте матрицу кодирования, которая описывает характер классов.

OrdMat = designecoc(11,'ordinal');
nOM = size(OrdMat);
class1VSOrd = [1; -ones(11,1); 0];
class1VSClass16 = [1; zeros(11,1); -1];
OrdVSClass16 = [0; ones(11,1); -1];
Coding = [class1VSOrd class1VSClass16 OrdVSClass16,...
    [zeros(1,nOM(2)); OrdMat; zeros(1,nOM(2))]]
Coding = 13×13

     1     1     0     0     0     0     0     0     0     0     0     0     0
    -1     0     1    -1    -1    -1    -1    -1    -1    -1    -1    -1    -1
    -1     0     1     1    -1    -1    -1    -1    -1    -1    -1    -1    -1
    -1     0     1     1     1    -1    -1    -1    -1    -1    -1    -1    -1
    -1     0     1     1     1     1    -1    -1    -1    -1    -1    -1    -1
    -1     0     1     1     1     1     1    -1    -1    -1    -1    -1    -1
    -1     0     1     1     1     1     1     1    -1    -1    -1    -1    -1
    -1     0     1     1     1     1     1     1     1    -1    -1    -1    -1
    -1     0     1     1     1     1     1     1     1     1    -1    -1    -1
    -1     0     1     1     1     1     1     1     1     1     1    -1    -1
      ⋮

Обучите классификатор ECOC с помощью пользовательских проектов кодирования Coding и укажите, что двоичные ученики являются деревьями решений.

Mdl = fitcecoc(X,Y,'Coding',Coding,'Learner','Tree');

Оцените ошибку классификации в выборке.

genErr = resubLoss(Mdl)
genErr = 0.1460

Если вы запрашиваете матрицу случайного кодирования путем определения sparserandom или denserandom, затем по умолчанию designecoc генерирует 10000 случайных матриц. Затем он выбирает матрицу с наибольшими, минимальными, парными расстояниями по строкам на основе меры Хемминга. Можно задать, чтобы сгенерировать больше матриц, чтобы увеличить вероятность получения лучшей, или можно сгенерировать несколько матриц кодирования, и затем увидеть, какие из них работают лучше всего.

Загрузите arrhythmia набор данных. Зарезервируйте наблюдения, классифицированные в класс 16 (то есть те, которые не имеют классификации аритмии), как новые данные.

load arrhythmia
oosIdx = Y == 16;
isIdx = ~oosIdx;
Y = categorical(Y(isIdx));
tabulate(Y)
  Value    Count   Percent
      1      245     56.98%
      2       44     10.23%
      3       15      3.49%
      4       15      3.49%
      5       13      3.02%
      6       25      5.81%
      7        3      0.70%
      8        2      0.47%
      9        9      2.09%
     10       50     11.63%
     14        4      0.93%
     15        5      1.16%
K = numel(unique(Y));

Сгенерируйте четыре матрицы проекта случайного кодирования так, чтобы первые две были плотными, а вторые - разреженными. Укажите, чтобы найти лучшие из 20 000 вариантов.

rng(1); % For reproducibility 

Coding = cell(4,1); % Preallocate for coding matrices
CodingTypes = {'denserandom','denserandom','sparserandom','sparserandom'};
for j = 1:4;
    Coding{j} = designecoc(K,CodingTypes{j},'NumTrials',2e4);
end

Coding является массивом ячеек 4 на 1, где каждая камера является матрицей проекта кодирования. Матрицы имеют K строки, но количество столбцов (т.е. двоичных учащихся) может варьироваться.

Обучите и перекрестная валидация классификаторов ECOC с помощью 15-кратной кросс-валидации. Укажите, что каждый классификатор ECOC должен быть обучен с помощью дерева классификации, а матрица случайного кодирования сохранена в Coding.

Mdl = cell(4,1); % Preallocate for the ECOC classifiers
for j = 1:4;
    Mdl{j} = fitcecoc(X(isIdx,:),Y,'Learners','tree',...
        'Coding',Coding{j},'KFold',15);
end
Warning: One or more of the unique class values in GROUP is not present in one or more folds. For classification problems, either remove this class from the data or use N instead of GROUP to obtain nonstratified partitions. For regression problems with continuous response, use N.
Warning: One or more of the unique class values in GROUP is not present in one or more folds. For classification problems, either remove this class from the data or use N instead of GROUP to obtain nonstratified partitions. For regression problems with continuous response, use N.
Warning: One or more of the unique class values in GROUP is not present in one or more folds. For classification problems, either remove this class from the data or use N instead of GROUP to obtain nonstratified partitions. For regression problems with continuous response, use N.
Warning: One or more of the unique class values in GROUP is not present in one or more folds. For classification problems, either remove this class from the data or use N instead of GROUP to obtain nonstratified partitions. For regression problems with continuous response, use N.

Mdl - массив ячеек 4 на 1 из ClassificationPartitionedECOC модели. Несколько классов имеют низкую относительную частоту в данных, и поэтому существует вероятность, что во время перекрестной валидации некоторые складки в выборке не будут обучаться с использованием наблюдений из этих классов.

Оцените 15-кратную ошибку классификации для каждого классификатора.

genErr = nan(4,1);
for j = 1:4;
    genErr(j) = kfoldLoss(Mdl{j});
end

genErr
genErr = 4×1

    0.2256
    0.2116
    0.2186
    0.2186

Хотя ошибка обобщения все еще высока, наиболее эффективной моделью, основанной исключительно на ошибке классификации вне выборки, является модель, которая использовала проект кодирования Coding{3}.

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

Входные параметры

свернуть все

Количество классов, заданное в виде положительного целого числа.

K задает количество строк матрицы кодирования M.

Типы данных: single | double

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

ЗначениеКоличество двоичных учащихсяОписание
'allpairs' и 'onevsone'K (K – 1)/2Для каждого двоичного ученика один класс положителен, другой отрицателен, и программное обеспечение игнорирует восстановление. Этот проект исчерпывает все комбинации присвоений пар классов.
'binarycomplete'2(K1)1Этот проект разбивает классы на все двоичные комбинации и не игнорирует никакие классы. Для каждого двоичного ученика все назначения классов -1 и 1 с по крайней мере одним положительным и отрицательным классом в присвоении.
'denserandom'Случайный, но приблизительно 10 лог2 KДля каждого двоичного ученика программа случайным образом назначает классы в положительные или отрицательные классы с по крайней мере одним из каждого типа. Для получения дополнительной информации смотрите Random Coding Design Matrices.
'onevsall'KДля каждого двоичного ученика один класс положителен, а остальные отрицательны. Этот проект исчерпывает все комбинации положительных присвоений классов.
'ordinal'K – 1Для первого двоичного ученика первый класс отрицателен, а остальное положительно. Для второго двоичного ученика первые два класса отрицательны, остальные положительны и так далее.
'sparserandom'Случайный, но приблизительно 15 лог2 KДля каждого двоичного ученика программа случайным образом присваивает классы как положительные или отрицательные с вероятностью 0,25 для каждого и игнорирует классы с вероятностью 0,5. Для получения дополнительной информации смотрите Random Coding Design Matrices.
'ternarycomplete'(3K2(K+1)+1)/2Этот проект разделяет классы на все троичные комбинации. Все назначения классов 0, -1, и 1 с по крайней мере одним положительным и одним отрицательным классом в присвоении.

Аргументы в виде пар имя-значение

Задайте необязательные разделенные разделенными запятой парами Name,Value аргументы. Name - имя аргумента и Value - соответствующее значение. Name должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN.

Пример: 'NumTrials',1000 задает, чтобы сгенерировать 1000 случайные матрицы.

Количество генерируемых матриц случайного кодирования, заданное как разделенная разделенными запятой парами, состоящая из 'NumTrials' и положительное целое число.

Программное обеспечение:

  • Генерирует NumTrials матрицы и выбирает ту, которая имеет максимальное, парное расстояние между строками.

  • Игнорирует NumTrials для всех значений name кроме 'denserandom' и 'sparserandom'.

Пример: 'NumTrials',1000

Типы данных: single | double

Выходные аргументы

свернуть все

Матрица кодирования, которая сокращает схему ECOC до двоичной, возвращается как числовая матрица. M имеет K строки и L столбцы, где L - количество двоичных учащихся. Каждая строка соответствует классу, и каждый столбец соответствует двоичному ученику.

Элементы M являются -1, 0, или 1, и значение соответствует присвоению дихотомического класса. В этой таблице описывается значение M(i,j), то есть класс, который обучается j присваивает наблюдениям в i классов.

ЗначениеПрисвоение дихотомических классов
–1Обучающиеся j присваивает наблюдения в i классов в отрицательный класс.
0Перед обучением учащийся j удаляет наблюдения в i классов из набора данных.
1Обучающиеся j присваивает наблюдения в i классов в положительный класс.

Двоичные ученики для проектов denserandom, binarycomplete, и onevsall не назначать 0 к наблюдениям в любом классе.

Совет

  • Количество двоичных учащихся увеличивается с количеством классов. Для задачи со многими классами, binarycomplete и ternarycomplete проекты кодирования не являются эффективными. Однако:

    • Если K ≤ 4, используйте ternarycomplete проект кодирования, а не sparserandom.

    • Если K ≤ 5, используйте binarycomplete проект кодирования, а не denserandom.

    Можно отобразить матрицу проекта кодирования обученного классификатора ECOC путем ввода Mdl.CodingMatrix в Командное окно.

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

  • Перекрестная валидация с одним выходом (Leaveout) неэффективен для наборов данных со многими наблюдениями. Вместо этого используйте k -fold cross-validation (KFold).

Алгоритмы

свернуть все

Пользовательские матрицы проекта кодирования

Пользовательские матрицы кодирования должны иметь определенную форму. Программа проверяет пользовательские матрицы кодирования, гарантируя:

  • Каждый элемент имеет значения -1, 0 или 1.

  • Каждый столбец содержит по крайней мере один -1 и один 1.

  • Для всех отличных векторов - столбцов u и v, <reservedrangesplaceholder3> ≠ <reservedrangesplaceholder2> и <reservedrangesplaceholder1> ≠ - v.

  • Все векторы строк уникальны.

  • Матрица может разделить любые два класса. То есть можно перемещаться из любой строки в любую другую строку, следуя этим правилам:

    • Можно перемещаться вертикально от 1 до -1 или -1 до 1.

    • Можно перемещаться горизонтально от ненулевого элемента к другому ненулевому элементу.

    • Столбец матрицы можно использовать для вертикального перемещения только один раз.

    Если невозможно переместиться из строки i в j-строку с помощью этих правил, то классы i и j не могут быть разделены проектом. Для примера в проекте кодирования

    [10100101]

    классы 1 и 2 не могут быть отделены от классов 3 и 4 (то есть вы не можете двигаться горизонтально от -1 в строке 2 к столбцу 2, так как в этой позиции есть 0). Поэтому программное обеспечение отклоняет этот проект кодирования.

Проекты случайного кодирования

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

  1. Программное обеспечение генерирует одну из следующих матриц:

    1. Плотный случайный - программное обеспечение присваивает 1 или -1 с равной вероятностью каждому элементу матрицы проекта K -by Ld кодирования, гдеLd10log2K.

    2. Разреженный случайный - Программа присваивает 1 каждому элементу матрицы проекта K -by Ls кодирования с вероятностью 0,25, -1 с вероятностью 0,25 и 0 с вероятностью 0,5, гдеLs15log2K.

  2. Если столбец не содержит хотя бы один 1 и хотя бы один -1, то программное обеспечение удаляет этот столбец.

  3. Для различных столбцов u и v, если u = v или u = - v, то программное обеспечение удаляет v из матрицы проекта кодирования.

Программа случайным образом генерирует 10 000 матриц по умолчанию и сохраняет матрицу с самым большим, минимальным, парным расстоянием строки на основе меры Хемминга ([4]), заданной как

Δ(k1,k2)=0.5l=1L|mk1l||mk2l||mk1lmk2l|,

где mkjl является элементом матричного < reservedrangesplaceholder0 > проекта кодирования.

Ссылки

[1] Фюрнкранц, Йоханнес. Round Robin Classification (неопр.) (недоступная ссылка). Дж. Мач. Учись. Res., Vol. 2, 2002, pp. 721-747.

[2] Эскалера, С., О. Пужоль, и П. Радева. «Разделяемость троичных кодов для разреженных проектов выходных кодов с исправлением ошибок». Pattern Recog. Lett., Vol. 30, Issue 3, 2009, pp. 285-297.

См. также

|

Введенный в R2014b