predict

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

    Описание

    пример

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

    label = predict(Mdl,X,'ObservationsIn',dimension) задает размерность наблюдения данных предиктора, либо 'rows' (по умолчанию) или 'columns'. Для примера задайте 'ObservationsIn','columns' чтобы указать, что столбцы в данных предиктора соответствуют наблюдениям.

    пример

    [label,Score] = predict(___) также возвращает матрицу классификационных оценок, указывающую вероятность того, что метка происходит от определенного класса, используя любую из комбинаций входных аргументов в предыдущих синтаксисах. Для каждого наблюдения в X, предсказанная метка класса соответствует максимальному счету среди всех классов.

    Примеры

    свернуть все

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

    Загрузите 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);

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

    label = predict(Mdl,tblTest);
    confusionchart(tblTest.Smoker,label)

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

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

    Загрузите образец файла 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, указывают на уверенные классификации, а отрицательные значения полей указывают на неправильную классификацию.

    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.

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

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

    fishertable = readtable('fisheriris.csv');

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

    Mdl = fitcnet(fishertable,"Species");

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

    newPoint = Mdl.X{15,:}
    newPoint = 1×4
    
        5.8000    4.0000    1.2000    0.2000
    
    
    firstFCStep = (Mdl.LayerWeights{1})*newPoint' + Mdl.LayerBiases{1};
    reluStep = max(firstFCStep,0);
    
    finalFCStep = (Mdl.LayerWeights{end})*reluStep + Mdl.LayerBiases{end};
    finalSoftmaxStep = softmax(finalFCStep);
    
    [~,classIdx] = max(finalSoftmaxStep);
    newPointLabel = Mdl.ClassNames{classIdx}
    newPointLabel = 
    'setosa'
    
    newPointScores = finalSoftmaxStep'
    newPointScores = 1×3
    
        1.0000    0.0000    0.0000
    
    

    Проверяйте, что предсказания совпадают с прогнозами, возвращаемыми predict функция объекта.

    [predictedLabel,predictedScores] = predict(Mdl,newPoint)
    predictedLabel = 1×1 cell array
        {'setosa'}
    
    
    predictedScores = 1×3
    
        1.0000    0.0000    0.0000
    
    

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

    свернуть все

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

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

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

    • Для числовой матрицы:

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

      • Если вы обучаете Mdl использование таблицы (для примера, Tbl) и Tbl содержит только числовые переменные предиктора, тогда X может быть числовой матрицей. Для лечения числовых предикторов в Tbl как категориальный во время обучения, идентифицируйте категориальные предикторы с помощью CategoricalPredictors аргумент имя-значение fitcnet. Если Tbl содержит неоднородные переменные предиктора (для примера, числовых и категориальных типов данных) и X является числовой матрицей, тогда predict выдает ошибку.

    • Для таблицы:

      • predict не поддерживает многополюсные переменные или массивы ячеек, отличные от массивов ячеек векторов символов.

      • Если вы обучаете Mdl использование таблицы (для примера, Tbl), затем все переменные предиктора в X должны иметь те же имена переменных и типы данных, что и обученные переменные Mdl (хранится в Mdl.PredictorNames). Однако порядок столбцов X не должен соответствовать порядку столбцов Tbl. Кроме того, Tbl и X может содержать дополнительные переменные (переменные отклика, веса наблюдений и так далее), но predict игнорирует их.

      • Если вы обучаете Mdl используя числовую матрицу, затем имена предикторов в Mdl.PredictorNames должен быть таким же, как и соответствующий предиктор, имена переменных в X. Чтобы задать имена предикторов во время обучения, используйте PredictorNames аргумент имя-значение fitcnet. Все переменные предиктора в X должны быть числовыми векторами. X может содержать дополнительные переменные (переменные отклика, веса наблюдений и так далее), но predict игнорирует их.

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

    Примечание

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

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

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

    Примечание

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

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

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

    свернуть все

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

    label имеет тот совпадающий тип данных, что и наблюдаемые метки классов, которые обучали Mdl, и его длина равна количеству наблюдений в X. (Программа обрабатывает массивы строк как массивы ячеек векторов символов.)

    Классификационные оценки, возвращенные как n -by - K матрица, где n - количество наблюдений в X и K количество уникальных классов. Классификационная оценка Score(i,j) представляет апостериорную вероятность того, что iпервое наблюдение принадлежит классу j.

    Подробнее о

    свернуть все

    Классификационные оценки

    Классификатор classification scores для нейронной сети вычисляется с помощью функции активации softmax, которая следует за конечным полносвязным слоем в сети. Эти счета соответствуют апостериорным вероятностям.

    Апостериорная вероятность того, что x наблюдения имеет класс k,

    P^(k|x)=P(x|k)P(k)j=1KP(x|j)P(j)=exp(ak(x))j=1Kexp(aj(x))

    где

    • P (x | k) является условной вероятностью x, данного класс k.

    • P (k) является предшествующей вероятностью для k класса.

    • K - количество классов в переменной отклика.

    • a k (x) является k выхода из конечного полносвязного слоя для x наблюдений.

    Введенный в R2021a