kfoldLoss

Классификационные потери для перекрестно проверенной модели ECOC ядра

Описание

пример

loss = kfoldLoss(CVMdl) возвращает классификационные потери, полученные перекрестной проверенной моделью ECOC ядра (ClassificationPartitionedKernelECOC) CVMdl. Для каждой складки, kfoldLoss вычисляет классификационные потери для наблюдений с сгибом при валидации с использованием модели, обученной наблюдениям с сгибом при обучении. kfoldLoss применяет те же данные, что и при создании CVMdl (см. fitcecoc).

По умолчанию, kfoldLoss возвращает ошибку классификации.

пример

loss = kfoldLoss(CVMdl,Name,Value) возвращает потери классификации с дополнительными опциями, заданными одним или несколькими аргументами пары "имя-значение". Для примера задайте функцию потерь классификации, количество складок, схему декодирования или уровень подробностей.

Примеры

свернуть все

Загрузите набор данных радужки Фишера. X содержит измерения цветов и Y содержит имена видов цветов.

load fisheriris
X = meas;
Y = species;

Перекрестная проверка модели ECOC, состоящей из двоичных учащихся ядра.

CVMdl = fitcecoc(X,Y,'Learners','kernel','CrossVal','on')
CVMdl = 
  ClassificationPartitionedKernelECOC
    CrossValidatedModel: 'KernelECOC'
           ResponseName: 'Y'
        NumObservations: 150
                  KFold: 10
              Partition: [1x1 cvpartition]
             ClassNames: {'setosa'  'versicolor'  'virginica'}
         ScoreTransform: 'none'


  Properties, Methods

CVMdl является ClassificationPartitionedKernelECOC модель. По умолчанию программное обеспечение реализует 10-кратную перекрестную валидацию. Чтобы задать другое количество складок, используйте 'KFold' аргумент пары "имя-значение" вместо 'Crossval'.

Оцените перекрестно проверенные классификационные потери. По умолчанию программа вычисляет ошибку классификации.

loss = kfoldLoss(CVMdl)
loss = 0.0333

Кроме того, можно получить ошибки классификации в относительных единицах путем определения пары "имя-значение" 'Mode','individual' в kfoldLoss.

В дополнение к знанию, правильно ли модель классифицирует наблюдения, можно определить, насколько хорошо модель классифицирует наблюдения в свой предсказанный класс. Один из способов определить этот тип качества модели - передать пользовательскую функцию потерь в kfoldLoss.

Загрузите набор данных радужки Фишера. X содержит измерения цветов и Y содержит имена видов цветов.

load fisheriris
X = meas;
Y = species;

Перекрестная проверка модели ECOC, состоящей из двоичных учащихся ядра.

rng(1) % For reproducibility
CVMdl = fitcecoc(X,Y,'Learners','kernel','CrossVal','on')
CVMdl = 
  ClassificationPartitionedKernelECOC
    CrossValidatedModel: 'KernelECOC'
           ResponseName: 'Y'
        NumObservations: 150
                  KFold: 10
              Partition: [1x1 cvpartition]
             ClassNames: {'setosa'  'versicolor'  'virginica'}
         ScoreTransform: 'none'


  Properties, Methods

CVMdl является ClassificationPartitionedKernelECOC модель. По умолчанию программное обеспечение реализует 10-кратную перекрестную валидацию. Чтобы задать другое количество складок, используйте 'KFold' аргумент пары "имя-значение" вместо 'Crossval'.

Создайте пользовательскую функцию, которая принимает минимальные потери для каждого наблюдения, затем усредняет минимальные потери для всех наблюдений. S соответствует NegLoss выход kfoldPredict.

lossfun = @(~,S,~,~)mean(min(-S,[],2));

Вычислите перекрестную проверенную пользовательскую потерю.

kfoldLoss(CVMdl,'LossFun',lossfun)
ans = 0.0199

Минимальные средние значения двоичные потери для наблюдений с разбиением на валидации составляют около 0,02.

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

свернуть все

Перекрестная проверенная модель ECOC ядра, заданная как ClassificationPartitionedKernelECOC модель. Можно создать ClassificationPartitionedKernelECOC модель путем настройки модели ECOC с помощью fitcecoc и определение этих аргументов пары "имя-значение":

  • 'Learners'- Установите значение 'kernel', объект шаблона, возвращенный templateKernelили массив ячеек из таких объектов шаблона.

  • Один из аргументов 'CrossVal', 'CVPartition', 'Holdout', 'KFold', или 'Leaveout'.

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

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

Пример: kfoldLoss(CVMdl,'Folds',[1 3 5]) задает использование только первой, третьей и пятой складок для вычисления классификационных потерь.

Двоичная функция потерь учащегося, заданная как разделенная разделенными запятой парами, состоящая из 'BinaryLoss' и встроенное имя функции потери или указатель на функцию.

  • Эта таблица содержит имена и описания встроенных функций, где yj является меткой класса для конкретного двоичного ученика (в наборе {-1,1,0}), sj является счетом для j наблюдений и g (yj, sj) является формулой двоичных потерь.

    ЗначениеОписаниеСчетg (yj, sj)
    'binodeviance'Биномиальное отклонение(–∞,∞)log [1 + exp (-2 yjsj) ]/[ 2log (2)]
    'exponential'Экспоненциал(–∞,∞)exp (- yjsj )/2
    'hamming'Хэмминг[0,1] или (- ∞, ∞)[1 - знак (yjsj) ]/2
    'hinge'Стержень(–∞,∞)макс (0,1 - yjsj )/2
    'linear'Линейный(–∞,∞)(1 – yjsj)/2
    'logit'Логистический(–∞,∞)журнал [1 + exp (- yjsj) ]/[ 2log (2)]
    'quadratic'Квадратный[0,1][1 – yj (2 sj – 1)]2/2

    Программа нормализует двоичные потери так, что потеря составляет 0,5 при yj = 0. Кроме того, программное обеспечение вычисляет средние двоичные потери для каждого класса.

  • Для пользовательской функции двоичных потерь, например, customFunction, задайте его указатель на функцию 'BinaryLoss',@customFunction.

    customFunction имеет следующую форму:

    bLoss = customFunction(M,s)
    где:

    • M - K матрица кодирования L, сохраненная в Mdl.CodingMatrix.

    • s - вектор-строка L 1 байта классификационных баллов.

    • bLoss - классификационные потери. Этот скаляр агрегирует двоичные потери для каждого учащегося в конкретном классе. Для примера можно использовать среднее значение двоичных потерь для агрегирования потерь по учащимся для каждого класса.

    • K - количество классов.

    • L - это количество двоичных учащихся.

По умолчанию, если все двоичные ученики являются моделями классификации ядра с использованием SVM, то BinaryLoss является 'hinge'. Если все двоичные ученики являются моделями классификации ядра с помощью логистической регрессии, то BinaryLoss является 'quadratic'.

Пример: 'BinaryLoss','binodeviance'

Типы данных: char | string | function_handle

Схема декодирования, которая агрегирует двоичные потери, заданные как разделенная разделенными запятой парами, состоящая из 'Decoding' и 'lossweighted' или 'lossbased'. Для получения дополнительной информации смотрите Двоичные потери.

Пример: 'Decoding','lossbased'

Индексы сгиба для предсказания, заданные как разделенная разделенными запятой парами, состоящая из 'Folds' и числовой вектор положительных целых чисел. Элементы Folds должен находиться в области значений от 1 на CVMdl.KFold.

Программа использует только складки, указанные в Folds для предсказания.

Пример: 'Folds',[1 4 10]

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

Функция потерь, заданная как разделенная разделенными запятой парами, состоящая из 'LossFun' и 'classiferror' или указатель на функцию.

  • Задайте встроенную функцию 'classiferror'. В этом случае функция потерь является ошибкой классификации.

  • Или задайте свою собственную функцию, используя обозначение указателя на функцию.

    Предположим, что n является количеством наблюдений в обучающих данных (CVMdl.NumObservations) и K количество классов (numel(CVMdl.ClassNames)). Вашей функции нужна подпись lossvalue = lossfun(C, S, W, стоимость), где:

    • Выходной аргумент lossvalue является скаляром.

    • Вы задаете имя функции (lossfun).

    • C является n -by K логической матрицей с строками, указывающими класс, к которому принадлежит соответствующее наблюдение. Порядок столбцов соответствует порядку классов в CVMdl.ClassNames.

      Конструкция C путем установки C(p,q) = 1 если наблюдение p находится в q классов, для каждой строки. Установите каждый элемент строки p на 0.

    • S - n -by K числовая матрица отрицательных значений потерь для классов. Каждая строка соответствует наблюдению. Порядок столбцов соответствует порядку классов в CVMdl.ClassNames. Область входа S напоминает выходной аргумент NegLoss из kfoldPredict.

    • W является n -by-1 числовым вектором весов наблюдений. Если вы сдаете Wпрограммное обеспечение нормирует свои элементы в сумме к 1.

    • Cost является K -by K числовой матрицей затрат на неправильную классификацию. Для примера, Cost = ones(K) – eye(K) задает стоимость 0 для правильной классификации и 1 для неправильной классификации.

    Задайте свою функцию используя 'LossFun',@lossfun.

Типы данных: char | string | function_handle

Уровень агрегации для выхода, заданный как разделенная разделенными запятой парами, состоящая из 'Mode' и 'average' или 'individual'.

В этой таблице описываются значения.

ЗначениеОписание
'average'Выход является скаляром средним по всем складкам.
'individual'Выход является вектором длины k содержащим одно значение на складку, где k количество складок.

Пример: 'Mode','individual'

Опции оценки, заданные как разделенная разделенными запятой парами, состоящая из 'Options' и массив структур, возвращенный statset.

Чтобы вызвать параллельные вычисления:

  • Вам нужна лицензия Parallel Computing Toolbox™.

  • Задайте 'Options',statset('UseParallel',true).

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

Если Verbose является 0тогда программа не отображает диагностические сообщения. В противном случае программа отображает диагностические сообщения.

Пример: 'Verbose',1

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

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

свернуть все

Классификационные потери, возвращенные как числовой скаляр или числовой вектор-столбец.

Если Mode является 'average', затем loss - средние классификационные потери по всем складкам. В противном случае loss является k числовым вектором-1, содержащим классификационные потери для каждой складки, где k количество складок.

Подробнее о

свернуть все

Ошибка классификации

classification error является двоичной мерой ошибки классификации, которая имеет вид

L=j=1nwjejj=1nwj,

где:

  • wj - вес для j наблюдений. Программа перенормирует веса до суммы 1.

  • ej = 1, если предсказанный класс j наблюдения отличается от его истинного класса, и 0 в противном случае.

Другими словами, классификационная ошибка является долей наблюдений, неправильно классифицированных классификатором.

Двоичные потери

binary loss является функцией класса и классификационной оценки, которая определяет, насколько хорошо двоичный ученик классифицирует наблюдение в класс.

Предположим следующее:

  • mkj является элементом (k, j) матрицы разработки кодирования M (то есть кода, соответствующего k классов двоичных j обучающегося).

  • sj - этот счет двоичных j учащихся для наблюдения.

  • g является функцией двоичных потерь.

  • k^ - предсказанный класс для наблюдения.

В loss-based decoding [Escalera et al.] класс, производящий минимальную сумму двоичных потерь по сравнению с двоичными учениками, определяет предсказанный класс наблюдения, то есть

k^=argminkj=1L|mkj|g(mkj,sj).

В loss-weighted decoding [Escalera et al.] класс, производящий минимальное среднее значение двоичных потерь по сравнению с двоичными учениками, определяет предсказанный класс наблюдения, то есть

k^=argminkj=1L|mkj|g(mkj,sj)j=1L|mkj|.

Allwein et al. предположим, что утраченное декодирование повышает точность классификации путем сохранения значений потерь для всех классов в одной динамической области значений.

В этой таблице приведены поддерживаемые функции потерь, где yj является меткой класса для конкретного двоичного обучающегося (в наборе {-1,1,0}), sj является счетом для j наблюдений и g (yj, sj).

ЗначениеОписаниеСчетg (yj, sj)
'binodeviance'Биномиальное отклонение(–∞,∞)log [1 + exp (-2 yjsj) ]/[ 2log (2)]
'exponential'Экспоненциал(–∞,∞)exp (- yjsj )/2
'hamming'Хэмминг[0,1] или (- ∞, ∞)[1 - знак (yjsj) ]/2
'hinge'Стержень(–∞,∞)макс (0,1 - yjsj )/2
'linear'Линейный(–∞,∞)(1 – yjsj)/2
'logit'Логистический(–∞,∞)журнал [1 + exp (- yjsj) ]/[ 2log (2)]
'quadratic'Квадратный[0,1][1 – yj (2 sj – 1)]2/2

Программа нормализует двоичные потери таким образом, что потеря составляет 0,5 при yj = 0, и агрегирует, используя среднее значение двоичных учащихся [Allwein et al.].

Не путайте двоичные потери с общими классификационными потерями (заданными 'LossFun' Аргумент пары "имя-значение" из loss и predict функции объекта), который измеряет, насколько хорошо классификатор ECOC работает в целом.

Ссылки

[1] Allwein, E., R. Schapire, and Y. Singer. «Сокращение многоклассового числа до двоичного: Унифицирующий подход к маржинальным classifiers». Журнал исследований машинного обучения. Том 1, 2000, стр. 113-141.

[2] Эскалера, С., О. Пужоль, и П. Радева. «О процессе декодирования в троичных выходных кодах с исправлением ошибок». Транзакции IEEE по шаблонному анализу и машинному анализу. Том 32, Выпуск 7, 2010, стр. 120-134.

[3] Эскалера, С., О. Пужоль, и П. Радева. «Разделяемость троичных кодов для разреженных проектов выходных кодов с исправлением ошибок». Pattern Recogn (Повторный вызов шаблона). Том 30, Выпуск 3, 2009, стр. 285-297.

Введенный в R2018b