基于朴素贝叶斯和异构数据的增量学习
这个例子展示了如何准备异构预测数据,包含实值和分类测量,用于使用朴素贝叶斯分类器进行增量学习。
用于增量学习的朴素贝叶斯分类器仅支持数字预测数据集,但它们可以适应训练过程中看不到的分类水平。金宝app如果您的数据是异构的,并且包含在表中,则必须在执行增量学习之前按照以下一般过程进行预处理:
为每个分类变量创建一个运行的散列映射
容器。地图
MATLAB®对象。哈希映射将字符串分配给唯一的数值,并且可以很容易地适应新的级别。虽然可以创建冷散列映射,但本例假设数据中的前50个观测值可用于填充散列映射和预热模型。始终将所有实值测量值与数字分类级别连接起来。
加载和预处理数据
加载1994年美国人口普查数据集。学习目标是预测美国公民的工资(工资
,要么< = 50 k
或> 50 k
)从对公民的几种不同测量中得出。
负载census1994.mat
训练数据在表中adultdata
.有关数据集的详细信息,请输入描述
.
从数据中删除包含至少一个缺失值的所有观测值。
成人数据=成人数据(~any(ismissing(成人数据),2),:);[n,p] = size(成人数据);P = P - 1;%预测变量的数目
假设目前只有前50个观测值可用。
N0 = 50;Sample0 = adultdata(1: 0,:);
创建初始哈希映射
识别数据中的所有分类变量,并确定其级别。
Catpredidx = table2array(varfun(@iscategorical,adultdata(:,1)) end-1))));Numcatpreds = sum(catpredidx);lvlstmp = varfun(@unique,adultdata(:,catpredidx),OutputFormat=“细胞”);lvl0 = cell(1,p);lvl50 (catpredidx) = lvlstmp;
对于每个分类变量,创建一个初始哈希映射,为每个级别分配一个整数,从1到对应级别的数量。将所有哈希映射存储在一个单元向量中。
Catmaps = cell(1,p);J = find(catpredidx);为j = j numlvls = nummel (lvlso0 {j});catmaps{j} = containers.Map(cellstr(lvl50 {j}),1:numlvls);结束Example1 = catmaps{find(catpredidx,1)}
example1 = Map with properties: Count: 7 KeyType: char ValueType: double
Val = example1(“私人”)
Val = 3
catmaps
是一个numcatpreds
的- × 1单元向量容器。地图
对象,每个对象表示对应分类变量的散列映射。例如,第一个哈希映射分配3.
达到水平“私人”
.
将分类变量表示为数字
支持本地金宝app功能processPredictorData
具有以下特点:
接受一个包含分类变量和数值变量的表,以及每个分类变量的散列映射的当前单元向量。
返回一个齐次的数字预测器数据矩阵,其中分类变量由数字变量替换。该函数将基于字符串的级别替换为正整数。
当输入数据包含当前哈希映射未知级别的变量时,返回更新的哈希映射单元向量。
将初始样本中的分类数据表示为数字processPredictorData
.
[0,catmaps] = processPredictorData(sample0(:,1:(end-1)),catmaps);Y0 = adultdata.salary(1: 0);
初始样本拟合朴素贝叶斯模型
对初始样本拟合朴素贝叶斯模型。识别分类变量。
Mdl = fitcnb(0, 0,CategoricalPredictors=catpredidx);
Mdl
是一个ClassificationNaiveBayes
模型。
为增量学习准备朴素贝叶斯模型
将传统训练的朴素贝叶斯模型转化为增量学习模型。指定增量模型应该基于2000个观测值的窗口度量。
IncrementalMdl = incrementalLearner(Mdl,MetricsWindowSize=2000);
IncrementalMdl
是温暖的incrementalClassificationNaiveBayes
为增量学习准备的对象。incrementalLearner
用从初始样本中学习到的值初始化预测变量条件分布的参数。
进行增量学习
度量模型的性能,并使用updateMetricsAndFit
函数。通过一次处理100个观察数据块来模拟数据流。在每次迭代中:
处理预测器数据并在传入的100个观测值中更新哈希映射
processPredictorData
.对处理后的数据拟合朴素贝叶斯模型。
用一个新的适合输入观测值的增量模型覆盖以前的增量模型。
存储给定每个工资水平选择美国女性公民的当前最小成本和学习到的条件概率。
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 + n);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
检查模型在输入的观察数据块上的性能,然后将模型拟合到这些观察数据中。
绘制增量学习期间计算的累积和窗口最小代价。
figure plot(mc.Variables) ylabel(“最小成本”) legend(mc.Properties.VariableNames) xlabel(“迭代”)
累积损失随着每次迭代(100个观测值的块)逐渐变化,而窗口损失则跳跃。因为指标窗口是2000年,updateMetricsAndFit
每20次迭代测量一次性能。
绘制在每个工资水平中选择女性的运行概率。
图(catdistms) ylabel(“P(女|薪水= y) ')传说(sprintf (“y = % s”, IncrementalMdl.ClassNames (1)), sprintf (“y = % s”IncrementalMdl.ClassNames(2)))包含(“迭代”)
在增量学习过程中,拟合概率逐渐稳定。
比较测试数据的性能
拟合朴素贝叶斯分类器到整个训练数据集。
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)% PROCESSPREDICTORDATA将异构数据处理为同构数字%的数据%%输入参数:% tbl:原始输入数据的表% maps:容器的单元向量。映射哈希映射。细胞对应于表中%的分类变量。%%输出参数:% Pred:与table具有相同维度的数据的数字矩阵。数字table中的%变量被赋值到Pred的对应列,处理TBL中的%分类变量并将其放在%对应的Pred列。catidx = varfun(@iscategorical,tbl,OutputFormat=“统一”);Numidx = ~catidx;Numcats = sum(catidx);P = numcats + sum(numidx);currlvlstmp = varfun(@unique,tbl(:,catidx),OutputFormat=“细胞”);currlvl0 = cell(1,p);currlvl50 (catidx) = currlvlstmp;currlvlstmp = cellfun(@categories,currlvls0(catidx),UniformOutput=false);Currlvls = cell(1,p);Currlvls (catidx) = currlvlstmp;Pred = 0 (size(table));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 = nummel (maps{j}.Count);为H = 1:numnewcats g = g + 1;map {j}(newcats{h}) = g;结束结束Conv2cell = cellstr(tbl{:,j});Pred(:,j) = cell2mat(values(maps{j},conv2cell));结束结束