基于朴素贝叶斯和异构数据的增量学习
这个例子展示了如何准备包含实值和分类度量的异构预测器数据,以便使用朴素贝叶斯分类器进行增量学习。
用于增量学习的朴素贝叶斯分类器只支持数值预测数据集,但它们可以适应训练中不可见的分类水平。金宝app如果你的数据是异构的,并且包含在一个表中,在执行增量学习之前,你必须按照以下一般步骤进行预处理:
为每个类别变量创建一个运行的哈希映射
容器。地图
MATLAB®对象。哈希映射将一个字符串分配给一个唯一的数值,它可以很容易地适应新的级别。尽管可以创建冷哈希映射,但本示例假设数据的前50个观察结果可用于填充哈希映射和预热模型。一致地将所有实值测量与数值类别级别连接起来。
加载和预处理数据
加载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个观察数据块来模拟数据流。在每次迭代中:
处理预测器数据并更新传入的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 + 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)“迭代”)
累积损失在每次迭代中逐渐变化(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)将异构数据处理为同构数值%的数据%%输入参数:% 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));结束结束