主要内容

用朴素贝叶斯和异构数据增量学习

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

朴素贝叶斯分类器对增量学习只支持数字预测数据集,但他们可以适应看不见的分类水平在训练。万博1manbetx如果您的数据是异构的,包含在一个表中,你必须在执行之前进行预处理增量学习按照一般程序:

  1. 创建一个运行为每个类别变量使用散列映射container.MapMATLAB®对象。散列映射的字符串赋值给一个独特的数字值,它可以很容易地适应新的水平。虽然您可以创建一个寒冷的散列映射,这个例子假设第一个50的观测数据可用于填充一个散列映射模型和热身。

  2. 始终连接所有实值测量与数值分类的水平。

加载和数据预处理

负载1994年美国人口普查数据集。学习目标是预测美国公民的工资(工资,要么< = 50 k> 50 k)从多个异构测量公民。

负载census1994.mat

训练数据表中adultdata。细节的数据集,输入描述

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

adultdata = adultdata (~ (ismissing (adultdata), 2),:);(氮、磷)= (adultdata)大小;p = p - 1;%的预测变量

假设只有第一个50观察目前可用。

n0 = 50;sample0 = adultdata (1: n0,:);

创建初始散列映射

识别所有分类变量的数据,并确定他们的水平。

catpredidx = table2array (varfun (@iscategorical adultdata (:, 1: (end-1))));numcatpreds =总和(catpredidx);lvlstmp = varfun (@unique adultdata (:, catpredidx), OutputFormat =“细胞”);lvls0 =细胞(1、p);lvls0 (catpredidx) = lvlstmp;

对于每一个分类变量,创建一个初始散列映射分配一个整数,从1到相应级别的数量,每个级别。存储所有散列映射向量中的一个细胞。

catmaps =细胞(1、p);J =找到(catpredidx);j = numlvls =元素个数(lvls0 {j});catmaps {j} = containers.Map (cellstr (lvls0 {j}), 1: numlvls);结束例二= catmaps{找到(catpredidx, 1)}
例二=地图与属性:数:7 KeyType: char ValueType:双
val =例二(“私人”)
val = 3

catmaps是一个numcatpreds1细胞向量containers.Map对象,分别代表一个散列映射为相应的类别变量。例如,第一个散列映射分配3水平“私人”

分类变量表示为数字

支持本地万博1manbetx函数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 =地板(n / numObsPerChunk);(nchunks mc = array2table (0, 2),“VariableNames”,(“累积”“窗口”]);catdistms = 0 (nchunks, 2);sexidx (adultdata.Properties.VariableNames) = = =字符串“性”;fidx =字符串(键(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.Metrics {“MinimalCost”,:};catdistms (j, 1) = IncrementalMdl.DistributionParameters {1, sexidx} (fidx);catdistms (j, 2) = IncrementalMdl.DistributionParameters {2, sexidx} (fidx);结束

IncrementalMdl是一个incrementalClassificationNaiveBayes整个流对象逐步适应。在增量学习,updateMetricsAndFit检查传入的块的性能模型的观测,然后符合观测模型。

情节的累积和窗口最小成本计算在增量学习。

图绘制(mc.Variables) ylabel (“最小成本”传奇(mc.Properties.VariableNames)包含(“迭代”)

图包含一个坐标轴对象。坐标轴对象包含2线类型的对象。这些对象代表累积,窗口。

每次迭代的累计损失逐渐变化(100块观测),而跳窗的损失。因为指标窗口是2000,updateMetricsAndFit措施的性能每20迭代。

情节的运行概率选择女性在每个工资水平。

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

图包含一个坐标轴对象。坐标轴对象包含2线类型的对象。这些对象代表y = < = 50 k, y = > 50 k。

拟合概率增量学习期间逐步解决。

性能测试数据进行比较

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

MdlTT = fitcnb (adultdata,“工资”);

MdlTT是一个传统的训练ClassificationNaiveBayes对象。

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

成人=成人(~ (ismissing(成人),2),:);%去除缺失值mctt =损失(MdlTT成人)
mctt = 0.1773

通过使用过程测试的预测数据processPredictorData,然后计算出最小成本增量学习模型的测试数据。

XTest = processPredictorData(成人(:1:(end-1)), catmaps);ilmc =损失(IncrementalMdl XTest adulttest.salary)
ilmc = 0.1657

增量之间的最小成本模型和传统的训练模型几乎是相同的。

万博1manbetx支持功能

函数(Pred、地图)= processPredictorData(资源描述、地图)% PROCESSPREDICTORDATA处理异构数据均匀数字%的数据%%输入参数:%(资源:一个表的原始输入数据%地图:细胞向量的容器。哈希映射地图。细胞对应%在资源分类变量。%%输出参数:% Pred:一个数字矩阵维数相同的数据资源。数字%变量Pred(资源分配给相应的列,%分类变量(资源处理和放置%的Pred对应的列。catidx = varfun (@iscategorical台,OutputFormat =“统一”);numidx = ~ catidx;numcats =总和(catidx);p = numcats +总和(numidx);currlvlstmp = varfun (@unique台(:,catidx), OutputFormat =“细胞”);currlvls0 =细胞(1、p);currlvls0 (catidx) = currlvlstmp;currlvlstmp = cellfun (@categories currlvls0 (catidx) UniformOutput = false);currlvls =细胞(1、p);currlvls (catidx) = currlvlstmp;Pred = 0(大小(台));Pred (:, numidx) =(资源{:,numidx};J =找到(catidx);j = hasNewlvl = ~ isKey(地图{j}, currlvls {j});如果任何(hasNewlvl) newcats = currlvls {j} (hasNewlvl);numnewcats =总和(hasNewlvl);{j} .Count g =元素个数(地图);h = 1: numnewcats g = g + 1;地图{j} (newcats {h}) = g;结束结束conv2cell = cellstr(台{:j});Pred (:, j) = cell2mat(值(地图{j}, conv2cell));结束结束

另请参阅

对象

功能

相关的话题