主要内容

基于朴素贝叶斯和异构数据的增量学习

这个例子展示了如何使用朴素贝叶斯分类器为增量学习准备包含实值和分类测量的异构预测器数据。

用于增量学习的朴素贝叶斯分类器只支持数值预测数据集,但它们可以适应训练过程中看不见的分类水平。金宝app如果你的数据是异构的,并且包含在一个表中,在执行增量学习之前,你必须按照下面的一般过程进行预处理:

  1. 为每个类别变量创建一个运行的哈希映射容器。地图MATLAB®对象。哈希映射将一个字符串分配给一个唯一的数值,它可以很容易地适应新的级别。虽然可以创建冷哈希映射,但本例假设数据中的前50个观察值可用于填充哈希映射并使模型升温。

  2. 一致地将所有实值测量与数值分类级别连接起来。

加载和预处理数据

加载1994年美国人口普查数据集。学习目标是预测一个美国公民的薪水(工资,要么< = 50 k> 50 k)来自对公民的几种不同的测量。

负载census1994.mat

训练数据在表格中adultdata.关于数据集的详细信息,请输入描述

从数据中删除包含至少一个缺失值的所有观察值。

成人数据=成人数据(~any(ismissing(成人数据),2),:);[n,p] = size(adultdata);P = P - 1;预测变量的百分比

假设目前只有前50个观测值可用。

N0 = 50;Sample0 = adultdata(1:n0,:);

创建初始哈希映射

识别数据中的所有分类变量,并确定它们的级别。

Catpredidx = table2array(varfun(@iscategorical,adultdata(:,1:(end-1))));Numcatpreds = sum(catpredidx);lvlstmp = varfun(@unique,adultdata(:,catpredidx),OutputFormat=“细胞”);Lvls0 = cell(1,p);Lvls0 (catpredidx) = lvlstmp;

对于每个类别变量,创建一个初始哈希映射,为每个级别分配一个整数,从1到对应的级别数。将所有哈希映射存储在一个单元格向量中。

Catmaps = cell(1,p);J = find(catpredidx);j = j numlvls = nummel (lvls0{j});catmaps{j} = containers.Map(cellstr(lvls0{j}),1:numlvls);结束Example1 = catmaps{find(catpredidx,1)}
example1 =映射属性:计数:7 KeyType: char ValueType: double
Val = example1(“私人”
Val = 3

catmaps是一个numcatpreds的-by-1单元向量容器。地图对象,每个对象表示对应类别变量的哈希映射。例如,第一个哈希映射赋值3.达到水平“私人”

将分类变量表示为数字

配套、局金宝app部功能processPredictorData具有以下特点:

  • 接受一个包含类别变量和数值变量的表,以及每个类别变量的哈希映射的当前单元格向量。

  • 返回一个由同质的数值预测器数据组成的矩阵,其中类别变量被数值变量取代。该函数将基于字符串的级别替换为正整数。

  • 当输入数据包含当前哈希映射级别未知的变量时,返回一个更新后的哈希映射单元格向量。

使用将初始示例中的类别数据表示为数值processPredictorData

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

初始样本朴素贝叶斯模型拟合

拟合初始样本的朴素贝叶斯模型。识别分类变量。

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

Mdl是一个ClassificationNaiveBayes模型。

为增量学习准备朴素贝叶斯模型

将传统训练的朴素贝叶斯模型转换为增量学习器。指定增量模型应该基于2000个观测值的窗口度量。

增量Mdl =增量学习者(Mdl,MetricsWindowSize=2000);

IncrementalMdl是一个温暖的incrementalClassificationNaiveBayes为增量学习准备的对象。incrementalLearner用从初始样本中学到的值初始化预测变量的条件分布的参数。

进行增量学习

测量模型的性能,并将增量模型拟合到训练数据updateMetricsAndFit函数。通过一次处理100个观测数据块来模拟数据流。在每次迭代中:

  1. 处理预测器数据并更新传入的100个观测值中的哈希映射processPredictorData

  2. 对处理过的数据拟合一个朴素贝叶斯模型。

  3. 将先前的增量模型覆盖为一个适合于新观测值的新模型。

  4. 存储给定每个工资水平的当前最小成本和学习到的选择女性美国公民的条件概率。

numObsPerChunk = 100;nchunks = floor(n/numObsPerChunk);MC = array2table(0 (nchunks,2),“VariableNames”, (“累积”“窗口”]);Catdistms = 0 (nchunks,2);sexidx = string(adultdata.Properties.VariableNames) ==“性”;Fidx = string(keys(catmaps{sexidx(1:end-1)})) ==“女性”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。指标{“MinimalCost”,:};catdistms(j,1) = incrementalmld . distributionparameters {1,sexidx}(fidx);catdistms(j,2) = incrementalmld . distributionparameters {2,sexidx}(fidx);结束

IncrementalMdl是一个incrementalClassificationNaiveBayes对象增量地适应整个流。在增量学习过程中,updateMetricsAndFit检查模型在传入观测数据块上的性能,然后将模型与这些观测数据拟合。

绘制增量学习期间计算的累积和窗口最小代价。

图(mc.Variables)“最小成本”xlabel(mc.Properties.VariableNames)“迭代”

图中包含一个轴对象。axis对象包含2个line类型的对象。这些对象代表累积、窗口。

累积损失随着每次迭代(100个观测数据块)逐渐变化,而窗口损失则跳跃。因为度量窗口是2000年,updateMetricsAndFit每20次迭代测量一次性能。

绘制在每个工资水平内选择一名女性的运行概率。

图表(catdistms) ylabel(“P(女|薪水= y) ')传说(sprintf (“y = % s”, IncrementalMdl.ClassNames (1)), sprintf (“y = % s”IncrementalMdl.ClassNames(2)))包含(“迭代”

图中包含一个轴对象。axis对象包含2个line类型的对象。这些对象表示y=<=50K, y=>50K。

在增量学习过程中,拟合的概率逐渐稳定。

比较测试数据的性能

对整个训练数据集拟合一个朴素贝叶斯分类器。

MdlTT = fitcnb(成人数据,“工资”);

MdlTT是受过传统训练的ClassificationNaiveBayes对象。

计算传统训练模型在测试数据上的最小代价成人

Adulttest = Adulttest (~any(ismissing(Adulttest),2),:);删除缺失值mctt =损失(MdlTT,adulttest)
MCTT = 0.1773

处理测试数据的预测因子processPredictorData,然后计算增量学习模型在测试数据上的最小代价。

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

增量模型和传统训练模型的最小代价几乎相同。

金宝app支持功能

函数[Pred,maps] = processPredictorData(tbl,maps)PROCESSPREDICTORDATA将异构数据处理为同构数值%的数据%输入参数:% tbl:原始输入数据表% map:容器的单元格向量。映射哈希映射。细胞对应于% tbl中的分类变量。%输出参数:% Pred:与tbl具有相同维数的数据的数值矩阵。数字tbl中的%变量赋值给Pred的对应列,处理TBL中的%类别变量,并将其放入% Pred对应列。catidx = varfun(@iscategorical,tbl,OutputFormat=“统一”);Numidx = ~catidx;Numcats = sum(catidx);P = numcats + sum(numidx);currlvlstmp = varfun(@unique,tbl(:,catidx),OutputFormat=“细胞”);Currlvls0 = cell(1,p);Currlvls0 (catidx) = currlvlstmp;currlvlstmp = cellfun(@categories,currlvls0(catidx),UniformOutput=false);Currlvls = cell(1,p);Currlvls (catidx) = currlvlstmp;Pred = 0 (size(tbl));Pred(:,numidx) = tbl{:,numidx};J = find(catidx);j = j hasNewlvl = ~isKey(maps{j},currlvls{j});如果any(hasNewlvl) newcats = currlvls{j}(hasNewlvl);numnewcats = sum(hasNewlvl);g = number(映射{j}.Count);H = 1:numnewcats g = g + 1;Maps {j}(newcats{h}) = g;结束结束Conv2cell = cellstr(tbl{:,j});Pred(:,j) = cell2mat(values(maps{j},conv2cell));结束结束

另请参阅

对象

功能

相关的话题