主要内容

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

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

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

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

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

加载和预处理数据

加载1994年美国人口普查数据集。学习目标是预测美国公民的工资(工资,要么< = 50 k> 50 k)从对公民的几项不同的测量中得出。

负载census1994.mat

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

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

Adultdata = Adultdata (~any(ismissing(Adultdata),2),:);[n,p] = size(成年人数据);P = P - 1;%预测变量的数量

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

N0 = 50;Sample0 =成人数据(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 = numel(lvls0{j});catmaps{j} = containers.Map(cellstr(lvls0{j}),1:numlvls);结束Example1 = catmaps{find(catpredidx,1)}
example1 = Map with properties: Count: 7 KeyType: char ValueType: double
Val = example (“私人”
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个观察结果的窗口度量。

IncrementalMdl = incrementalLearner(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) = IncrementalMdl.DistributionParameters{1,sexidx}(fidx);catdistms(j,2) = IncrementalMdl.DistributionParameters{2,sexidx}(fidx);结束

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

绘制增量学习过程中计算的累积和窗口最小代价。

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

图中包含一个axes对象。坐标轴对象包含两个line类型的对象。这些对象表示累积、窗口。

累积损失在每次迭代中逐渐变化(100个观测块),而窗口损失则会跳跃。因为指标窗口是2000年,updateMetricsAndFit每20次迭代测量一次性能。

画出每个工资水平内选择女性的运行概率。

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

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

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

比较测试数据的性能

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

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

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

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

Adulttest = Adulttest (~any(ismissing(Adulttest),2),:);%删除缺失的值mctt = loss(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)将异构数据处理为同构数值%的数据%输入参数:% tbl:原始输入数据的表%映射:容器的单元格向量。映射哈希映射。细胞对应于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);hasNewlvl = ~isKey(maps{j},currlvls{j});如果any(hasNewlvl) newcats = currlvls{j}(hasNewlvl);numnewcats = sum(hasNewlvl);g = numel(maps{j}.Count);H = 1:numnewcats g = g + 1;Maps {j}(newcats{h}) = g;结束结束Conv2cell = cellstr(tbl{:,j});Pred(:,j) = cell2mat(values(maps{j},conv2cell));结束结束

另请参阅

对象

功能

相关的话题