loss

Потеря классификации для классификатора нейронной сети

    Описание

    пример

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

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

    L = loss(Mdl,Tbl,Y) возвращает потерю классификации для классификатора Mdl использование данных о предикторе в таблице Tbl и класс помечает в векторном Y.

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

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

    Примеры

    свернуть все

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

    Загрузите patients набор данных. Составьте таблицу от набора данных. Каждая строка соответствует одному пациенту, и каждый столбец соответствует диагностической переменной. Используйте Smoker переменная как переменная отклика и остальная часть переменных как предикторы.

    load patients
    tbl = table(Diastolic,Systolic,Gender,Height,Weight,Age,Smoker);

    Разделите данные на набор обучающих данных tblTrain и набор тестов tblTest при помощи стратифицированного раздела затяжки. Программное обеспечение резервирует приблизительно 30% наблюдений для набора тестовых данных и использует остальную часть наблюдений для обучающего набора данных.

    rng("default") % For reproducibility of the partition
    c = cvpartition(tbl.Smoker,"Holdout",0.30);
    trainingIndices = training(c);
    testIndices = test(c);
    tblTrain = tbl(trainingIndices,:);
    tblTest = tbl(testIndices,:);

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

    Mdl = fitcnet(tblTrain,"Smoker", ...
        "Standardize",true);

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

    testError = loss(Mdl,tblTest,"Smoker")
    testError = 0.0671
    
    testAccuracy = 1 - testError
    testAccuracy = 0.9329
    

    Модель нейронной сети правильно классифицирует приблизительно 93% наблюдений набора тестов.

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

    Загрузите файл примера fisheriris.csv, который содержит ирисовые данные включая длину чашелистика, ширину чашелистика, лепестковую длину, лепестковую ширину и тип разновидностей. Считайте файл в таблицу.

    fishertable = readtable('fisheriris.csv');

    Разделите данные на набор обучающих данных trainTbl и набор тестов testTbl при помощи стратифицированного раздела затяжки. Программное обеспечение резервирует приблизительно 30% наблюдений для набора тестовых данных и использует остальную часть наблюдений для обучающего набора данных.

    rng("default")
    c = cvpartition(fishertable.Species,"Holdout",0.3);
    trainTbl = fishertable(training(c),:);
    testTbl = fishertable(test(c),:);

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

    allMdl = fitcnet(trainTbl,"Species","Standardize",true);
    subsetMdl = fitcnet(trainTbl,"Species ~ SepalLength + SepalWidth + PetalLength", ...
        "Standardize",true);

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

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

    tiledlayout(2,1)
    
    % Top axes
    ax1 = nexttile;
    allMargins = margin(allMdl,testTbl);
    bar(ax1,allMargins)
    xlabel(ax1,"Observation")
    ylabel(ax1,"Margin")
    title(ax1,"All Predictors")
    
    % Bottom axes
    ax2 = nexttile;
    subsetMargins = margin(subsetMdl,testTbl);
    bar(ax2,subsetMargins)
    xlabel(ax2,"Observation")
    ylabel(ax2,"Margin")
    title(ax2,"Subset of Predictors")

    Сравните ребро классификации наборов тестов или среднее значение полей классификации, этих двух моделей.

    allEdge = edge(allMdl,testTbl)
    allEdge = 0.8198
    
    subsetEdge = edge(subsetMdl,testTbl)
    subsetEdge = 0.9556
    

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

    Сравните ошибку классификации наборов тестов этих двух моделей.

    allError = loss(allMdl,testTbl);
    allAccuracy = 1-allError
    allAccuracy = 0.9111
    
    subsetError = loss(subsetMdl,testTbl);
    subsetAccuracy = 1-subsetError
    subsetAccuracy = 0.9778
    

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

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

    allLabels = predict(allMdl,testTbl);
    figure
    confusionchart(testTbl.Species,allLabels)
    title("All Predictors")

    subsetLabels = predict(subsetMdl,testTbl);
    figure
    confusionchart(testTbl.Species,subsetLabels)
    title("Subset of Predictors")

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

    Учитывая эффективность набора тестов этих двух моделей, рассмотрите использование обученного использования модели всех предикторов кроме PetalWidth.

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

    свернуть все

    Обученный классификатор нейронной сети в виде ClassificationNeuralNetwork объект модели или CompactClassificationNeuralNetwork объект модели, возвращенный fitcnet или compact, соответственно.

    Выборочные данные в виде таблицы. Каждая строка Tbl соответствует одному наблюдению, и каждый столбец соответствует одному переменному предиктору. Опционально, Tbl может содержать дополнительный столбец для переменной отклика. Tbl должен содержать все предикторы, используемые, чтобы обучить Mdl. Многостолбцовые переменные и массивы ячеек кроме массивов ячеек из символьных векторов не позволены.

    • Если Tbl содержит переменную отклика, используемую, чтобы обучить Mdl, затем вы не должны задавать ResponseVarName или Y.

    • Если вы обучили Mdl использование выборочных данных, содержавшихся в таблице, затем входные данные для loss должен также быть в таблице.

    • Если вы устанавливаете 'Standardize',true \in fitcnet когда учебный Mdl, затем программное обеспечение стандартизирует числовые столбцы данных о предикторе с помощью соответствующих средних значений и стандартных отклонений.

    Типы данных: table

    Имя переменной отклика в виде имени переменной в Tbl. Если Tbl содержит переменную отклика, используемую, чтобы обучить Mdl, затем вы не должны задавать ResponseVarName.

    Если вы задаете ResponseVarName, затем необходимо задать его как вектор символов или строковый скаляр. Например, если переменная отклика хранится как Tbl.Y, затем задайте ResponseVarName как 'Y'. В противном случае программное обеспечение обрабатывает все столбцы Tbl, включая Tbl.Y, как предикторы.

    Переменная отклика должна быть категориальным, символом или массивом строк; логический или числовой вектор; или массив ячеек из символьных векторов. Если переменная отклика является символьным массивом, то каждый элемент должен соответствовать одной строке массива.

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

    Класс помечает в виде категориального, символа или массива строк; логический или числовой вектор; или массив ячеек из символьных векторов.

    • Тип данных Y должен совпасть с типом данных Mdl.ClassNames. (Программное обеспечение обрабатывает строковые массивы как массивы ячеек из символьных векторов.)

    • Отличные классы в Y должно быть подмножество Mdl.ClassNames.

    • Если Y символьный массив, затем каждый элемент должен соответствовать одной строке массива.

    • Длина Y должно быть равно количеству наблюдений в X или Tbl.

    Типы данных: categorical | char | string | logical | single | double | cell

    Данные о предикторе в виде числовой матрицы. По умолчанию, loss принимает что каждая строка X соответствует одному наблюдению, и каждый столбец соответствует одному переменному предиктору.

    Примечание

    Если вы ориентируете свою матрицу предиктора так, чтобы наблюдения соответствовали столбцам и задали 'ObservationsIn','columns', затем вы можете испытать значительное сокращение во время вычисления.

    Длина Y и количество наблюдений в X должно быть равным.

    Если вы устанавливаете 'Standardize',true \in fitcnet когда учебный Mdl, затем программное обеспечение стандартизирует числовые столбцы данных о предикторе с помощью соответствующих средних значений и стандартных отклонений.

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

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

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

    Пример: loss(Mdl,Tbl,"Response","LossFun","crossentropy") задает, чтобы вычислить потерю перекрестной энтропии для модели Mdl.

    Функция потерь в виде встроенного имени функции потерь или указателя на функцию.

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

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

      Для получения дополнительной информации о функциях потерь смотрите Потерю Классификации.

    • Чтобы задать пользовательскую функцию потерь, используйте обозначение указателя на функцию. Функция должна иметь эту форму:

      lossvalue = lossfun(C,S,W,Cost)

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

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

      • C n- K логическая матрица со строками, указывающими на класс, которому принадлежит соответствующее наблюдение. n количество наблюдений в Tbl или X, и K количество отличных классов (numel(Mdl.ClassNames). Порядок следования столбцов соответствует порядку класса в Mdl.ClassNames. Создайте C установкой C(p,q) = 1, если наблюдение p находится в классе q, для каждой строки. Установите все другие элементы строки p к 0.

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

      • W n- 1 числовой вектор из весов наблюдения.

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

    Пример: 'LossFun','crossentropy'

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

    Размерность наблюдения данных о предикторе в виде 'rows' или 'columns'.

    Примечание

    Если вы ориентируете свою матрицу предиктора так, чтобы наблюдения соответствовали столбцам и задали 'ObservationsIn','columns', затем вы можете испытать значительное сокращение во время вычисления. Вы не можете задать 'ObservationsIn','columns' для данных о предикторе в таблице.

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

    Веса наблюдения в виде неотрицательного числового вектора или имени переменной в Tbl. Веса программного обеспечения каждое наблюдение в X или Tbl с соответствующим значением в Weights. Длина Weights должен равняться количеству наблюдений в X или Tbl.

    Если вы задаете входные данные как таблицу Tbl, затем Weights может быть имя переменной в Tbl это содержит числовой вектор. В этом случае необходимо задать Weights как вектор символов или строковый скаляр. Например, если вектор весов W хранится как Tbl.W, затем задайте его как 'W'.

    По умолчанию, Weights ones(n,1), где n количество наблюдений в X или Tbl.

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

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

    Больше о

    свернуть все

    Потеря классификации

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

    Рассмотрите следующий сценарий.

    • L является средневзвешенной потерей классификации.

    • n является объемом выборки.

    • Для бинарной классификации:

      • yj является наблюдаемой меткой класса. Программные коды это как –1 или 1, указывая на отрицательный или положительный класс (или первый или второй класс в ClassNames свойство), соответственно.

      • f (Xj) является классификационной оценкой положительного класса для наблюдения (строка) j данных о предикторе X.

      • mj = yj f (Xj) является классификационной оценкой для классификации наблюдения j в класс, соответствующий yj. Положительные значения mj указывают на правильную классификацию и не способствуют очень средней потере. Отрицательные величины mj указывают на неправильную классификацию и значительно способствуют средней потере.

    • Для алгоритмов, которые поддерживают классификацию мультиклассов (то есть, K ≥ 3):

      • yj* является вектором из K – 1 нуль, с 1 в положении, соответствующем истинному, наблюдаемому классу yj. Например, если истинный класс второго наблюдения является третьим классом и K = 4, то y 2* = [0 0 1 0] ′. Порядок классов соответствует порядку в ClassNames свойство входной модели.

      • f (Xj) является длиной вектор K из музыки класса к наблюдению j данных о предикторе X. Порядок баллов соответствует порядку классов в ClassNames свойство входной модели.

      • mj = yj*f (Xj). Поэтому mj является скалярной классификационной оценкой, которую модель предсказывает для истинного, наблюдаемого класса.

    • Весом для наблюдения j является wj. Программное обеспечение нормирует веса наблюдения так, чтобы они суммировали к соответствующей предшествующей вероятности класса. Программное обеспечение также нормирует априорные вероятности, таким образом, они суммируют к 1. Поэтому

      j=1nwj=1.

    Учитывая этот сценарий, следующая таблица описывает поддерживаемые функции потерь, которые можно задать при помощи 'LossFun' аргумент пары "имя-значение".

    Функция потерьЗначение LossFunУравнение
    Биномиальное отклонение'binodeviance'L=j=1nwjlog{1+exp[2mj]}.
    Неправильно классифицированный уровень в десятичном числе'classiferror'

    L=j=1nwjI{y^jyj}.

    y^j метка класса, соответствующая классу с максимальным счетом. I {·} является функцией индикатора.

    Потеря перекрестной энтропии'crossentropy'

    'crossentropy' подходит только для моделей нейронной сети.

    Взвешенная потеря перекрестной энтропии

    L=j=1nw˜jlog(mj)Kn,

    где веса w˜j нормированы, чтобы суммировать к n вместо 1.

    Экспоненциальная потеря'exponential'L=j=1nwjexp(mj).
    Потеря стержня'hinge'L=j=1nwjmax{0,1mj}.
    Потеря логита'logit'L=j=1nwjlog(1+exp(mj)).
    Минимальный ожидал стоимость misclassification'mincost'

    'mincost' является соответствующим, только если классификационные оценки являются апостериорными вероятностями.

    Программное обеспечение вычисляет взвешенную минимальную ожидаемую стоимость классификации с помощью этой процедуры для наблюдений j = 1..., n.

    1. Оцените ожидаемую misclassification стоимость классификации наблюдения Xj в класс k:

      γjk=(f(Xj)C)k.

      f (Xj) является вектор-столбцом апостериорных вероятностей класса для двоичного файла и классификации мультиклассов для наблюдения Xj. C является матрицей стоимости, сохраненной в Cost свойство модели.

    2. Для наблюдения j предскажите, что метка класса, соответствующая минимальному, ожидала стоимость misclassification:

      y^j=argmink=1,...,Kγjk.

    3. Используя C, идентифицируйте, что стоимость подверглась (cj) для того, чтобы сделать предсказание.

    Взвешенное среднее минимального ожидало, что потеря стоимости misclassification

    L=j=1nwjcj.

    Если вы используете матрицу стоимости по умолчанию (чье значение элемента 0 для правильной классификации и 1 для неправильной классификации), то 'mincost' потеря эквивалентна 'classiferror' потеря.

    Квадратичная потеря'quadratic'L=j=1nwj(1mj)2.

    Этот рисунок сравнивает функции потерь (кроме 'crossentropy' и 'mincost') по счету m для одного наблюдения. Некоторые функции нормированы, чтобы пройти через точку (0,1).

    Comparison of classification losses for different loss functions

    Введенный в R2021a