XGBoost的PU-Learning
论文: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相关推荐
- 无偏PU learning简介
PU learning 背景 PU learning(positive-unlabeled learning),即我们只有正样本和未标注的样本,以此进行分类学习. 其可在以下几个领域内应用: 检索 从 ...
- PU learning学习笔记
一.背景介绍 现实生活许多例子只有正样本和大量未标记样本,这是因为获取负类样本较为困难.负类数据太过多样化且动态变化.比如在推荐系统,用户点击为正样本,却不能因为用户没有点击就认为它是负样本,因为可能 ...
- 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: ...
- PU learning简介(附python代码)
一.引言 在现实生活中,有许多只有正样本和大量未标记样本的例子.这是因为负类样本的一些特点使得获取负样本较为困难.比如: 负类数据不易获取. 负类数据太过多样化. 负类数据动态变化. 举一个形象点的例 ...
- PU learning
PU learning postive learning ,仅有正样本情况下的学习.其应用范围: Retrieval(检索) Inlier-based outlier detection. One-v ...
- PU learning 算法
一.背景介绍 原本是02年提出的一个算法,但是到去年8月份,关于PU learning 的博客介绍都很少(可参考性很差),前几天做毕设,忽然欣喜地发现这半年里陆续出现了几篇关于该算法的文章,挺不错,和 ...
- PU --- 无偏PU learning简介
PU learning 背景 PU learning(positive-unlabeled learning),即我们只有正样本和未标注的样本,以此进行分类学习. 其可在以下几个领域内应用: 检索 从 ...
- pu learning的建模实践,半监督学习的好方法!
这个learning主要是给 你的positive贼少 但是有很多的positive的数据 及时你有很多的确定是negative的数据 你也可以用你预测出来的negative的数据 和你确定是nega ...
- xgboost安装_Machine Learning Mastery 博客文章翻译:XGBoost
请您勇敢地去翻译和改进翻译.虽然我们追求卓越,但我们并不要求您做到十全十美,因此请不要担心因为翻译上犯错--在大部分情况下,我们的服务器已经记录所有的翻译,因此您不必担心会因为您的失误遭到无法挽回的破 ...
- PU learning算法简介
(1)问题描述 给定一个正例文档集合P和一个无标注文档集U(混合文档集),在无标注文档集中同时含有正例文档和反例文档.通过使用P和U建立一个分类器能够辨别U或测试集中的正例文档 [即想要精确分类U或测 ...
最新文章
- Post和Get差异
- tomcat 显示访问的ip白名单
- 51CTO 新人报道
- SQL语句中 as 的作用
- 计算机公共基础知识论文,计算机等级考试二级公共基础知识汇总.doc
- python如何获取请求的url_听说你在学习:如何通过代码请求URL地址
- QT:MainWindow初始化列表解释
- 红旗linux培训文档,Linux基本应用培训-红旗Linux.ppt
- mysql客户端centos离线安装_mysql离线安装部署centos
- 软件流程和管理(四):PMP Stakeholder Management
- 速达3000pro saas数据库修复
- js文档加载事件---
- mysql 储存特殊符号表情报错
- indesign选中不了图片删除_文件夹删除不了怎么办?文件夹删除不了的解决方法...
- Robocup3D项目搭建
- 路由url里多了%7D是怎么回事?
- hibernate 乐观锁
- 程序设计与算法(三)期末考试之013:编程填空:三生三世
- Vmware ubuntu桥接方式联网
- Linux运维发展如何?哪家培训机构质量高?
热门文章
- 全量复制 增量复制 异步复制
- Python程序开发——第十章 正则表达式(ヾ(•ω•`)o那么复杂的正则表达式看完这一篇就懂啦)
- 堆排序算法c语言筛选法,【排序】排序算法之选择排序
- python链表和树实验报告_关于Python实现树结构和链表结构的一点想法
- Eclipse安装AmaterasUML
- shell 做加法运算_C语言探索之旅 | 第一部分第七课:运算那点事
- python有没有三元运算符_Python基础入门:从变量到异常处理(1)
- python正则表达式匹配模式屠夫之桥_Python 编程快速上手 第 7章 模式匹配与正则表达式...
- python web为什么不火_如何用纯 Python 写交互式 Web 应用?
- 内存溢出_关于PermGen Space内存溢出解决方案