Пошаговое обучение с наивными байесовыми и гетерогенными данными

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

Наивные классификаторы Байеса для пошагового обучения поддерживают только числовые наборы данных предиктора, но они могут адаптироваться к невидимым категориальным уровням во время обучения. Если ваши данные неоднородны и содержатся в таблице, необходимо предварительно обработать прежде, чем выполнить пошаговое обучение путем выполнения этой общей процедуры:

  1. Создайте под управлением карту хеша для каждой категориальной переменной при помощи container.Map Объекты MATLAB®. Карта хеша присваивает строку уникальному числовому значению, и она может легко адаптироваться к новым уровням. Несмотря на то, что можно создать холодную карту хеша, этот пример принимает, что первые 50 наблюдений из данных доступны для заполнения карты хеша и нагревания модель.

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

Загрузите и предварительно обработайте данные

Загрузите 1 994 набора данных переписи США. Цель изучения состоит в том, чтобы предсказать зарплату гражданина США (salary, любой <=50K или >50K) от нескольких неоднородных измерений на гражданине.

load census1994.mat

Обучающие данные находятся в таблице adultdata. Для получения дополнительной информации на наборе данных, введите Description.

Удалите все наблюдения, содержащие по крайней мере одно отсутствующее значение из данных.

adultdata = adultdata(~any(ismissing(adultdata),2),:);
[n,p] = size(adultdata);
p = p - 1;  % Number of predictor variables    

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

n0 = 50;
sample0 = adultdata(1:n0,:);

Создайте первоначальные карты хеша

Идентифицируйте все категориальные переменные в данных и определите их уровни.

catpredidx = table2array(varfun(@iscategorical,adultdata(:,1:(end-1))));
numcatpreds = sum(catpredidx);
lvlstmp = varfun(@unique,adultdata(:,catpredidx),OutputFormat="cell");
lvls0 = cell(1,p);
lvls0(catpredidx) = lvlstmp;

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

catmaps = cell(1,p);
J = find(catpredidx);

for j = J
    numlvls = numel(lvls0{j});
    catmaps{j} = containers.Map(cellstr(lvls0{j}),1:numlvls);
end
example1 = catmaps{find(catpredidx,1)}
example1 = 
  Map with properties:

        Count: 7
      KeyType: char
    ValueType: double

val = example1('Private')
val = 3

catmaps numcatpreds- 1 вектор ячейки из containers.Map объекты, каждый представляющий запор сопоставляет для соответствующей категориальной переменной. Например, первая карта хеша присваивает 3 к уровню 'Private'.

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

Поддержка, локальная функция processPredictorData имеет следующие характеристики:

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

  • Возвратите матрицу однородных, числовых данных о предикторе с категориальными переменными, замененными числовыми переменными. Функция заменяет основанные на операция со строками уровни на положительные целые числа.

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

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

[X0,catmaps] = processPredictorData(sample0(:,1:(end-1)),catmaps);
y0 = adultdata.salary(1:n0);

Подбирайте наивную байесовую модель, чтобы подписать выборку

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

Mdl = fitcnb(X0,y0,CategoricalPredictors=catpredidx);

Mdl ClassificationNaiveBayes модель.

Подготовьте наивную байесовую модель к пошаговому обучению

Тайный традиционно обученная наивная модель Bayes инкрементному ученику. Укажите, что инкрементная модель должна основывать метрики окна на 2 000 наблюдений.

IncrementalMdl = incrementalLearner(Mdl,MetricsWindowSize=2000);

IncrementalMdl нагретый incrementalClassificationNaiveBayes объект подготовлен к пошаговому обучению. incrementalLearner инициализирует параметры условных распределений переменных предикторов со значениями, усвоенными из начальной выборки.

Выполните пошаговое обучение

Измерьте производительность модели и подбирайте инкрементную модель к обучающим данным при помощи updateMetricsAndfit функция. Симулируйте поток данных путем обработки фрагментов 100 наблюдений за один раз. В каждой итерации:

  1. Обработайте данные о предикторе и обновите карты хеша в поступлении 100 наблюдений при помощи processPredictorData.

  2. Подбирайте наивную модель Bayes к обработанным данным.

  3. Перезапишите предыдущую инкрементную модель с новой, адаптированной к входящим наблюдениям.

  4. Сохраните текущую минимальную стоимость и изученную условную вероятность выбора розеточного гражданина США, учитывая каждый уровень зарплаты.

numObsPerChunk = 100;
nchunks = floor(n/numObsPerChunk);
mc = array2table(zeros(nchunks,2),'VariableNames',["Cumulative" "Window"]);
catdistms = zeros(nchunks,2);
sexidx = string(adultdata.Properties.VariableNames) == "sex";
fidx = string(keys(catmaps{sexidx(1:end-1)})) == "Female";

for j = 1:nchunks
    ibegin = min(n,numObsPerChunk*(j-1) + 1 + n0);
    iend   = min(n,numObsPerChunk*j + n0);
    idx = ibegin:iend;
    [XChunk,catmaps] = processPredictorData(adultdata(idx,1:(end-1)),catmaps);
    IncrementalMdl = updateMetricsAndFit(IncrementalMdl,XChunk,adultdata.salary(idx));
    mc{j,:} = IncrementalMdl.Metrics{"MinimalCost",:};
    catdistms(j,1) = IncrementalMdl.DistributionParameters{1,sexidx}(fidx);
    catdistms(j,2) = IncrementalMdl.DistributionParameters{2,sexidx}(fidx);
end

IncrementalMdl incrementalClassificationNaiveBayes возразите инкрементно соответствуют к целому потоку. Во время пошагового обучения, updateMetricsAndFit проверяет эффективность модели на входящем фрагменте наблюдений, и затем подбирает модель к тем наблюдениям.

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

figure;
plot(mc.Variables)
ylabel('Minimal Cost')
legend(mc.Properties.VariableNames)
xlabel('Iteration')

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Cumulative, Window.

Совокупная потеря постепенно изменяется с каждой итерацией (фрагмент 100 наблюдений), тогда как потеря окна переходит. Поскольку метрическое окно 2000, updateMetricsAndFit измеряет уровень каждые 20 итераций.

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

figure;
plot(catdistms)
ylabel('P(Female|Salary=y)')
legend(sprintf("y=%s",IncrementalMdl.ClassNames(1)),sprintf("y=%s",IncrementalMdl.ClassNames(2)))
xlabel('Iteration')

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent y=<=50K, y=>50K.

Подходящие вероятности постепенно обосновываются во время пошагового обучения.

Сравните эффективность на тестовых данных

Соответствуйте наивному классификатору Байеса к целому обучающему набору данных.

MdlTT = fitcnb(adultdata,"salary");

MdlTT традиционно обученный ClassificationNaiveBayes объект.

Вычислите минимальную стоимость традиционно обученной модели на тестовых данных adulttest.

adulttest = adulttest(~any(ismissing(adulttest),2),:); % Remove missing values
mctt = loss(MdlTT,adulttest)
mctt = 0.1773

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

XTest = processPredictorData(adulttest(:,1:(end-1)),catmaps);
ilmc = loss(IncrementalMdl,XTest,adulttest.salary)
ilmc = 0.1657

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

Вспомогательные Функции

function [Pred,maps] = processPredictorData(tbl,maps)
% PROCESSPREDICTORDATA Process heterogeneous data to homogeneous numeric
% data
%
% Input arguments:
%   tbl:  A table of raw input data
%   maps: A cell vector of container.Map hash maps.  Cells correspond to
%       categorical variables in tbl.
%
% Output arguments:
%   Pred: A numeric matrix of data with the same dimensions as tbl. Numeric
%   variables in tbl are assigned to the corresponding column of Pred,
%   categorical variables in tbl are processed and placed in the
%   corresponding column of Pred.

    catidx = varfun(@iscategorical,tbl,OutputFormat="uniform");
    numidx = ~catidx;
    numcats = sum(catidx);
    p = numcats + sum(numidx);
    currlvlstmp = varfun(@unique,tbl(:,catidx),OutputFormat="cell");
    currlvls0 = cell(1,p);
    currlvls0(catidx) = currlvlstmp;
    currlvlstmp = cellfun(@categories,currlvls0(catidx),UniformOutput=false);
    currlvls = cell(1,p);
    currlvls(catidx) = currlvlstmp;
    Pred = zeros(size(tbl));
    Pred(:,numidx) = tbl{:,numidx};
    J = find(catidx);
    for j = J
        hasNewlvl = ~isKey(maps{j},currlvls{j});
        if any(hasNewlvl)
            newcats = currlvls{j}(hasNewlvl);
            numnewcats = sum(hasNewlvl);
            g = numel(maps{j}.Count);
            for h = 1:numnewcats
                g = g + 1;
                maps{j}(newcats{h}) = g;
            end
        end
        conv2cell = cellstr(tbl{:,j});
        Pred(:,j) = cell2mat(values(maps{j},conv2cell));
    end
end

Смотрите также

Объекты

Функции

Похожие темы