exponenta event banner

kfoldLoss

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

Описание

пример

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

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

пример

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

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

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

Перекрестно проверенная, двоичная, линейная модель классификации, указанная как ClassificationPartitionedLinear объект модели. Можно создать ClassificationPartitionedLinear модель с использованием fitclinear и указание любого из аргументов пары «имя-значение» перекрестной проверки, например, CrossVal.

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

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

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

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

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

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

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

  • В следующей таблице перечислены доступные функции потерь. Укажите его с помощью соответствующего вектора символа или скаляра строки.

    СтоимостьОписание
    'binodeviance'Биномиальное отклонение
    'classiferror'Неверно классифицированная скорость в десятичной
    'exponential'Экспоненциальные потери
    'hinge'Потеря шарнира
    'logit'Логистические потери
    'mincost'Минимальная ожидаемая стоимость неправильной классификации (для классификационных оценок, которые являются задними вероятностями)
    'quadratic'Квадратичные потери

    'mincost' подходит для классификационных оценок, которые являются задними вероятностями. Для моделей линейной классификации учащиеся логистической регрессии по умолчанию возвращают апостериорные вероятности в качестве классификационных баллов, а учащиеся SVM - нет (см. predict).

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

    Давайте n быть числом наблюдений в X и K быть числом различных классов (numel(Mdl.ClassNames), Mdl - входная модель). Ваша функция должна иметь эту подпись

    lossvalue = lossfun(C,S,W,Cost)
    где:

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

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

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

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

    • S является nоколо-K числовая матрица классификационных баллов. Порядок столбцов соответствует порядку классов в Mdl.ClassNames. S - матрица классификационных баллов, аналогичная выходному результату predict.

    • W является n-по-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'Возвращает потери для каждого раза

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

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

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

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

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

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

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

Оценить L, kfoldLoss использует созданные данные CVMdl (см. X и Y).

Примеры

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

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

load nlpdata

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

Модели должны определять, содержится ли подсчет слов на веб-странице в документации Toolbox™ статистики и машинного обучения. Таким образом, определите метки, соответствующие страницам документации Toolbox™ статистики и машинного обучения.

Ystats = Y == 'stats';

Перекрестная проверка бинарной модели линейной классификации, которая может определить, находится ли подсчет слов на веб-странице документации из документации Toolbox™ статистики и машинного обучения.

rng(1); % For reproducibility 
CVMdl = fitclinear(X,Ystats,'CrossVal','on');

CVMdl является ClassificationPartitionedLinear модель. По умолчанию программное обеспечение реализует 10-кратную перекрестную проверку. Можно изменить количество сгибов с помощью 'KFold' аргумент пары имя-значение.

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

ce = kfoldLoss(CVMdl)
ce = 7.6017e-04

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

Загрузите набор данных NLP. Выполните предварительную обработку данных, как указано в разделе Оценка k-кратной ошибки классификации перекрестной проверки, и перенесите данные предиктора.

load nlpdata
Ystats = Y == 'stats';
X = X';

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

rng(1); % For reproducibility 
CVMdl = fitclinear(X,Ystats,'Solver','sparsa','KFold',5,...
    'ObservationsIn','columns');
CMdl = CVMdl.Trained{1};

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

Создайте анонимную функцию, измеряющую линейные потери, т. е.

L=∑j-wjyjfj∑jwj.

wj - вес для наблюдения j, y_j - ответ j (-1 для отрицательного класса и 1 в противном случае), а f_j - необработанный классификационный балл для наблюдения j. Пользовательские функции потери должны быть написаны в определенной форме. Правила записи пользовательской функции потери см. в разделе LossFun аргумент пары имя-значение. Поскольку функция не использует классификационные затраты, используйте ~ иметь kfoldLoss игнорировать его положение.

linearloss = @(C,S,W,~)sum(-W.*sum(S.*C,2))/sum(W);

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

ce = kfoldLoss(CVMdl,'LossFun',linearloss)
ce = -8.0982
ceFold = kfoldLoss(CVMdl,'LossFun',linearloss,'Mode','individual')
ceFold = 5×1

   -8.3165
   -8.7633
   -7.4342
   -8.0423
   -7.9347

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

Загрузите набор данных NLP. Выполните предварительную обработку данных, как указано в разделе «Пользовательская потеря классификации».

load nlpdata
Ystats = Y == 'stats';
X = X';

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

Lambda = logspace(-6,-0.5,11);

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

rng(10); % For reproducibility
CVMdl = fitclinear(X,Ystats,'ObservationsIn','columns',...
    'KFold',5,'Learner','logistic','Solver','sparsa',...
    'Regularization','lasso','Lambda',Lambda,'GradientTolerance',1e-8)
CVMdl = 
  ClassificationPartitionedLinear
    CrossValidatedModel: 'Linear'
           ResponseName: 'Y'
        NumObservations: 31572
                  KFold: 5
              Partition: [1x1 cvpartition]
             ClassNames: [0 1]
         ScoreTransform: 'none'


  Properties, Methods

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

Mdl1 = CVMdl.Trained{1}
Mdl1 = 
  ClassificationLinear
      ResponseName: 'Y'
        ClassNames: [0 1]
    ScoreTransform: 'logit'
              Beta: [34023x11 double]
              Bias: [1x11 double]
            Lambda: [1x11 double]
           Learner: 'logistic'


  Properties, Methods

Mdl1 является ClassificationLinear объект модели. Поскольку Lambda - это последовательность сильных сторон регуляризации, вы можете думать о Mdl как 11 моделей, по одной для каждой силы регуляризации в Lambda.

Оценка кросс-проверенной ошибки классификации.

ce = kfoldLoss(CVMdl);

Потому что есть 11 сильных сторон регуляризации, ce является вектором 1 на 11 коэффициентов ошибок классификации.

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

Mdl = fitclinear(X,Ystats,'ObservationsIn','columns',...
    'Learner','logistic','Solver','sparsa','Regularization','lasso',...
    'Lambda',Lambda,'GradientTolerance',1e-8);
numNZCoeff = sum(Mdl.Beta~=0);

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

figure;
[h,hL1,hL2] = plotyy(log10(Lambda),log10(ce),...
    log10(Lambda),log10(numNZCoeff)); 
hL1.Marker = 'o';
hL2.Marker = 'o';
ylabel(h(1),'log_{10} classification error')
ylabel(h(2),'log_{10} nonzero-coefficient frequency')
xlabel('log_{10} Lambda')
title('Test-Sample Statistics')
hold off

Figure contains 2 axes. Axes 1 with title Test-Sample Statistics contains an object of type line. Axes 2 contains an object of type line.

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

idxFinal = 7;

Выберите модель из Mdl с выбранной силой регуляризации.

MdlFinal = selectModels(Mdl,idxFinal);

MdlFinal является ClassificationLinear модель, содержащая одну силу регуляризации. Чтобы оценить метки для новых наблюдений, передайте MdlFinal и новые данные для predict.

Подробнее

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

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