Классифицируйте наблюдения с помощью классификатора нейронных сетей
[
также возвращает матрицу классификационных оценок, указывающую вероятность того, что метка происходит от определенного класса, используя любую из комбинаций входных аргументов в предыдущих синтаксисах. Для каждого наблюдения в 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
Mdl
- Обученный классификатор нейронной сетиClassificationNeuralNetwork
объект модели | CompactClassificationNeuralNetwork
объект моделиОбученный классификатор нейронной сети, заданный как ClassificationNeuralNetwork
объект модели
объект модели, возвращенный fitcnet
или compact
, соответственно.
X
- Данные предиктора, которые будут классифицированыДанные предиктора, которые будут классифицированы, заданные как числовая матрица или таблица.
По умолчанию каждая строка 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
dimension
- размерность наблюдения данных предиктора'rows'
(по умолчанию) | 'columns'
Размерность наблюдения данных предиктора, заданная как 'rows'
или 'columns'
.
Примечание
Если вы ориентируете матрицу предиктора так, чтобы наблюдения соответствовали столбцам и задавали 'ObservationsIn','columns'
, тогда вы можете испытать значительное сокращение времени расчета. Вы не можете задать 'ObservationsIn','columns'
для данных предиктора в таблице.
Типы данных: char
| string
label
- Предсказанные метки классовПредсказанные метки классов, возвращенные как числовой, категориальный или логический вектор; символьные или строковые массивы; или массив ячеек из векторов символов. Программа предсказывает классификацию наблюдения путем присвоения наблюдения классу, дающему наибольшую классификационную оценку или апостериорную вероятность.
label
имеет тот совпадающий тип данных, что и наблюдаемые метки классов, которые обучали Mdl
, и его длина равна количеству наблюдений в X
. (Программа обрабатывает массивы строк как массивы ячеек векторов символов.)
Score
- Классификационные оценкиКлассификационные оценки, возвращенные как n -by - K матрица, где n - количество наблюдений в X
и K количество уникальных классов. Классификационная оценка Score(i,j)
представляет апостериорную вероятность того, что i
первое наблюдение принадлежит классу j
.
Классификатор classification scores для нейронной сети вычисляется с помощью функции активации softmax, которая следует за конечным полносвязным слоем в сети. Эти счета соответствуют апостериорным вероятностям.
Апостериорная вероятность того, что x наблюдения имеет класс k,
где
P (x | k) является условной вероятностью x, данного класс k.
P (k) является предшествующей вероятностью для k класса.
K - количество классов в переменной отклика.
a k (x) является k выхода из конечного полносвязного слоя для x наблюдений.
ClassificationNeuralNetwork
| CompactClassificationNeuralNetwork
| edge
| fitcnet
| loss
| margin
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.