predict

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

Описание

пример

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

пример

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

Примеры

свернуть все

Загрузите fisheriris набор данных. Создание X как числовая матрица, которая содержит четыре измерения лепестков для 150 ирисов. Создание Y как массив ячеек из векторов символов, который содержит соответствующие виды радужной оболочки.

load fisheriris
X = meas;
Y = species;
rng('default')  % for reproducibility

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

cv = cvpartition(Y,'HoldOut',0.30);

Извлеките индексы обучения и тестирования.

trainInds = training(cv);
testInds = test(cv);

Укажите наборы обучающих и тестовых данных.

XTrain = X(trainInds,:);
YTrain = Y(trainInds);
XTest = X(testInds,:);
YTest = Y(testInds);

Обучите наивный классификатор Байеса с помощью предикторов XTrain и метки классов YTrain. Рекомендуемая практика состоит в том, чтобы задать имена классов. fitcnb принимает, что каждый предиктор условно и нормально распределен.

Mdl = fitcnb(XTrain,YTrain,'ClassNames',{'setosa','versicolor','virginica'})
Mdl = 
  ClassificationNaiveBayes
              ResponseName: 'Y'
     CategoricalPredictors: []
                ClassNames: {'setosa'  'versicolor'  'virginica'}
            ScoreTransform: 'none'
           NumObservations: 105
         DistributionNames: {'normal'  'normal'  'normal'  'normal'}
    DistributionParameters: {3x4 cell}


  Properties, Methods

Mdl является обученным ClassificationNaiveBayes классификатор.

Спрогнозируйте метки тестовых выборок.

idx = randsample(sum(testInds),10);
label = predict(Mdl,XTest);

Отобразите результаты для случайного набора из 10 наблюдений в тестовой выборке.

table(YTest(idx),label(idx),'VariableNames',...
    {'TrueLabel','PredictedLabel'})
ans=10×2 table
      TrueLabel       PredictedLabel
    ______________    ______________

    {'virginica' }    {'virginica' }
    {'versicolor'}    {'versicolor'}
    {'versicolor'}    {'versicolor'}
    {'virginica' }    {'virginica' }
    {'setosa'    }    {'setosa'    }
    {'virginica' }    {'virginica' }
    {'setosa'    }    {'setosa'    }
    {'versicolor'}    {'versicolor'}
    {'versicolor'}    {'virginica' }
    {'versicolor'}    {'versicolor'}

Создайте график неточностей из истинных меток YTest и предсказанные метки label.

cm = confusionchart(YTest,label);

Figure contains an object of type ConfusionMatrixChart.

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

Загрузите fisheriris набор данных. Создание X как числовая матрица, которая содержит четыре измерения лепестков для 150 ирисов. Создание Y как массив ячеек из векторов символов, который содержит соответствующие виды радужной оболочки.

load fisheriris
X = meas;
Y = species;
rng('default')  % for reproducibility

Разделите набор данных на два набора: один содержит набор обучающих данных, а другой содержит новые, незащищенные данные. Резервируйте 10 наблюдений для нового набора данных.

n = size(X,1);
newInds = randsample(n,10);
inds = ~ismember(1:n,newInds);
XNew = X(newInds,:);
YNew = Y(newInds);

Обучите наивный классификатор Байеса с помощью предикторов X и метки классов Y. Рекомендуемая практика состоит в том, чтобы задать имена классов. fitcnb принимает, что каждый предиктор условно и нормально распределен.

Mdl = fitcnb(X(inds,:),Y(inds),...
    'ClassNames',{'setosa','versicolor','virginica'});

Mdl является обученным ClassificationNaiveBayes классификатор.

Сохраните память путем уменьшения размера обученного наивного классификатора Байеса.

CMdl = compact(Mdl);
whos('Mdl','CMdl')
  Name      Size            Bytes  Class                                                        Attributes

  CMdl      1x1              5406  classreg.learning.classif.CompactClassificationNaiveBayes              
  Mdl       1x1             12707  ClassificationNaiveBayes                                               

CMdl является CompactClassificationNaiveBayes классификатор. Он использует меньше памяти, чем Mdl потому что Mdl сохраняет данные.

Отображение имен классов CMdl использование записи через точку.

CMdl.ClassNames
ans = 3x1 cell
    {'setosa'    }
    {'versicolor'}
    {'virginica' }

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

[labels,PostProbs,MisClassCost] = predict(CMdl,XNew);

Сравните истинные метки с предсказанными метками.

table(YNew,labels,PostProbs,MisClassCost,'VariableNames',...
    {'TrueLabels','PredictedLabels',...
    'PosteriorProbabilities','MisclassificationCosts'})
ans=10×4 table
      TrueLabels      PredictedLabels             PosteriorProbabilities                      MisclassificationCosts        
    ______________    _______________    _________________________________________    ______________________________________

    {'virginica' }    {'virginica' }     4.0832e-268     4.6422e-09              1             1             1    4.6422e-09
    {'setosa'    }    {'setosa'    }               1     3.0706e-18     4.6719e-25    3.0706e-18             1             1
    {'virginica' }    {'virginica' }     1.0007e-246     5.8758e-10              1             1             1    5.8758e-10
    {'versicolor'}    {'versicolor'}      1.2022e-61        0.99995     4.9859e-05             1    4.9859e-05       0.99995
    {'virginica' }    {'virginica' }      2.687e-226     1.7905e-08              1             1             1    1.7905e-08
    {'versicolor'}    {'versicolor'}      3.3431e-76        0.99971     0.00028983             1    0.00028983       0.99971
    {'virginica' }    {'virginica' }       4.05e-166      0.0028527        0.99715             1       0.99715     0.0028527
    {'setosa'    }    {'setosa'    }               1     1.1272e-14     2.0308e-23    1.1272e-14             1             1
    {'virginica' }    {'virginica' }     1.3292e-228     8.3604e-10              1             1             1    8.3604e-10
    {'setosa'    }    {'setosa'    }               1     4.5023e-17     2.1724e-24    4.5023e-17             1             1

PostProbs и MisClassCost являются 10-by- 3 числовые матрицы, где каждая строка соответствует новому наблюдению, а каждый столбец соответствует классу. Порядок столбцов соответствует порядку CMdl.ClassNames.

Загрузите fisheriris набор данных. Создание X как числовая матрица, которая содержит четыре измерения лепестков для 150 ирисов. Создание Y как массив ячеек из векторов символов, который содержит соответствующие виды радужной оболочки.

load fisheriris
X = meas(:,3:4);
Y = species;

Обучите наивный классификатор Байеса с помощью предикторов X и метки классов Y. Рекомендуемая практика состоит в том, чтобы задать имена классов. fitcnb принимает, что каждый предиктор условно и нормально распределен.

Mdl = fitcnb(X,Y,'ClassNames',{'setosa','versicolor','virginica'});

Mdl является обученным ClassificationNaiveBayes классификатор.

Задайте сетку значений в наблюдаемом пространстве предикторов.

xMax = max(X);
xMin = min(X);
h = 0.01;
[x1Grid,x2Grid] = meshgrid(xMin(1):h:xMax(1),xMin(2):h:xMax(2));

Спрогнозируйте апостериорные вероятности для каждого образца в сетке.

[~,PosteriorRegion] = predict(Mdl,[x1Grid(:),x2Grid(:)]);

Постройте график апостериорных областей вероятностей и обучающих данных.

h = scatter(x1Grid(:),x2Grid(:),1,PosteriorRegion);
h.MarkerEdgeAlpha = 0.3;

Постройте график данных.

hold on
gh = gscatter(X(:,1),X(:,2),Y,'k','dx*');
title 'Iris Petal Measurements and Posterior Probabilities';
xlabel 'Petal length (cm)';
ylabel 'Petal width (cm)';
axis tight
legend(gh,'Location','Best')
hold off

Figure contains an axes. The axes with title Iris Petal Measurements and Posterior Probabilities contains 4 objects of type scatter, line. These objects represent setosa, versicolor, virginica.

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

свернуть все

Наивная классификационная модель Байеса, заданная как ClassificationNaiveBayesобъект модели объект модели, возвращенный fitcnb или compact, соответственно.

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

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

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

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

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

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

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

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

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

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

Примечания:

  • Если Mdl.DistributionNames является 'mn', затем программное обеспечение возвращается NaNs, соответствующий строкам X которые содержат по крайней мере один NaN.

  • Если Mdl.DistributionNames не 'mn', затем программное обеспечение игнорирует NaN значения при оценке затрат на неправильную классификацию и апостериорных вероятностей. В частности, программа вычисляет условную плотность предикторов, заданных классом, путем исключения факторов, соответствующих отсутствующим значениям предиктора.

  • Для распределения предиктора, заданного как 'mvmn', если X содержит уровни, которые не представлены в обучающих данных (то есть не на Mdl.CategoricalLevels для этого предиктора), тогда условная плотность предикторов, заданных классом, равна 0. Для этих наблюдений программное обеспечение возвращает соответствующее значение Posterior как NaN. Программа определяет метку класса для таких наблюдений, используя предшествующую вероятность класса, сохраненную в Mdl.Prior.

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

свернуть все

Предсказанные метки классов, возвращенные как категориальный вектор, символьный массив, логический или числовой вектор или массив ячеек из векторов символов.

Предсказанные метки классов имеют следующее:

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

  • Длина, равная количеству строк Mdl.X.

  • Класс, дающий самые низкие ожидаемые затраты на неправильную классификацию (Cost).

Апостериорная вероятность класса, возвращенная как числовая матрица. Posterior имеет строки, равные количеству строк Mdl.X и столбцы, равные количеству отдельных классов в обучающих данных (size(Mdl.ClassNames,1)).

Posterior(j,k) - предсказанная апостериорная вероятность класса k (в классе Mdl.ClassNames(k)) учитывая наблюдение в строке j от Mdl.X.

Ожидаемые затраты на неправильную классификацию, возвращенные как числовая матрица. Cost имеет строки, равные количеству строк Mdl.X и столбцы, равные количеству отдельных классов в обучающих данных (size(Mdl.ClassNames,1)).

Cost(j,k) - ожидаемая стоимость неправильной классификации наблюдения в строке j от Mdl.X предсказано в k классов (в классе Mdl.ClassNames(k)).

Подробнее о

свернуть все

Затраты на неправильную классификацию

А misclassification cost - это относительная серьезность классификатора, маркирующего наблюдение не в тот класс.

Существует два вида расходов на неправильную классификацию: истинные и ожидаемые. Позвольте K быть количеством классов.

  • True misclassification cost - A K -by - K матрица, где элемент (i, j) указывает на стоимость неправильной классификации предсказания наблюдения в j класса, если его истинный класс i. Программное обеспечение хранит затраты на неправильную классификацию в свойстве Mdl.Cost, и использует его в расчетах. По умолчанию Mdl.Cost(i,j) = 1, если ij, и Mdl.Cost(i,j) = 0, если i = j. Другими словами, стоимость 0 для правильной классификации и 1 для любой неправильной классификации.

  • Expected misclassification cost - K -мерный вектор, где k элемента - средневзвешенные затраты на неправильную классификацию классификации наблюдений в k классов, взвешенные апостериорными вероятностями классов.

    ck=j=1KP^(Y=j|x1,...,xP)Costjk.

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

Апостериорная вероятность

Это posterior probability вероятность того, что наблюдение принадлежит конкретному классу, учитывая данные.

Для наивного Байеса апостериорная вероятность того, что классификация k для заданного наблюдения (x 1,..., xP), является

P^(Y=k|x1,..,xP)=P(X1,...,XP|y=k)π(Y=k)P(X1,...,XP),

где:

  • P(X1,...,XP|y=k) - условная плотность соединений предикторов, заданная ими в k классов. Mdl.DistributionNames сохраняет имена распределения предикторов.

  • π (Y = k) является априорным распределением вероятностей класса. Mdl.Prior сохраняет предыдущее распределение.

  • P(X1,..,XP) - плотность соединений предикторов. Классы дискретны, поэтому P(X1,...,XP)=k=1KP(X1,...,XP|y=k)π(Y=k).

Предварительная вероятность

prior probability класса является предполагаемой относительной частотой, с которой наблюдения из этого класса происходят в населении.

Расширенные возможности

.
Введенный в R2014b