Дискриминантный анализ требует данных, достаточных для соответствия гауссовым моделям с обратимыми ковариационными матрицами. Если ваших данных недостаточно для уникального соответствия такой модели, fitcdiscr не удается. В этом разделе представлены методы обработки отказов.
Совет
Чтобы получить классификатор анализа дискриминанта без сбоев, установите DiscrimType пара имя-значение к 'pseudoLinear' или 'pseudoQuadratic' в fitcdiscr.
Дискриминанты «Pseudo» никогда не терпят неудачу, поскольку используют псевдоинверсию ковариационной матрицы Startk (см. pinv).
Когда ковариационная матрица аппроксимированного классификатора является сингулярной, fitcdiscr может привести к сбою:
load popcorn
X = popcorn(:,[1 2]);
X(:,3) = 0; % a zero-variance column
Y = popcorn(:,3);
ppcrn = fitcdiscr(X,Y);
Error using ClassificationDiscriminant (line 635)
Predictor x3 has zero variance. Either exclude this predictor or set 'discrimType' to
'pseudoLinear' or 'diagLinear'.
Error in classreg.learning.FitTemplate/fit (line 243)
obj = this.MakeFitObject(X,Y,W,this.ModelParameters,fitArgs{:});
Error in fitcdiscr (line 296)
this = fit(temp,X,Y);Чтобы продолжить линейный дискриминантный анализ, используйте pseudoLinear или diagLinear дискриминантный тип:
ppcrn = fitcdiscr(X,Y,...
'discrimType','pseudoLinear');
meanpredict = predict(ppcrn,mean(X))
meanpredict =
3.5000Существует шесть типов классификаторов дискриминантного анализа: линейный и квадратичный, с диагональными и псевдоповторами каждого типа.
Совет
Чтобы увидеть, является ли ваша ковариационная матрица сингулярной, установите discrimType кому 'linear' или 'quadratic'. Если матрица является сингулярной, fitcdiscr ошибка метода для 'quadratic', и Gamma свойство имеет ненулевое значение для 'linear'.
Чтобы получить квадратичный классификатор, даже если ковариационная матрица является сингулярной, установите DiscrimType кому 'pseudoQuadratic' или 'diagQuadratic'.
obj = fitcdiscr(X,Y,'DiscrimType','pseudoQuadratic') % or 'diagQuadratic'
Выберите тип классификатора, установив discrimType пара имя-значение к одному из:
'linear' (по умолчанию) - оценка одной ковариационной матрицы для всех классов.
'quadratic' - Оценка одной ковариационной матрицы для каждого класса.
'diagLinear' - Используйте диагональ 'linear' ковариационная матрица и при необходимости использовать ее псевдоинверсию.
'diagQuadratic' - Использовать диагонали 'quadratic' ковариационные матрицы и при необходимости использовать их псевдоинверсии.
'pseudoLinear' - использовать псевдоинверсию 'linear' ковариационная матрица при необходимости.
'pseudoQuadratic' - Использовать псевдоинверсии 'quadratic' ковариационные матрицы при необходимости.
fitcdiscr может завершиться неуспешно для 'linear' и 'quadratic' классификаторы. При сбое возвращается объяснение, как показано в разделе Сделка с сингулярными данными.
fitcdiscr всегда успешно выполняется с диагональными и псевдопеременами. Сведения о псевдоинверсиях см. в разделе pinv.
Дискриминантный тип можно задать с помощью точечной нотации после построения классификатора:
obj.DiscrimType = 'discrimType'
Можно изменять между линейными типами или между квадратичными типами, но нельзя изменять между линейными и квадратичными типами.
Ошибка повторного замещения представляет собой разницу между данными обучения ответу и прогнозами, которые классификатор делает для ответа на основании входных данных обучения. Если ошибка повторного замещения высока, нельзя ожидать, что прогнозы классификатора будут хорошими. Однако наличие низкой ошибки повторного замещения не гарантирует хороших прогнозов для новых данных. Ошибка повторного замещения часто является чрезмерно оптимистичной оценкой предиктивной ошибки для новых данных.
Матрица путаницы показывает, сколько ошибок и какие типы возникают при повторном замещении. Когда есть K классы, матрица путаницы R является Kоколо-K матрица с
R(i,j) = количество наблюдений за классом i что классификатор прогнозирует класс j.
Проверьте ошибку повторного замещения классификатора дискриминантного анализа по умолчанию для данных радужки Фишера:
load fisheriris
obj = fitcdiscr(meas,species);
resuberror = resubLoss(obj)
resuberror =
0.0200Ошибка повторного предоставления очень мала, что означает obj правильно классифицирует почти все данные радужки Фишера. Общее число ошибочных классификаций:
resuberror * obj.NumObservations
ans =
3.0000Чтобы увидеть детали трех неправильных классификаций, изучите матрицу путаницы:
R = confusionmat(obj.Y,resubPredict(obj))
R =
50 0 0
0 48 2
0 1 49
obj.ClassNames
ans =
'setosa'
'versicolor'
'virginica'R(1,:) = [50 0 0] средства obj правильно классифицирует все 50 сетозных ирисов.
R(2,:) = [0 48 2] средства obj правильно классифицирует 48 ирисов versicolor и неправильно классифицирует два ириса versicolor как virginica.
R(3,:) = [0 1 49] средства obj правильно классифицирует 49 ирисов virginica и неправильно классифицирует одну ирису virginica как versicolor.
Как правило, классификаторы дискриминантного анализа являются надежными и не демонстрируют чрезмерной подготовки, когда количество предикторов намного меньше, чем количество наблюдений. Тем не менее, рекомендуется выполнять перекрестную проверку классификатора для обеспечения его стабильности.
В этом примере показано, как выполнить пятикратную перекрестную проверку квадратичного классификатора дискриминантного анализа.
Загрузите образцы данных.
load fisheririsСоздайте квадратичный классификатор дискриминантного анализа для данных.
quadisc = fitcdiscr(meas,species,'DiscrimType','quadratic');
Найдите ошибку повторного замещения классификатора.
qerror = resubLoss(quadisc)
qerror = 0.0200
Классификатор отлично справляется с работой. Тем не менее, ошибка повторного замещения может быть оптимистичной оценкой ошибки при классификации новых данных. Так что переходите к перекрестной проверке.
Создайте модель перекрестной проверки.
cvmodel = crossval(quadisc,'kfold',5);Найдите потерю перекрестной проверки для модели, означающую ошибку нестандартных наблюдений.
cverror = kfoldLoss(cvmodel)
cverror = 0.0200
Перекрестный подтвержденный убыток является таким же низким, как и первоначальный убыток в связи с возвратом. Поэтому можно быть уверенным, что классификатор достаточно точен.
Иногда требуется избежать некоторых ошибок классификации в большей степени, чем других. Например, может быть лучше иметь сверхчувствительное обнаружение рака, а не недостаточно чувствительное обнаружение рака. Сверхчувствительное обнаружение дает больше ложных срабатываний (ненужное тестирование или лечение). Недостаточно чувствительное обнаружение дает больше ложных негативов (предотвратимые заболевания или смерти). Последствия недодетектирования могут быть высокими. Поэтому может потребоваться установить затраты для отражения последствий.
Аналогичным образом, данные обучения Y может иметь распределение классов, которое не представляет их истинную частоту. Если у вас есть лучшая оценка истинной частоты, вы можете включить эти знания в классификацию Prior собственность.
Рассмотрим данные радужки Фишера. Предположим, что стоимость классификации диафрагмы versicolor как virginica в 10 раз больше, чем любой другой ошибки классификации. Создайте классификатор на основе данных, затем включите эту стоимость и просмотрите полученный классификатор.
Загрузите данные радужки Фишера и создайте классификатор по умолчанию (линейный), как в примере: Ошибка повторного замещения классификатора анализа дискриминантов:
load fisheriris
obj = fitcdiscr(meas,species);
resuberror = resubLoss(obj)
resuberror =
0.0200
R = confusionmat(obj.Y,resubPredict(obj))
R =
50 0 0
0 48 2
0 1 49
obj.ClassNames
ans =
'setosa'
'versicolor'
'virginica'R(2,:) = [0 48 2] средства obj правильно классифицирует 48 ирисов versicolor и неправильно классифицирует два ириса versicolor как virginica.
Измените матрицу затрат, чтобы уменьшить количество ошибок при классификации ирисов versicolor как virginica:
obj.Cost(2,3) = 10;
R2 = confusionmat(obj.Y,resubPredict(obj))
R2 =
50 0 0
0 50 0
0 7 43obj теперь правильно классифицирует все ирисы versicolor за счет увеличения числа ошибочных классификаций ирисов virginica от 1 кому 7.
Рассмотрим данные радужки Фишера. В данных по 50 ирисов каждого вида. Предположим, что в конкретном регионе у вас есть исторические данные, которые показывают, что virginica в пять раз более распространены, чем другие виды. Создайте классификатор, включающий эту информацию.
Загрузите данные радужной оболочки Фишера и создайте классификатор по умолчанию (линейный), как в примере: Ошибка повторного замещения классификатора дискриминантного анализа:
load fisheriris
obj = fitcdiscr(meas,species);
resuberror = resubLoss(obj)
resuberror =
0.0200
R = confusionmat(obj.Y,resubPredict(obj))
R =
50 0 0
0 48 2
0 1 49
obj.ClassNames
ans =
'setosa'
'versicolor'
'virginica'R(3,:) = [0 1 49] средства obj правильно классифицирует 49 ирисов virginica и неправильно классифицирует одну ирису virginica как versicolor.
Измените предшествующее сопоставление исторических данных и изучите матрицу путаницы нового классификатора:
obj.Prior = [1 1 5];
R2 = confusionmat(obj.Y,resubPredict(obj))
R2 =
50 0 0
0 46 4
0 0 50Новый классификатор правильно классифицирует все ирисы virginica, за счет увеличения числа неправильных классификаций ирисов versicolor от 2 кому 4.