日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

XGBoost的PU-Learning

發布時間:2024/1/23 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。