Spark2.0机器学习系列之8:多类分类问题(方法归总和分类结果评估)

一对多(One-vs-Rest classifier)

将只能用于二分问题的分类(如Logistic回归、SVM)方法扩展到多类。

参考:http://www.cnblogs.com/CheeseZH/p/5265959.html

“一对多”方法

1训练时依次把某个类别的样本归为一类,其他剩余的样本归为另一类,这样k个类别的样 2本就构造出了k个binary分类器。分类时将未知样本分类为具有最大分类函数值的那类。 3假如我有四类要划分(也就是4个Label),他们是ABCD4   于是我在抽取训练集的时候,分别抽取 5   (1A所对应的向量作为正集,BCD所对应的向量作为负集; 6   (2B所对应的向量作为正集,ACD所对应的向量作为负集; 7   (3C所对应的向量作为正集,ABD所对应的向量作为负集; 8   (4D所对应的向量作为正集,ABC所对应的向量作为负集; 9   使用这四个训练集分别进行训练,然后得到四个训练结果文件。 10   在测试的时候,把对应的测试向量分别利用这四个训练结果文件进行测试。 11   最后每个测试都有一个结果f1(x),f2(x),f3(x),f4(x)12   于是最终的结果便是这四个值中最大的一个作为分类结果。

这种方法有种缺陷,因为训练集是1:M,这种情况下存在biased(即正负样本数可能很不均衡)``。

1另外还有“一对一”方法,Spark2.0中还没有实现。 2其做法是在任意两类样本之间设计一个分类器,因此k个类别的样本就需要设计k(k-1)/2SVM3当对一个未知样本进行分类时,最后得票最多的类别即为该未知样本的类别。 4Libsvm中的多类分类就是根据这个方法实现的。 5主要缺点:当类别很多的时候,model的个数是n*(n-1)/2,代价还是相当大的。(是不是不适合大数据集?)

Spark “一对多”代码

1//定义一个binary分类器,如:LogisticRegression 2LogisticRegression lr=new LogisticRegression() 3 .setMaxIter(10) 4 .setRegParam(0.3) 5 .setElasticNetParam(0.2) 6 .setThreshold(0.5); 7//建立一对多多分类器model 8OneVsRestModel model=new OneVsRest() 9 .setClassifier(lr)//将binary分类器用这种办法加入 10 .fit(training); 11//利用多分类器model预测 12Dataset<Row>predictions=model.transform(test);

Spark中那些方法可以用于多类分类

多类分类结果评估

(MulticlassClassificationEvaluator类) 
在前面一篇文章里面介绍的关于二分问题的评估方法,部分评估方法可以延伸到多类分类为问题。这些概念可以参考 
下面的文章: http://www.cnblogs.com/itboys/p/8315834.html
Spark中多分类分类基于JavaRDD的评估方法如下: 
Precision,Recall,F-measure都有按照不同label分别评价,或者加权总体评价。 
这里写图片描述 
但是目前基于DataFrame的好像还没有这么多,没有介绍文档 
通过explainParams函数打印出来就四种:

1System.out.println(evaluator.explainParams()); 2metricName: metric name in evaluation (f1|weightedPrecision|weightedRecall|accuracy)

使用方法如下:

1MultilayerPerceptronClassificationModel model= 2 multilayerPerceptronClassifier.fit(training); 3 4 5Dataset<Row> predictions=model.transform(test); 6MulticlassClassificationEvaluator evaluator= 7 new MulticlassClassificationEvaluator() 8 .setLabelCol("label") 9 .setPredictionCol("prediction"); 10 11 12//System.out.println(evaluator.explainParams()); 13double accuracy =evaluator.setMetricName("accuracy").evaluate(predictions); 14double weightedPrecision=evaluator.setMetricName("weightedPrecision").evaluate(predictions); 15double weightedRecall=evaluator.setMetricName("weightedRecall").evaluate(predictions); 16double f1=evaluator.setMetricName("f1").evaluate(predictions);
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Java日期时间API系列31

  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前