Дискриминантному анализу нужны данные, достаточные для подгонки Гауссовых моделей с инвертируемыми ковариационными матрицами. Если ваших данных недостаточно, чтобы однозначно соответствовать такой модели, fitcdiscr
сбой. В этом разделе показаны методы обработки отказов.
Совет
Чтобы получить классификатор дискриминантного анализа без отказа, установите DiscrimType
Пара "имя-значение" с 'pseudoLinear'
или 'pseudoQuadratic'
в fitcdiscr
.
«Псевдослучайные» дискриминанты никогда не выходят из строя, потому что они используют псевдослучайные матрицы ковариации и k ( см.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
Существует шесть типов классификаторов дискриминантного анализа: линейный и квадратичный, с diagonal и pseudo вариантами каждого типа.
Совет
Чтобы увидеть, является ли ваша ковариационная матрица сингулярной, установите 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'
Вы можете изменяться между линейными типами или между квадратичными типами, но не можете меняться между линейным и квадратичным типами.
resubstitution error является различием между обучающими данными отклика и предсказаниями, которые делает классификатор отклика на основе входных обучающих данных. Если ошибка реституции высока, вы не можете ожидать, что предсказания классификатора будут хорошими. Однако наличие низкой ошибки реституции не гарантирует хорошие предсказания для новых данных. Ошибка реституции часто является чрезмерно оптимистичной оценкой прогнозирующей ошибки на новых данных.
Этот confusion matrix показывает, сколько ошибок, и какие типы, возникают при реституции. Когда есть K
классы, матрица неточностей R
является K
-by- 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 сетоса irise правильно.
R(2,:) = [0 48 2]
означает obj
классифицирует 48 versicolor irises правильно, и неправильно классифицирует две versicolor irises как virginica.
R(3,:) = [0 1 49]
означает obj
правильно классифицирует 49 виргинийских ирисов и неправильно классифицирует одну ирису виргиники как версиколор.
Как правило, классификаторы дискриминантного анализа являются устойчивыми и не показывают переобучения, когда количество предикторов намного меньше, чем количество наблюдений. Тем не менее, это хорошая практика, чтобы перекрестно подтвердить ваш классификатор, чтобы гарантировать его стабильность.
В этом примере показано, как выполнить пятикратную перекрестную валидацию квадратичного классификатора дискриминантного анализа.
Загрузите выборочные данные.
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
свойство.
Рассмотрим данные ириса Фишера. Предположим, что стоимость классификации orsicolor iris как 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 irises правильно, и неправильно классифицирует две versicolor irises как virginica.
Измените матрицу затрат, чтобы сделать меньше ошибок в классификации версиколор-ирисов как virginica:
obj.Cost(2,3) = 10; R2 = confusionmat(obj.Y,resubPredict(obj)) R2 = 50 0 0 0 50 0 0 7 43
obj
теперь классифицирует все версиколорные ирисы правильно, за счет увеличения количества неправильных классификаций ирисов 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 виргинийских ирисов и неправильно классифицирует одну ирису виргиники как версиколор.
Измените предшествующее, чтобы соответствовать вашим историческим данным и исследуйте матрицу неточностей нового классификатора:
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
.