В этом примере показано, как подготовить неоднородные данные о предикторе, содержа и категориальные измерения с действительным знаком, для пошагового обучения с помощью наивного классификатора Байеса.
Наивные классификаторы Байеса для пошагового обучения поддерживают только числовые наборы данных предиктора, но они могут адаптироваться к невидимым категориальным уровням во время обучения. Если ваши данные неоднородны и содержатся в таблице, необходимо предварительно обработать прежде, чем выполнить пошаговое обучение путем выполнения этой общей процедуры:
Создайте под управлением карту хеша для каждой категориальной переменной при помощи container.Map
Объекты MATLAB®. Карта хеша присваивает строку уникальному числовому значению, и она может легко адаптироваться к новым уровням. Несмотря на то, что можно создать холодную карту хеша, этот пример принимает, что первые 50 наблюдений из данных доступны для заполнения карты хеша и нагревания модель.
Последовательно конкатенируйте все измерения с действительным знаком с числовыми категориальными уровнями.
Загрузите 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 наблюдений за один раз. В каждой итерации:
Обработайте данные о предикторе и обновите карты хеша в поступлении 100 наблюдений при помощи processPredictorData
.
Подбирайте наивную модель Bayes к обработанным данным.
Перезапишите предыдущую инкрементную модель с новой, адаптированной к входящим наблюдениям.
Сохраните текущую минимальную стоимость и изученную условную вероятность выбора розеточного гражданина США, учитывая каждый уровень зарплаты.
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')
Совокупная потеря постепенно изменяется с каждой итерацией (фрагмент 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')
Подходящие вероятности постепенно обосновываются во время пошагового обучения.
Соответствуйте наивному классификатору Байеса к целому обучающему набору данных.
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
loss
| fit
| updateMetrics