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

一对多(One-vs-Rest classifier)

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

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

“一对多”方法

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

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

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

Spark “一对多”代码

//定义一个binary分类器,如:LogisticRegression 
LogisticRegression lr=new LogisticRegression()
                .setMaxIter(10)
                .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://blog.csdn.net/qq_34531825/article/details/52313553
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);      
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值