Spark2.0机器学习系列之8:多类分类问题(方法归总和分类结果评估)
一对多(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:多类分类问题(方法归总和分类结果评估)的更多相关文章
- Spark2.0机器学习系列之9: 聚类(k-means,Bisecting k-means,Streaming k-means)
在Spark2.0版本中(不是基于RDD API的MLlib),共有四种聚类方法: (1)K-means (2)Latent Dirichlet allocation (LDA) ...
- Spark2.0机器学习系列之1: 聚类算法(LDA)
在Spark2.0版本中(不是基于RDD API的MLlib),共有四种聚类方法: (1)K-means (2)Latent Dirichlet allocation (LDA) ...
- Spark2.0机器学习系列之12: 线性回归及L1、L2正则化区别与稀疏解
概述 线性回归拟合一个因变量与一个自变量之间的线性关系y=f(x). Spark中实现了: (1)普通最小二乘法 (2)岭回归(L2正规化) (3)La ...
- Spark2.0机器学习系列之11: 聚类(幂迭代聚类, power iteration clustering, PIC)
在Spark2.0版本中(不是基于RDD API的MLlib),共有四种聚类方法: (1)K-means (2)Latent Dirichlet all ...
- Spark2.0机器学习系列之10: 聚类(高斯混合模型 GMM)
在Spark2.0版本中(不是基于RDD API的MLlib),共有四种聚类方法: (1)K-means (2)Latent Dirichlet allocation (LDA) ...
- Spark2.0机器学习系列之7: MLPC(多层神经网络)
Spark2.0 MLPC(多层神经网络分类器)算法概述 MultilayerPerceptronClassifier(MLPC)这是一个基于前馈神经网络的分类器,它是一种在输入层与输出层之间含有一层 ...
- Spark2.0机器学习系列之4:Logistic回归及Binary分类(二分问题)结果评估
参数设置 α: 梯度上升算法迭代时候权重更新公式中包含 α : http://blog.csdn.net/lu597203933/article/details/38468303 为了更好理解 α和 ...
- Spark2.0机器学习系列之3:决策树
概述 分类决策树模型是一种描述对实例进行分类的树形结构. 决策树可以看为一个if-then规则集合,具有“互斥完备”性质 .决策树基本上都是 采用的是贪心(即非回溯)的算法,自顶向下递归分治构造. 生 ...
- Spark2.0机器学习系列之6:GBDT(梯度提升决策树)、GBDT与随机森林差异、参数调试及Scikit代码分析
概念梳理 GBDT的别称 GBDT(Gradient Boost Decision Tree),梯度提升决策树. GBDT这个算法还有一些其他的名字,比如说MART(Multiple Addi ...
随机推荐
- 深度剖析java编码,彻底解决java乱码问题_1
理解: 1,Java编译器(即编译成class文件时) 用的是unicode字符集. 2,乱码主要是由于不同的字符集相互转换导致的,理论上各个字符的编码规则是不同的,是不能相互转换的,所以根本解决乱码 ...
- eclipse不能自动编译生成class文件的解决办法
最近在项目项目开发过程中遇到eclipse不能自动编译生成class文件,当时很纳闷,每次修改代码后运行都是修改前的效果,没辙了,只好反编译原来的class文件,结果发现,class文件里并没有看到修 ...
- 005Maven_Myeclipse和Maven整合
准备好:1.Myeclipse2014; 2. E盘下面的:
- JDBC中,用于表示数据库连接的对象是。(选择1项)
JDBC中,用于表示数据库连接的对象是.(选择1项) A.Statement B.Connection C. DriverManager D.PreparedStatement 解答:B
- 【BZOJ】1621: [Usaco2008 Open]Roads Around The Farm分岔路口(dfs)
http://www.lydsy.com/JudgeOnline/problem.php?id=1621 这题用笔推一下就懂了的.... 当2|(n-k)时,才能分,否则不能分. 那么dfs即可.. ...
- Autofac IoC容器基本实战【2】
原文:http://www.cnblogs.com/liping13599168/archive/2011/07/16/2108209.html Autofac是一款IOC框架,比较于其他的IOC框架 ...
- loadimage1();有问题
f.Read(pBuffer, nSize)不能少,少了虽然能读进去数据但是不能显示成图片,可能原因是存进的数据并不是图片数据! 输入图片测试,但是没有CFile先Open再Read
- Spring_day04--SSH框架整合过程
SSH框架整合过程 第一步 导入jar包 第二步 搭建struts2环境 (1)创建action,创建struts.xml配置文件,配置action (2)配置struts2的过滤器 第三步 搭建hi ...
- Masonry介绍与使用实践 - iOS移动开发周报
本文转发至 http://www.tuicool.com/articles/MRbaEnB/ 原文 http://www.infoq.com/cn/news/2014/11/masonry-intr ...
- Android之ListView中的分割线
ListView中每个Item项之间都有分割线,设置android:footerDividersEnabled表示是否显示分割线,此属性默认为true. 1.不显示分割线只要在ListView控件中添 ...