infer.net 入门 贝叶斯分类器1,2


一、Introduction:二分的例子
 
1,IClassifierMapping接口
public class ClassifierMapping: IClassifierMapping<IList<Vector>, int, IList<string>, string, Vector>
1、哪个是要分批交给分类器的对象?(GetInstances);
2、如何获取给定实例的特征值? (GetFeatures); 3、如何获取给定实例实际的标签值? (GetLabel); 4、获取数据中所有不同类型标签值,相当于标签范围(GetClassLabels)。
2,创建分类器
 有了手动创建的映射,就可以创建贝叶斯机器分类器,如下所示:
 // Create the Bayes Point Machine classifier from the mapping3
var mapping = new ClassifierMapping();
var classifier = BayesPointMachineClassifier.CreateBinaryClassifier(mapping);

3,训练,基于性别数据
这样,就可以使用分类器根据身高和体重去学习和预测性别。使用1000个样本去训练贝叶斯机器分类器,如下所示

// Train the Bayes Point Machine classifier on the gender data
classifier.Train(trainingSet.FeatureVectors, trainingSet.Labels);
4,预测,
 使用训练后的贝叶斯机器分类器,就能够预测那些只有身高和体重数据的人的性别
testSet.FeatureVectors是一个只包含身高,体重以及预期值的向量数组。
var predictions = classifier.PredictDistribution(testSet.FeatureVectors);
输出:,在身高183、体重78kg的前提下,预期值女性Female的概率只有7%
P(gender = 'Female' | height = 183cm, weight = 78kg) = 0.07
很多时候我们需要一个确定的分类,则

string estimate = classifier.Predict(InstanceOfInterest, testSet.FeatureVectors);
结果是:Male,这种精确预测仍然需要计算预测分出作为中间步骤

5,评估测试

为了评价分类器的预测情况,我们需要利用一些不同于训练集的有标签的数据,因此我们假定我们可以得到一组100个额外的真实性别,体重和身高的测量记录。一个评价过程要通过ClassifierEvaluator进行,如下:
1 // Create an evaluator for mapping2 var evaluatorMapping = mapping.ForEvaluation();
3 var evaluator = 
4     new ClassifierEvaluator<IList<Vector>, int, IList<string>, string>(
5         evaluatorMapping);
 
结果:Accuracy = 0.85;AUC = 0.926
 
 
二、Learner API
1,Mappings
iclassifiermapping提供分类的标准格式的数据,
ibayespointmachineclassifiermapping为贝叶斯点机分类器在原生格式数据,
iclassifierevaluatormapping -为评估者提供标准格式的数据。
 
然而,在许多情况下,直接将数据以本机格式的编程成本(ibayespointmachineclassifiermapping)大于标准格式转换原生格式的费用
 
2,Creation & serialization BayesPointMachineClassifier
有了上面的映射实例,就可以用下面的方法创建
bayespointmachineclassifier.createbinaryclassifier(mapping)(具有两类问题) bayespointmachineclassifier.createmulticlassclassifier(mapping)(有三个或更多类的问题)
此外,两个方法各有两个版本,参数mapping可以是标准格式,也可以是原生格式
假设我们有个SQL的数据,及多分类问题,这样写:
var mapping = new SqlNativeMapping();
var classifier = BayesPointMachineClassifier.CreateMulticlassClassifier(mapping);
 
序列化
把分类器保存到文件,可以是文件名,也可以是文件流的方式
classifier.Save("bpm.bin");
 

反序列化
从文件中读取分类器实例
var classifier = BayesPointMachineClassifier.Load
<SqlInstanceSource,
Instance,
SqlLabelSource,
int,
Discrete,
BayesPointMachineClassifierTrainingSettings,
MulticlassBayesPointMachineClassifierPredictionSettings<int>>("bpm.bin")

参数要匹配这个文件里的实例,为了方便起见,存在一些方法比load出来的更具体,从而减少需要指定的泛型类型。例如,有,
var classifier = BayesPointMachineClassifier.LoadMulticlassClassifier
<SqlInstanceSource, Instance, SqlLabelSource, int, Discrete>("bpm.bin");
 
其实就是load和LoadMulticlassClassifier不同,后者已经说明了是多分类。同样地,LoadBinaryClassifier是读取二分类的贝叶斯分类器。
 
3,Setting & events
There are separate settings for training and prediction.
有两个settings :
training settings
注意,训练贝叶斯我们并不需要设置任何参数,如前置分布权重。这是因为贝叶斯机器分类器是无需超参数的(hyper-parameter)。这不仅避免了一些错误的参数设置,还可以自动移除一些影响运行时间的参数。更厉害的是:它甚至不需要规范化的数据输入,贝叶斯机器分类器能够自己自动适应不同尺度的观察数据。这些都是通过heavy-tailed 前置分布权重设置的。

IterationCount 套训练算法的迭代次数,数值越大,准确度越高。默认30个,通常情况下,迭代次数在5和100之间变化。
BatchCount 批次,数据分批执行,档内存不够用可以分批。显然分批导致性能减低,默认不分批。
ComputeModelEvidence计算模型验证,默认false。决定是否贝叶斯点机分类器可以计算模型的证据(边缘),如何可能给出的数据模型
 
Prediction settings
损失函数
ZeroOne- zeroone损失函数相当于选择的预测分布作为一个点估计的模式。使用此损失函数最小化平均分类错误。zeroone是默认的损失函数。
Squared 平方或二次损失函数是相当于选择的平均预测分布的点估计。使用此损失函数,以减少平均平方误差类标签上有一个固有的顺序。然而,注意,这样的排序违反了贝叶斯点机分类(这里)的假设基础
Absolute 绝对损失函数的绝对损失函数相当于选择预测分布的中位数作为一个点估计。使用这种损失函数来减少平均绝对误差在类标签上有一个固有的顺序。然而,注意,这样的排序违反了贝叶斯点机分类(这里)的假设基础。
Custom-自定义损失函数可以指定,如果没有上述损失函数满足您的特定需求(在医疗诊断,例如,分类损失通常被判断为非对称)。使用自定义损失函数可以减慢点预测(即预测方法)。
以下预测设置仅适用于多类贝叶斯点机分类:
IterationCount  :预测算法的迭代次数来运行。在多类分类,消息传递算法(期望传播)需要进行少量多次的预测数据。通常情况下,这个数字在2和10之间变化。由于在训练算法的情况下,预测的迭代次数越多,预测的准确度越高,然而,预测的速度会慢一些。
 
events
 
Bayes分类器可以提供诊断信息(有限)的训练算法,通过iterationchanged事件进行。监听这个事件,你可以访问后分布的权重,训练算法完成后,在训练集上的迭代。特别是如果有许多功能(因此权重)或类,附加一个处理程序,这一事件是在一个成本的权重需要复制。
posted @ 2016-05-24 16:35  一名IT老农  阅读(233)  评论(0编辑  收藏  举报