Классификационные потери для перекрестно проверенной модели ECOC
возвращает классификационные потери, полученные перекрестно проверенной моделью ECOC (loss = kfoldLoss(CVMdl)ClassificationPartitionedECOC) CVMdl. Для каждой складки, kfoldLoss вычисляет классификационные потери для наблюдений с сгибом при валидации с использованием модели, обученной наблюдениям с сгибом при обучении. CVMdl.X содержит оба набора наблюдений.
возвращает потери классификации с дополнительными опциями, заданными одним или несколькими аргументами пары "имя-значение". Для примера задайте количество складок, схему декодирования или уровень подробностей.loss = kfoldLoss(CVMdl,Name,Value)
Загрузите набор данных радужки Фишера. Задайте данные предиктора X, данные отклика Y, и порядок классов в Y.
load fisheriris X = meas; Y = categorical(species); classOrder = unique(Y); % Class order rng(1); % For reproducibility
Обучите и перекрестная проверка модели ECOC с помощью машины опорных векторов (SVM) двоичных классификаторов. Стандартизируйте предикторы с помощью шаблона SVM и задайте порядок классов.
t = templateSVM('Standardize',1); CVMdl = fitcecoc(X,Y,'CrossVal','on','Learners',t,'ClassNames',classOrder);
CVMdl является ClassificationPartitionedECOC модель. По умолчанию программное обеспечение реализует 10-кратную перекрестную валидацию. Вы можете задать другое количество складок, используя 'KFold' аргумент пары "имя-значение".
Оцените среднюю ошибку классификации.
L = kfoldLoss(CVMdl)
L = 0.0400
Средняя ошибка классификации для складок составляет 4%.
Также можно получить потери в относительных единицах путем определения пары "имя-значение" 'Mode','individual' в kfoldLoss.
Классификационные потери являются мерой качества классификатора. Чтобы определить, какие складки выполняются плохо, отобразите потери для каждой складки.
Загрузите набор данных радужки Фишера. Задайте данные предиктора X, данные отклика Y, и порядок классов в Y.
load fisheriris X = meas; Y = categorical(species); classOrder = unique(Y); rng(1); % For reproducibility
Обучите модель ECOC с помощью двоичных классификаторов SVM. Используйте 8-кратную перекрестную валидацию, стандартизируйте предикторы с помощью шаблона SVM и задайте порядок классов.
t = templateSVM('Standardize',1); CVMdl = fitcecoc(X,Y,'KFold',8,'Learners',t,'ClassNames',classOrder);
Оцените средние классификационные потери по всем складкам и потери по каждой складке.
loss = kfoldLoss(CVMdl)
loss = 0.0333
losses = kfoldLoss(CVMdl,'Mode','individual')
losses = 8×1
0.0556
0.0526
0.1579
0
0
0
0
0
Третья складка ошибочно классифицирует намного более высокий процент наблюдений, чем любая другая складка.
Верните средние классификационные потери для складок, которые работают хорошо, задав 'Folds' аргумент пары "имя-значение".
newloss = kfoldLoss(CVMdl,'Folds',[1:2 4:8])newloss = 0.0153
Общий размер классификационных потерь уменьшается примерно вдвое.
Рассмотрите настройку параметров двоичных классификаторов или проекта кодирования, чтобы увидеть, улучшается ли эффективность для всех складок.
В дополнение к знанию, правильно ли модель классифицирует наблюдения, можно определить, насколько хорошо модель классифицирует наблюдения в свой предсказанный класс. Один из способов определить этот тип качества модели - передать пользовательскую функцию потерь в kfoldLoss.
Загрузите набор данных радужки Фишера. Задайте данные предиктора X, данные отклика Y, и порядок классов в Y.
load fisheriris X = meas; Y = categorical(species); classOrder = unique(Y) % Class order
classOrder = 3x1 categorical
setosa
versicolor
virginica
rng(1) % For reproducibilityОбучите и перекрестная проверка модели ECOC с помощью двоичных классификаторов SVM. Стандартизируйте предикторы с помощью шаблона SVM и задайте порядок классов.
t = templateSVM('Standardize',1); CVMdl = fitcecoc(X,Y,'CrossVal','on','Learners',t,'ClassNames',classOrder);
CVMdl является ClassificationPartitionedECOC модель. По умолчанию программное обеспечение реализует 10-кратную перекрестную валидацию. Вы можете задать другое количество складок, используя 'KFold' аргумент пары "имя-значение".
Создайте пользовательскую функцию, которая принимает минимальные потери для каждого наблюдения, затем усредняет минимальные потери для всех наблюдений. S соответствует NegLoss выход kfoldPredict.
lossfun = @(~,S,~,~)mean(min(-S,[],2));
Вычислите перекрестную проверенную пользовательскую потерю.
kfoldLoss(CVMdl,'LossFun',lossfun)ans = 0.0101
Минимальные средние значения двоичные потери для наблюдений с сворачиванием 0.0101.
CVMdl - Перекрестная проверенная модель ECOCClassificationPartitionedECOC модельПерекрестная проверенная модель ECOC, заданная как ClassificationPartitionedECOC модель. Можно создать ClassificationPartitionedECOC моделировать двумя способами:
Передайте обученную модель ECOC (ClassificationECOCКому crossval.
Обучите модель ECOC с помощью fitcecoc и задайте любой из следующих аргументов пары "имя-значение" перекрестной проверки: 'CrossVal', 'CVPartition', 'Holdout', 'KFold', или 'Leaveout'.
Задайте необязательные разделенные разделенными запятой парами Name,Value аргументы. Name - имя аргумента и Value - соответствующее значение. Name должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN.
kfoldLoss(CVMdl,'Folds',[1 3 5]) задает использование только первой, третьей и пятой складок для вычисления классификационных потерь.'BinaryLoss' - Бинарная функция потерь для учащихся'hamming' | 'linear' | 'logit' | 'exponential' | 'binodeviance' | 'hinge' | 'quadratic' | указатель на функциюДвоичная функция потерь учащегося, заданная как разделенная разделенными запятой парами, состоящая из '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 - это количество двоичных учащихся.
Для примера передачи пользовательской функции двоичных потерь смотрите Предсказание меток теста-образца модели ECOC с помощью Пользовательской функции двоичных потерь.
Значение по умолчанию BinaryLoss значение зависит от областей значений счетов, возвращаемых двоичными учениками. Эта таблица описывает некоторые BinaryLoss по умолчанию значения, основанные на данных допущениях.
| Предположение | Значение по умолчанию |
|---|---|
| Все двоичные ученики являются SVM или линейными или ядерными классификационными моделями учащихся SVM. | 'hinge' |
Все двоичные ученики - это ансамбли, обученные AdaboostM1 или GentleBoost. | 'exponential' |
Все двоичные ученики - это ансамбли, обученные LogitBoost. | 'binodeviance' |
Все двоичные ученики являются линейными или ядерными классификационными моделями обучающихся логистической регрессии. Или вы задаете, чтобы предсказать апостериорные вероятности класса путем установки 'FitPosterior',true в fitcecoc. | 'quadratic' |
Чтобы проверить значение по умолчанию, используйте запись через точку для отображения BinaryLoss свойство обученной модели в командной строке.
Пример: 'BinaryLoss','binodeviance'
Типы данных: char | string | function_handle
'Decoding' - Схема декодирования'lossweighted' (по умолчанию) | 'lossbased'Схема декодирования, которая агрегирует двоичные потери, заданные как разделенная разделенными запятой парами, состоящая из 'Decoding' и 'lossweighted' или 'lossbased'. Для получения дополнительной информации смотрите Двоичные потери.
Пример: 'Decoding','lossbased'
'Folds' - Складывайте индексы для предсказания1:CVMdl.KFold (по умолчанию) | числовой вектор положительных целых чиселИндексы сгиба для предсказания, заданные как разделенная разделенными запятой парами, состоящая из 'Folds' и числовой вектор положительных целых чисел. Элементы Folds должен находиться в области значений от 1 на CVMdl.KFold.
Программа использует только складки, указанные в Folds для предсказания.
Пример: 'Folds',[1 4 10]
Типы данных: single | double
'LossFun' - Функция потерь'classiferror' (по умолчанию) | указатель на функциюФункция потерь, заданная как разделенная разделенными запятой парами, состоящая из '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'Уровень агрегации для выхода, заданный как разделенная разделенными запятой парами, состоящая из 'Mode' и 'average' или 'individual'.
В этой таблице описываются значения.
| Значение | Описание |
|---|---|
'average' | Выход является скаляром средним по всем складкам. |
'individual' | Выход является вектором длины k содержащим одно значение на складку, где k количество складок. |
Пример: 'Mode','individual'
'Options' - опции оценки[] (по умолчанию) | массив структур, возвращенный statsetОпции оценки, заданные как разделенная разделенными запятой парами, состоящая из 'Options' и массив структур, возвращенный statset.
Чтобы вызвать параллельные вычисления:
Вам нужна лицензия Parallel Computing Toolbox™.
Задайте 'Options',statset('UseParallel',true).
'Verbose' - Уровень подробностей0 (по умолчанию) | 1Уровень подробностей, заданный как разделенная разделенными запятой парами, состоящая из 'Verbose' и 0 или 1. Verbose управляет количеством диагностических сообщений, которые программное обеспечение отображений в Командном окне.
Если Verbose является 0тогда программа не отображает диагностические сообщения. В противном случае программа отображает диагностические сообщения.
Пример: 'Verbose',1
Типы данных: single | double
loss - Классификационные потериКлассификационные потери, возвращенные как числовой скаляр или числовой вектор-столбец.
Если Mode является 'average', затем loss - средние классификационные потери по всем складкам. В противном случае loss является k числовым вектором-1, содержащим классификационные потери для каждой складки, где k количество складок.
classification error является двоичной мерой ошибки классификации, которая имеет вид
где:
wj - вес для j наблюдений. Программа перенормирует веса до суммы 1.
ej = 1, если предсказанный класс j наблюдения отличается от его истинного класса, и 0 в противном случае.
Другими словами, классификационная ошибка является долей наблюдений, неправильно классифицированных классификатором.
binary loss является функцией класса и классификационной оценки, которая определяет, насколько хорошо двоичный ученик классифицирует наблюдение в класс.
Предположим следующее:
mkj является элементом (k, j) матрицы разработки кодирования M (то есть кода, соответствующего k классов двоичных j обучающегося).
sj - этот счет двоичных j учащихся для наблюдения.
g является функцией двоичных потерь.
- предсказанный класс для наблюдения.
В loss-based decoding [Escalera et al.] класс, производящий минимальную сумму двоичных потерь по сравнению с двоичными учениками, определяет предсказанный класс наблюдения, то есть
В loss-weighted decoding [Escalera et al.] класс, производящий минимальное среднее значение двоичных потерь по сравнению с двоичными учениками, определяет предсказанный класс наблюдения, то есть
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.
Чтобы выполнять параллельно, задайте 'Options' аргумент имя-значение в вызове этой функции и установите 'UseParallel' поле структуры опций для true использование statset.
Для примера: 'Options',statset('UseParallel',true)
Для получения дополнительной информации о параллельных вычислениях смотрите Запуск функций MATLAB с автоматической поддержкой параллельных вычислений (Parallel Computing Toolbox).
ClassificationECOC | ClassificationPartitionedECOC | fitcecoc | kfoldPredict | loss | statset
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.