一对多(One-vs-Rest classifier)

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

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

“一对多”方法

训练时依次把某个类别的样本归为一类,其他剩余的样本归为另一类,这样k个类别的样
本就构造出了k个binary分类器。分类时将未知样本分类为具有最大分类函数值的那类。
假如我有四类要划分(也就是4个Label),他们是A、B、C、D。
  于是我在抽取训练集的时候,分别抽取
  ()A所对应的向量作为正集,B,C,D所对应的向量作为负集;
  ()B所对应的向量作为正集,A,C,D所对应的向量作为负集;
  ()C所对应的向量作为正集,A,B,D所对应的向量作为负集;
  ()D所对应的向量作为正集,A,B,C所对应的向量作为负集;
  使用这四个训练集分别进行训练,然后得到四个训练结果文件。
  在测试的时候,把对应的测试向量分别利用这四个训练结果文件进行测试。
  最后每个测试都有一个结果f1(x),f2(x),f3(x),f4(x)。
  于是最终的结果便是这四个值中最大的一个作为分类结果。
这种方法有种缺陷,因为训练集是1:M,这种情况下存在biased(即正负样本数可能很不均衡)
另外还有“一对一”方法,Spark2.0中还没有实现。
其做法是在任意两类样本之间设计一个分类器,因此k个类别的样本就需要设计k(k-)/2个SVM。
当对一个未知样本进行分类时,最后得票最多的类别即为该未知样本的类别。
Libsvm中的多类分类就是根据这个方法实现的。
主要缺点:当类别很多的时候,model的个数是n*(n-)/,代价还是相当大的。(是不是不适合大数据集?)

Spark “一对多”代码

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

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

多类分类结果评估

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

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

使用方法如下:

MultilayerPerceptronClassificationModel model=
multilayerPerceptronClassifier.fit(training); Dataset<Row> predictions=model.transform(test);
MulticlassClassificationEvaluator evaluator=
new MulticlassClassificationEvaluator()
.setLabelCol("label")
.setPredictionCol("prediction"); //System.out.println(evaluator.explainParams());
double accuracy =evaluator.setMetricName("accuracy").evaluate(predictions);
double weightedPrecision=evaluator.setMetricName("weightedPrecision").evaluate(predictions);
double weightedRecall=evaluator.setMetricName("weightedRecall").evaluate(predictions);
double f1=evaluator.setMetricName("f1").evaluate(predictions);

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

  1. Spark2.0机器学习系列之9: 聚类(k-means,Bisecting k-means,Streaming k-means)

    在Spark2.0版本中(不是基于RDD API的MLlib),共有四种聚类方法:      (1)K-means      (2)Latent Dirichlet allocation (LDA)  ...

  2. Spark2.0机器学习系列之1: 聚类算法(LDA)

    在Spark2.0版本中(不是基于RDD API的MLlib),共有四种聚类方法:      (1)K-means      (2)Latent Dirichlet allocation (LDA)  ...

  3. Spark2.0机器学习系列之12: 线性回归及L1、L2正则化区别与稀疏解

    概述 线性回归拟合一个因变量与一个自变量之间的线性关系y=f(x).       Spark中实现了:       (1)普通最小二乘法       (2)岭回归(L2正规化)       (3)La ...

  4. Spark2.0机器学习系列之11: 聚类(幂迭代聚类, power iteration clustering, PIC)

    在Spark2.0版本中(不是基于RDD API的MLlib),共有四种聚类方法:             (1)K-means             (2)Latent Dirichlet all ...

  5. Spark2.0机器学习系列之10: 聚类(高斯混合模型 GMM)

    在Spark2.0版本中(不是基于RDD API的MLlib),共有四种聚类方法:      (1)K-means      (2)Latent Dirichlet allocation (LDA)  ...

  6. Spark2.0机器学习系列之7: MLPC(多层神经网络)

    Spark2.0 MLPC(多层神经网络分类器)算法概述 MultilayerPerceptronClassifier(MLPC)这是一个基于前馈神经网络的分类器,它是一种在输入层与输出层之间含有一层 ...

  7. Spark2.0机器学习系列之4:Logistic回归及Binary分类(二分问题)结果评估

    参数设置 α: 梯度上升算法迭代时候权重更新公式中包含 α :  http://blog.csdn.net/lu597203933/article/details/38468303 为了更好理解 α和 ...

  8. Spark2.0机器学习系列之3:决策树

    概述 分类决策树模型是一种描述对实例进行分类的树形结构. 决策树可以看为一个if-then规则集合,具有“互斥完备”性质 .决策树基本上都是 采用的是贪心(即非回溯)的算法,自顶向下递归分治构造. 生 ...

  9. Spark2.0机器学习系列之6:GBDT(梯度提升决策树)、GBDT与随机森林差异、参数调试及Scikit代码分析

    概念梳理 GBDT的别称 GBDT(Gradient Boost Decision Tree),梯度提升决策树.     GBDT这个算法还有一些其他的名字,比如说MART(Multiple Addi ...

随机推荐

  1. HIbernate與不支持boolean的數據庫之間的映射

    http://soft-development.iteye.com/blog/1225274 ————————————————————————————————————————————————————— ...

  2. PHP多进程(4) :内部多进程

    说的都是只兼容unix 服务器的多进程,下面来讲讲在window 和 unix 都兼容的多进程(这里是泛指,下面的curl实际上是通过IO复用实现的). 通过扩展实现多线程的典型例子是CURL,CUR ...

  3. KMP + 求最小循环节 --- HUST 1010 - The Minimum Length

    The Minimum Length Problem's Link: http://acm.hust.edu.cn/problem/show/1010 Mean: 给你一个字符串,求这个字符串的最小循 ...

  4. 使用JAVASCRIPT进行数据完整性验证

    页面输入完整性是编写BS经常遇到的问题,如果那里需要就到那里写,那可是要花不少的时候,并且造成不必要的浪费,下面是一个通过校验脚本,使用非常方便,通过传入FORM名就可以进行校验,通过在页面控件中增加 ...

  5. CSS3制作文字半透明倒影效果

      效果如图.Ps.背景线条是背景图勒,和本文效果无关... html代码如下: <div class="content"> <h3 title="专业 ...

  6. 009杰信-创建购销合同Excel报表系列-2-建立购销合同(增删改查)

    前面一篇文章已经分析好了数据库的表,这篇文章针对购销合同表做一个增删改查. 和之前的表的增删该查类似. 项目结构如下:

  7. ContextLoader,ContextLoaderListener解读

    一.ServletContext 有 addListener(..) 方法,也有创建的方法 createListener(Class<T> c) . 有addFilter(..) 方法,也 ...

  8. java为安全起见对Applet有所限制

    Applet消亡的原因: ①java为安全起见对Applet有所限制:Applet不允许访问本地文件信息.敏感信息,不能执行本地指令(比如FORMAT),不能访问初原服务器之外的其他服务器. ① IE ...

  9. Unity3d优化总结2

    优化: 1. 更新不透明贴图的压缩格式为ETC 4bit,因为android市场的手机中的GPU有多种, 每家的GPU支持不同的压缩格式,但他们都兼容ETC格式, 2. 对于透明贴图,我们只能选择RG ...

  10. oracle中恢复删除的表

    1.表恢复,如果在删除表的同时删除的数据,那么表恢复也能恢复当时删除时的数据 -----查询删除的表 select * from recyclebin order by droptime desc - ...