/**
* Created by lkl on 2017/12/6.
*/
import org.apache.spark.mllib.evaluation.BinaryClassificationMetrics
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.tree.GradientBoostedTrees
import org.apache.spark.mllib.tree.configuration.BoostingStrategy
import org.apache.spark.sql.hive.HiveContext
import org.apache.spark.{SparkConf, SparkContext}
import scala.collection.mutable.ArrayBuffer
object GradientBoostingClassificationForLK {
//http://blog.csdn.net/xubo245/article/details/51499643
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("GradientBoostingClassificationForLK")
val sc = new SparkContext(conf) // sc is an existing SparkContext.
val hc = new HiveContext(sc) if(args.length!=){
println("请输入参数:trainingData对应的库名、表名、模型运行时间")
System.exit()
} //分别传入库名、表名、对比效果路径
// val database = args(0)
// val table = args(1)
// val date = args(2)
 //lkl_card_score.overdue_result_all_new_woe
val format = new java.text.SimpleDateFormat("yyyyMMdd")
val database ="lkl_card_score"
val table = "overdue_result_all_new_woe"
val date =format.format(new java.util.Date())
//提取数据集 RDD[LabeledPoint]
//val data = hc.sql(s"select * from $database.$table").map{ val data = hc.sql(s"select * from lkl_card_score.overdue_result_all_new_woe").map{
row =>
var arr = new ArrayBuffer[Double]()
//剔除label、contact字段
for(i <- until row.size){
if(row.isNullAt(i)){
arr += 0.0
}
else if(row.get(i).isInstanceOf[Int])
arr += row.getInt(i).toDouble
else if(row.get(i).isInstanceOf[Double])
arr += row.getDouble(i)
else if(row.get(i).isInstanceOf[Long])
arr += row.getLong(i).toDouble
else if(row.get(i).isInstanceOf[String])
arr += 0.0
}
LabeledPoint(row.getInt(), Vectors.dense(arr.toArray))
}
// Split the data into training and test sets (30% held out for testing)
val splits = data.randomSplit(Array(0.7, 0.3))
val (trainingData, testData) = (splits(), splits()) // Train a GradientBoostedTrees model.
// The defaultParams for Classification use LogLoss by default.
val boostingStrategy = BoostingStrategy.defaultParams("Classification")
boostingStrategy.setNumIterations() // Note: Use more iterations in practice.
boostingStrategy.treeStrategy.setNumClasses()
boostingStrategy.treeStrategy.setMaxDepth()
// Empty categoricalFeaturesInfo indicates all features are continuous.
//boostingStrategy.treeStrategy.setCategoricalFeaturesInfo(Map[Int, Int]()) val model = GradientBoostedTrees.train(trainingData, boostingStrategy) // Evaluate model on test instances and compute test error
val predictionAndLabels = testData.map { point =>
val prediction = model.predict(point.features)
(point.label, prediction)
} predictionAndLabels.map(x => {"predicts: "+x._1+"--> labels:"+x._2}).saveAsTextFile(s"hdfs://ns1/tmp/$date/predictionAndLabels")
//===================================================================
//使用BinaryClassificationMetrics评估模型
val metrics = new BinaryClassificationMetrics(predictionAndLabels) // Precision by threshold
val precision = metrics.precisionByThreshold
precision.map({case (t, p) =>
"Threshold: "+t+"Precision:"+p
}).saveAsTextFile(s"hdfs://ns1/tmp/$date/precision") // Recall by threshold
val recall = metrics.recallByThreshold
recall.map({case (t, r) =>
"Threshold: "+t+"Recall:"+r
}).saveAsTextFile(s"hdfs://ns1/tmp/$date/recall") //the beta factor in F-Measure computation.
val f1Score = metrics.fMeasureByThreshold
f1Score.map(x => {"Threshold: "+x._1+"--> F-score:"+x._2+"--> Beta = 1"})
.saveAsTextFile(s"hdfs://ns1/tmp/$date/f1Score") /**
* 如果要选择Threshold, 这三个指标中, 自然F1最为合适
* 求出最大的F1, 对应的threshold就是最佳的threshold
*/
/*val maxFMeasure = f1Score.select(max("F-Measure")).head().getDouble(0)
val bestThreshold = f1Score.where($"F-Measure" === maxFMeasure)
.select("threshold").head().getDouble(0)*/ // Precision-Recall Curve
val prc = metrics.pr
prc.map(x => {"Recall: " + x._1 + "--> Precision: "+x._2 }).saveAsTextFile(s"hdfs://ns1/tmp/$date/prc") // AUPRC,精度,召回曲线下的面积
val auPRC = metrics.areaUnderPR
sc.makeRDD(Seq("Area under precision-recall curve = " +auPRC)).saveAsTextFile(s"hdfs://ns1/tmp/$date/auPRC") //roc
val roc = metrics.roc
roc.map(x => {"FalsePositiveRate:" + x._1 + "--> Recall: " +x._2}).saveAsTextFile(s"hdfs://ns1/tmp/$date/roc") // AUC
val auROC = metrics.areaUnderROC
sc.makeRDD(Seq("Area under ROC = " + +auROC)).saveAsTextFile(s"hdfs://ns1/tmp/$date/auROC")
println("Area under ROC = " + auROC) val testErr = predictionAndLabels.filter(r => r._1 != r._2).count.toDouble / testData.count()
sc.makeRDD(Seq("Test Mean Squared Error = " + testErr)).saveAsTextFile(s"hdfs://ns1/tmp/$date/testErr")
sc.makeRDD(Seq("Learned regression tree model: " + model.toDebugString)).saveAsTextFile(s"hdfs://ns1/tmp/$date/GBDTclassification")
} }

lakala GradientBoostedTrees的更多相关文章

  1. lakala反欺诈建模实际应用代码GBDT监督学习

    /** * Created by lkl on 2018/1/16. */ import org.apache.spark.mllib.evaluation.BinaryClassificationM ...

  2. lakala proportion轨迹分析代码

    /** * Created by lkl on 2017/12/7. */ import breeze.numerics.abs import org.apache.spark.sql.SQLCont ...

  3. 决策树和基于决策树的集成方法(DT,RF,GBDT,XGBT)复习总结

    摘要: 1.算法概述 2.算法推导 3.算法特性及优缺点 4.注意事项 5.实现和具体例子 内容: 1.算法概述 1.1 决策树(DT)是一种基本的分类和回归方法.在分类问题中它可以认为是if-the ...

  4. 《Spark 官方文档》机器学习库(MLlib)指南

    spark-2.0.2 机器学习库(MLlib)指南 MLlib是Spark的机器学习(ML)库.旨在简化机器学习的工程实践工作,并方便扩展到更大规模.MLlib由一些通用的学习算法和工具组成,包括分 ...

  5. ORACLE11G常用函数

    1 单值函数 1.1 日期函数 1.1.1 Round [舍入到最接近的日期](day:舍入到最接近的星期日) select sysdate S1, round(sysdate) S2 , round ...

  6. 决策树和基于决策树的集成方法(DT,RF,GBDT,XGB)复习总结

    摘要: 1.算法概述 2.算法推导 3.算法特性及优缺点 4.注意事项 5.实现和具体例子 内容: 1.算法概述 1.1 决策树(DT)是一种基本的分类和回归方法.在分类问题中它可以认为是if-the ...

  7. MLlib--GBDT算法

    转载请标明出处http://www.cnblogs.com/haozhengfei/p/8b9cb1875288d9f6cfc2f5a9b2f10eac.html GBDT算法 江湖传言:GBDT算法 ...

  8. spark MLlib Classification and regression 学习

    二分类:SVMs,logistic regression,decision trees,random forests,gradient-boosted trees,naive Bayes 多分类:  ...

  9. Oracle分析函数及常用函数: over(),rank()over()作用及用法--分区(分组)求和& 不连续/连续排名

    (1)   函数:  over()的作用及用法:    -- 分区(分组)求和. sum() over( partition by column1 order by column2 )主要用来对某个字 ...

随机推荐

  1. Python与操作系统有关的模块

    Os模块 Python的标准库中的os模块主要涉及普遍的操作系统功能.可以在Linux和Windows下运行,与平台无关.os.sep 可以取代操作系统特定的路径分割符.os.name字符串指示你正在 ...

  2. 别人不会给你说的---C语言中数组名和指针的区别 及 sizeof用法

    引自: http://blog.csdn.net/tianyue168/article/details/5781924 #i nclude <iostream.h> int  main( ...

  3. browser_autopwn2

    browser_autopwn2是个啥玩意儿? 一个集合了浏览器漏洞的小框架 option msf > use auxiliary/server/browser_autopwn2 msf aux ...

  4. Android 面试知识集1

    今晚在复习Android基础的时候,找到了一些很有价值的基础知识,分享给给位Android的开发者.这些是基础知识,同时也可以当做面试准备.面试题其实是很好的基础知识学习,有空会好好整理相关基础知识. ...

  5. Android 仿微信的朋友圈发布(1)

    想自己做一个APP,然后等做到类似发布朋友圈的,微博状态的时候,遇到问题了,完全不知道咋下手. 什么访问相册,列出照片,选择照片进行回传,完全不懂,咋办,自己写?自己写是不可能自己写的,打屎都不可能自 ...

  6. [转]JS组件系列——表格组件神器:bootstrap table

    原文地址:https://www.cnblogs.com/landeanfen/p/4976838.html 前言:之前一直在忙着各种什么效果,殊不知最基础的Bootstrap Table用法都没有涉 ...

  7. spark streaming从指定offset处消费Kafka数据

    spark streaming从指定offset处消费Kafka数据 -- : 770人阅读 评论() 收藏 举报 分类: spark() 原文地址:http://blog.csdn.net/high ...

  8. 【Unity】自定义编辑器窗口——拓展编辑器功能

    最近学习了Unity自定义编辑器窗口,下面简单总结,方便用到时回顾. 新建一个脚本: using UnityEngine; using System.Collections; using UnityE ...

  9. JAXP操作xml

    DOM对象详解1.基本的DOM对象 DOM的基本对象有5个:Document,Node,NodeList,Element和Attr.下面就这些对象的功能和实现的方法作一个大致的介绍. Document ...

  10. Java编程的逻辑 (73) - 并发容器 - 写时拷贝的List和Set

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...