exponenta event banner

kfoldLoss

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

Описание

пример

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

L содержит потери классификации для каждой силы регуляризации в моделях линейной классификации, которые составляют CVMdl.

пример

L = kfoldLoss(CVMdl,Name,Value) использует дополнительные параметры, указанные одним или несколькими Name,Value аргументы пары. Например, укажите схему декодирования, которая будет использоваться для вычисления потерь, или уровень детализации.

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

развернуть все

Перекрестно проверенная модель ECOC, состоящая из линейных классификационных моделей, указанных как ClassificationPartitionedLinearECOC объект модели. Можно создать ClassificationPartitionedLinearECOC модель с использованием fitcecoc и путем:

  1. Указание любого из аргументов пары перекрестная проверка, имя-значение, например, CrossVal

  2. Установка аргумента пары имя-значение Learners кому 'linear' или шаблон модели линейной классификации, возвращенный templateLinear

Для получения оценок kfoldLoss применяет те же данные, которые используются для перекрестной проверки модели ECOC (X и Y).

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

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

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

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

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

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

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

    customFunction должен иметь эту форму

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

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

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

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

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

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

    Пример передачи пользовательской двоичной функции потери см. в разделе Прогнозирование меток тестовой выборки модели ECOC с использованием пользовательской двоичной функции потери.

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

  • SVM, затем BinaryLoss является 'hinge'

  • Логистическая регрессия, затем BinaryLoss является 'quadratic'

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

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

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

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

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

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

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

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

Вы можете:

  • Укажите встроенную функцию 'classiferror', то функция потерь является ошибкой классификации.

  • Укажите собственную функцию с помощью нотации дескриптора функции.

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

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

    • Выберите имя функции (lossfun).

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

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

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

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

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

    Укажите свою функцию с помощью 'LossFun',@lossfun.

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

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

СтоимостьОписание
'average'Возвращает потери, усредненные по всем складкам
'individual'Возвращает потери для каждого раза

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

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

Для вызова параллельных вычислений:

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

  • Определить 'Options',statset('UseParallel',true).

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

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

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

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

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

развернуть все

Потери при перекрестной проверке классификации, возвращаемые в виде числового скаляра, вектора или матрицы. Толкование L зависит от LossFun.

Давайте R быть количеством сильных сторон регуляризации являются перекрестно проверенные модели (CVMdl.Trained{1}.BinaryLearners{1}.Lambda) и F - количество складок (хранящихся в CVMdl.KFold).

  • Если Mode является 'average', то L является 1-by-R вектор. L(j) средняя потеря классификации по всем складкам перекрестно проверенной модели, которая использует силу регуляризации j.

  • В противном случае L является Fоколо-R матрица. L(i,j) является классификационной потерей для кратности i перекрестной проверенной модели, в которой используется сила регуляризации j.

Примеры

развернуть все

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

load nlpdata

X является разреженной матрицей данных предиктора, и Y является категориальным вектором меток класса.

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

rng(1); % For reproducibility 
CVMdl = fitcecoc(X,Y,'Learner','linear','CrossVal','on');

CVMdl является ClassificationPartitionedLinearECOC модель. По умолчанию программное обеспечение реализует 10-кратную перекрестную проверку.

Оцените среднее значение коэффициента погрешности классификации.

ce = kfoldLoss(CVMdl)
ce = 0.0958

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

Загрузите набор данных NLP. Транспонируйте данные предиктора.

load nlpdata
X = X';

Для простоты используйте метку «others» для всех наблюдений в Y которые не являются 'simulink', 'dsp', или 'comm'.

Y(~(ismember(Y,{'simulink','dsp','comm'}))) = 'others';

Создайте шаблон модели линейной классификации, определяющий оптимизацию целевой функции с помощью SpaRSA.

t = templateLinear('Solver','sparsa');

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

rng(1); % For reproducibility 
CVMdl = fitcecoc(X,Y,'Learners',t,'KFold',5,'ObservationsIn','columns');
CMdl1 = CVMdl.Trained{1}
CMdl1 = 
  CompactClassificationECOC
      ResponseName: 'Y'
        ClassNames: [comm    dsp    simulink    others]
    ScoreTransform: 'none'
    BinaryLearners: {6x1 cell}
      CodingMatrix: [4x6 double]


  Properties, Methods

CVMdl является ClassificationPartitionedLinearECOC модель. Он содержит свойство Trained, которая представляет собой массив ячеек 5 на 1, содержащий CompactClassificationECOC модели, которые программное обеспечение обучило с использованием обучающего набора каждой складки.

Создайте функцию, которая принимает минимальные потери для каждого наблюдения, а затем усредняет минимальные потери для всех наблюдений. Поскольку функция не использует матрицу «идентификатор класса» (C), веса наблюдения (W) и стоимость классификации (Cost), использовать ~ иметь kfoldLoss игнорировать их позиции.

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

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

ce = kfoldLoss(CVMdl,'LossFun',lossfun)
ce = 0.0243
ceFold = kfoldLoss(CVMdl,'LossFun',lossfun,'Mode','individual')
ceFold = 5×1

    0.0244
    0.0255
    0.0248
    0.0240
    0.0226

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

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

load nlpdata

X является разреженной матрицей данных предиктора, и Y является категориальным вектором меток класса.

Для простоты используйте метку «others» для всех наблюдений в Y которые не являются 'simulink', 'dsp', или 'comm'.

Y(~(ismember(Y,{'simulink','dsp','comm'}))) = 'others';

Создайте набор из 11 логарифмически разнесенных уровней регуляризации от 10-7 до 10-2.

Lambda = logspace(-7,-2,11);

Создайте шаблон модели линейной классификации, который определяет использование учащихся логистической регрессии, использование штрафов за лассо с сильными сторонами в Lambda, обучение с использованием SpaRSA и понижение допуска на градиенте целевой функции до 1e-8.

t = templateLinear('Learner','logistic','Solver','sparsa',...
    'Regularization','lasso','Lambda',Lambda,'GradientTolerance',1e-8);

Выполните перекрестную проверку моделей. Чтобы увеличить скорость выполнения, транспонируйте данные предиктора и укажите, что наблюдения находятся в столбцах.

X = X'; 
rng(10); % For reproducibility
CVMdl = fitcecoc(X,Y,'Learners',t,'ObservationsIn','columns','KFold',5);

CVMdl является ClassificationPartitionedLinearECOC модель.

Анализировать CVMdlи каждая модель внутри него.

numECOCModels = numel(CVMdl.Trained)
numECOCModels = 5
ECOCMdl1 = CVMdl.Trained{1}
ECOCMdl1 = 
  CompactClassificationECOC
      ResponseName: 'Y'
        ClassNames: [comm    dsp    simulink    others]
    ScoreTransform: 'none'
    BinaryLearners: {6×1 cell}
      CodingMatrix: [4×6 double]


  Properties, Methods

numCLModels = numel(ECOCMdl1.BinaryLearners)
numCLModels = 6
CLMdl1 = ECOCMdl1.BinaryLearners{1}
CLMdl1 = 
  ClassificationLinear
      ResponseName: 'Y'
        ClassNames: [-1 1]
    ScoreTransform: 'logit'
              Beta: [34023×11 double]
              Bias: [-0.3169 -0.3169 -0.3168 -0.3168 -0.3168 -0.3167 -0.1725 -0.0805 -0.1762 -0.3450 -0.5174]
            Lambda: [1.0000e-07 3.1623e-07 1.0000e-06 3.1623e-06 1.0000e-05 3.1623e-05 1.0000e-04 3.1623e-04 1.0000e-03 0.0032 0.0100]
           Learner: 'logistic'


  Properties, Methods

Поскольку fitcecoc реализует пятикратную перекрестную проверку, CVMdl содержит массив ячеек 5 на 1 CompactClassificationECOC модели, которые программное обеспечение обучает на каждой складке. BinaryLearners свойство каждого CompactClassificationECOC модель содержит ClassificationLinear модели. Количество ClassificationLinear модели в каждой компактной модели ECOC зависят от количества отдельных меток и дизайна кодирования. Поскольку Lambda - это последовательность сильных сторон регуляризации, вы можете думать о CLMdl1 как 11 моделей, по одной для каждой силы регуляризации в Lambda.

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

ce = kfoldLoss(CVMdl);
figure;
plot(log10(Lambda),log10(ce))
[~,minCEIdx] = min(ce);
minLambda = Lambda(minCEIdx);
hold on
plot(log10(minLambda),log10(ce(minCEIdx)),'ro');
ylabel('log_{10} 5-fold classification error')
xlabel('log_{10} Lambda')
legend('MSE','Min classification error')
hold off

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

t = templateLinear('Learner','logistic','Solver','sparsa',...
    'Regularization','lasso','Lambda',minLambda,'GradientTolerance',1e-8);
MdlFinal = fitcecoc(X,Y,'Learners',t,'ObservationsIn','columns');

Чтобы оценить метки для новых наблюдений, передайте MdlFinal и новые данные для predict.

Подробнее

развернуть все

Ссылки

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

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

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

Расширенные возможности

Представлен в R2016a