论文:Detecting positive and negative deceptive opinions using PU-learning

PU-learning是一种只有正样本的半监督的二分类器。在实际工程应用中,有时候我们会遇到只有正样本而没有负样本的分类任务,或者说负样本是不纯的,即负样本中掺杂有部分正样本。PU-learning提供了一种选择可靠负样本的机制,具体算法如下:

原始的PU-Learning

算法解释:

1:先用正样本(positive)与未标注样本(或者称作无标签样本Unlabel)训练分类器

2:根据训练得到的分类器对未标注样本进行分类

3:把分类为负样本的样本作为可靠的负样本

4-14:把剩下的未标注样本与正样本再训练分类器,不断重复1-3过程,直至没有更多可靠负样本

新的PU-Learning

新的PU-Learning在原有的基础上进行了修正,具体由于看论文出处

基于XGBoost分类器代码如下:

package org.jmlab.ml
 
import java.io.{File, PrintWriter}
 
import ml.dmlc.xgboost4j.LabeledPoint
import ml.dmlc.xgboost4j.scala.{Booster, DMatrix, XGBoost}
import org.apache.log4j.{LogManager, Logger}
import org.apache.spark.mllib.evaluation.{BinaryClassificationMetrics, MulticlassMetrics}
import org.apache.spark.mllib.util.MLUtils
import org.apache.spark.sql.SparkSession
 
/**
  * Created by jmzhou on 2018/9/18.
  */
class GradualReductionPULearner {
 
  val log: Logger = LogManager.getLogger(getClass)
  val prebiThreshold = 0.3f
  var spark: SparkSession = _
  val iterationNum = 20
 
  def loadData(): DMatrix ={
    val valid = MLUtils.loadLibSVMFile(spark.sparkContext, "data/data.libsvm")
      .map(point => {
        LabeledPoint(point.label.toFloat,
          point.features.toSparse.indices,
          point.features.toSparse.values.map(_.toFloat)
        )
      }).collect().toIterator
    new DMatrix(valid)
  }
 
  def weight(labeledPoints: Array[LabeledPoint]): (Booster, Array[LabeledPoint]) ={
    val posPoint = labeledPoints.filter(p => p.label == 1.0)
    val init = zeroStep(labeledPoints)
 
    var relNegPoint = init._1
    var negPoint = init._2
    var preNegPoint = negPoint
    var classifier: Booster = null
    var iterNum = 1
 
    val validDMat = loadData()
 
    var relNegNum = 0
    var stopFlag = false
 
    while (negPoint.length <= preNegPoint.length && posPoint.length < relNegPoint.length && !stopFlag){
      iterNum += 1
      println("iterNum: " + iterNum)
      val dmat = new DMatrix((posPoint++relNegPoint).toIterator)
      val posNum = posPoint.length
      val negNum = relNegPoint.length
      classifier = XGBoost.train(dmat, getParamMap(posNum, negNum), iterationNum)
//      evaluate(spark, classifier, validDMat)
      val predict = classifier.predict(new DMatrix(relNegPoint.toIterator)).flatten
        .map(p => if(p > prebiThreshold) 1.0f else 0.0f)
      preNegPoint = negPoint
      negPoint = relNegPoint.zip(predict).filter{case(p, l) => l == 0.0f}.map(_._1)
      relNegPoint = (relNegPoint ++ negPoint).distinct
      println("posNum: " + posNum)
      if (relNegNum != relNegPoint.length)
        relNegNum = relNegPoint.length
      else if (iterNum >= 2)
        stopFlag = true
      println("relNegPoint: " + relNegNum)
    }
    (classifier, posPoint++relNegPoint)
  }
 
  def zeroStep(labeledPoints: Array[LabeledPoint]): (Array[LabeledPoint], Array[LabeledPoint]) = {
    val posNum = labeledPoints.count(p => p.label == 1.0)
    val negNum = labeledPoints.count(p => p.label == 0.0)
    val unLabelPoint = labeledPoints.filter(p => p.label == 0.0)
    val dmat = new DMatrix(labeledPoints.toIterator)
    val classifier = XGBoost.train(dmat, getParamMap(posNum, negNum), iterationNum)
    val validDMat = loadData()
//    evaluate(spark, classifier, validDMat)
    val predict = classifier.predict(new DMatrix(unLabelPoint.toIterator))
      .flatten.map(p => if(p > prebiThreshold) 1.0f else 0.0f)
    val negPoint = unLabelPoint.zip(predict).filter{case(p, l) => l == 0.0f}.map(_._1)
    val relNegPoint = negPoint
    (relNegPoint, negPoint)
  }
 
  def getParamMap(posNum: Int, negNum: Int): Map[String, Any] = {
    List("eta" -> 0.1f,
      "scale_pos_weight" -> negNum/posNum.toDouble,
      "max_depth" -> 5,
      "silent" -> 0,
      "objective" -> "binary:logistic",
      "lambda" -> 2.5,
      "rate_drop" -> 0.5,
      "alpha" -> 1
    ).toMap
  }
 
  def evaluate(spark: SparkSession, model: Booster, test_dmat: DMatrix): Unit ={
    val labels = test_dmat.getLabel.map(_.toDouble)
    val predict_xgb = model.predict(test_dmat).flatten
 
    val scoreAndLabels = spark.sparkContext.makeRDD(predict_xgb.map(_.toDouble) zip labels)
 
    val xgbMetrics = new BinaryClassificationMetrics(scoreAndLabels)
    val auROC = xgbMetrics.areaUnderROC()
 
    println("xgboost: Area under ROC = " + auROC)
 
    val predicts = predict_xgb.map(p => if(p >= prebiThreshold) 1.0 else 0.0)
    val predictsAndLabels = spark.sparkContext.makeRDD(predicts zip labels)
 
    val roc = xgbMetrics.roc().map{case(fpr, recall) => s"$fpr,$recall"}.collect()
 
    val metrics = new MulticlassMetrics(predictsAndLabels)
    val confusionMatrix = metrics.confusionMatrix
    println("confusionMatrix: ")
    println(confusionMatrix)
 
    val TP = confusionMatrix.apply(1, 1)
    val FP = confusionMatrix.apply(0, 1)
    val FN = confusionMatrix.apply(1, 0)
    val P = TP/(TP+FP)
    val R = TP/(TP+FN)
 
    println("P: " + P)
    println("R: " + R)
 
    val f1 = 2*P*R/(P+R)
 
    println("accuracy: " + metrics.accuracy)
    println("f1 score: " + f1)
    println("class 1 recall: " + metrics.recall(1.0))
    println("class 0 recall: " + metrics.recall(0.0))
 
  }
 
}

————————————————
版权声明:本文为CSDN博主「AISeekOnline」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_28743951/article/details/82765769

XGBoost的PU-Learning相关推荐

  1. 无偏PU learning简介

    PU learning 背景 PU learning(positive-unlabeled learning),即我们只有正样本和未标注的样本,以此进行分类学习. 其可在以下几个领域内应用: 检索 从 ...

  2. PU learning学习笔记

    一.背景介绍 现实生活许多例子只有正样本和大量未标记样本,这是因为获取负类样本较为困难.负类数据太过多样化且动态变化.比如在推荐系统,用户点击为正样本,却不能因为用户没有点击就认为它是负样本,因为可能 ...

  3. POSTER: A PU Learning based System for Potential Malicious URL Detection

    POSTER: A PU Learning based System for Potential Malicious URL Detection 基于PU学习的潜在恶意URL检测系统 POSTER: ...

  4. PU learning简介(附python代码)

    一.引言 在现实生活中,有许多只有正样本和大量未标记样本的例子.这是因为负类样本的一些特点使得获取负样本较为困难.比如: 负类数据不易获取. 负类数据太过多样化. 负类数据动态变化. 举一个形象点的例 ...

  5. PU learning

    PU learning postive learning ,仅有正样本情况下的学习.其应用范围: Retrieval(检索) Inlier-based outlier detection. One-v ...

  6. PU learning 算法

    一.背景介绍 原本是02年提出的一个算法,但是到去年8月份,关于PU learning 的博客介绍都很少(可参考性很差),前几天做毕设,忽然欣喜地发现这半年里陆续出现了几篇关于该算法的文章,挺不错,和 ...

  7. PU --- 无偏PU learning简介

    PU learning 背景 PU learning(positive-unlabeled learning),即我们只有正样本和未标注的样本,以此进行分类学习. 其可在以下几个领域内应用: 检索 从 ...

  8. pu learning的建模实践,半监督学习的好方法!

    这个learning主要是给 你的positive贼少 但是有很多的positive的数据 及时你有很多的确定是negative的数据 你也可以用你预测出来的negative的数据 和你确定是nega ...

  9. xgboost安装_Machine Learning Mastery 博客文章翻译:XGBoost

    请您勇敢地去翻译和改进翻译.虽然我们追求卓越,但我们并不要求您做到十全十美,因此请不要担心因为翻译上犯错--在大部分情况下,我们的服务器已经记录所有的翻译,因此您不必担心会因为您的失误遭到无法挽回的破 ...

  10. PU learning算法简介

    (1)问题描述 给定一个正例文档集合P和一个无标注文档集U(混合文档集),在无标注文档集中同时含有正例文档和反例文档.通过使用P和U建立一个分类器能够辨别U或测试集中的正例文档 [即想要精确分类U或测 ...

最新文章

  1. Post和Get差异
  2. tomcat 显示访问的ip白名单
  3. 51CTO 新人报道
  4. SQL语句中 as 的作用
  5. 计算机公共基础知识论文,计算机等级考试二级公共基础知识汇总.doc
  6. python如何获取请求的url_听说你在学习:如何通过代码请求URL地址
  7. QT:MainWindow初始化列表解释
  8. 红旗linux培训文档,Linux基本应用培训-红旗Linux.ppt
  9. mysql客户端centos离线安装_mysql离线安装部署centos
  10. 软件流程和管理(四):PMP Stakeholder Management
  11. 速达3000pro saas数据库修复
  12. js文档加载事件---
  13. mysql 储存特殊符号表情报错
  14. indesign选中不了图片删除_文件夹删除不了怎么办?文件夹删除不了的解决方法...
  15. Robocup3D项目搭建
  16. 路由url里多了%7D是怎么回事?
  17. hibernate 乐观锁
  18. 程序设计与算法(三)期末考试之013:编程填空:三生三世
  19. Vmware ubuntu桥接方式联网
  20. Linux运维发展如何?哪家培训机构质量高?

热门文章

  1. 全量复制 增量复制 异步复制
  2. Python程序开发——第十章 正则表达式(ヾ(•ω•`)o那么复杂的正则表达式看完这一篇就懂啦)
  3. 堆排序算法c语言筛选法,【排序】排序算法之选择排序
  4. python链表和树实验报告_关于Python实现树结构和链表结构的一点想法
  5. Eclipse安装AmaterasUML
  6. shell 做加法运算_C语言探索之旅 | 第一部分第七课:运算那点事
  7. python有没有三元运算符_Python基础入门:从变量到异常处理(1)
  8. python正则表达式匹配模式屠夫之桥_Python 编程快速上手 第 7章 模式匹配与正则表达式...
  9. python web为什么不火_如何用纯 Python 写交互式 Web 应用?
  10. 内存溢出_关于PermGen Space内存溢出解决方案