在 zeppelin中使用scala 版 xgboost 做预测

image.png

在zeppelin中 使用python 版的xgboost 还是比较简单,首先 Mac上要先安装好xgboost python包,如果 mac上安装了多个python 版本,主要会碰到的是引入包模块失败,找不到包,这个主要是python的解释器 路径不是哪个安装了xgboost的python 路径,我们在zeppelin 中的interpreter 中找到 python 的配置信息,修改 zeppelin中python 路径就可以了

而在zeppelin 中使用 scala 版的xgboost 磨难也不少,第一 java scala 的包管理不是向python ,pip 安装在电脑上,可以全局使用,所以在zeppelin中要想使用非spark 的第三方jar包,你需要使用上 zeppelin的仓库管理和引入第三方依赖。
简短来说,就是 首先引入 xgboost 的scala jar包依赖

%dep
z.load("me.lyh:xgboost4j:0.7-20171122-70a4c419")

这个是在线maven 仓库找,速度比较慢,三四分钟左右

然后另一点就是 读取 数据集
如果在本地scala 项目 里读取数据级,我们使用的是 classloader

        %spark
        val path="./agaricus.txt.train" 
        val testpath="./agaricus.txt.test" 
        val dpath=this.getClass.getClassLoader.getResource(path).getPath 
        val dtestpath=this.getClass.getClassLoader.getResource(testpath).getPath 

但是在zeppelin中我们是没有项目结构概念的,所有的代码不属于任何一个项目,它只是一个notebook
所以读取数据集 ,我们要使用 文件的绝对路径,然后使用 java IO,的File类
来读取,如果要读取数据流,还要用到 InputStream

     %spark
     import java.io.{File, FileInputStream, InputStream} 
     val path="/Users/geo/Documents/gitlab/wormhole/learn/data/agaricus.txt.train" 
     val 
  testpath="/Users/geo/Documents/gitlab/wormhole/learn/data/agaricus.txt.test" 
      val ins: InputStream = new FileInputStream(new File(path)) 
      val dpath=new File(path) 
      val dpathTest=new File(testpath) 
      val trainDatas=new DMatrix(dpath.getPath) 
      val testDatas=new DMatrix(dpathTest.getPath) 

数据流读取没有问题了之后就比较简单,导入到XGboost 的矩阵集,做训练和预测

   val trainDatas=new DMatrix(dpath.getPath)  
   val testDatas=new DMatrix(dpathTest.getPath)  
   val paramMap=List(
            "eta" -> 0.6,
            "max_depth" -> 3,
            "objective" -> "binary:logistic"
        ).toMap
        val round =2 
   val model=XGBoost.train(trainDatas,paramMap,round) 
   val predictTrain=model.predict(testDatas) 

最后我们在计算准确率

      val res=predictTrain.zip(testDatas.getLabel).map(
            key =>{
                if(key._1(0)>=0.5){
                    //println(1.0,key._2)
                   key._2.toDouble - 1.0
                }else{
                    key._2.toDouble - 0.0
                }
            }
        )
        val flsize=res.count(key=>key.toInt ==0)
        println(flsize)
        val pre= flsize  /  1611.toDouble
        println("auc "+pre)

数据集在 github
https://github.com/dmlc/wormhole/tree/master/learn/data

相关 输出信息

import java.io.{File, FileInputStream, InputStream}
path: String = /Users/geo/Documents/gitlab/wormhole/learn/data/agaricus.txt.train
testpath: String = /Users/geo/Documents/gitlab/wormhole/learn/data/agaricus.txt.test
ins: java.io.InputStream = java.io.FileInputStream@6e5931c8
dpath: java.io.File = /Users/geo/Documents/gitlab/wormhole/learn/data/agaricus.txt.train
dpathTest: java.io.File = /Users/geo/Documents/gitlab/wormhole/learn/data/agaricus.txt.test
trainDatas: ml.dmlc.xgboost4j.scala.DMatrix = ml.dmlc.xgboost4j.scala.DMatrix@3c11755f
testDatas: ml.dmlc.xgboost4j.scala.DMatrix = ml.dmlc.xgboost4j.scala.DMatrix@c3cb2a6
paramMap: scala.collection.immutable.Map[String,Any] = Map(eta -> 0.6, max_depth -> 3, objective -> binary:logistic)
round: Int = 2
model: ml.dmlc.xgboost4j.scala.Booster = ml.dmlc.xgboost4j.scala.Booster@52feb8da
predictTrain: Array[Array[Float]] = Array(Array(0.21618992), Array(0.73917085), Array(0.21618992), Array(0.21618992), Array(0.124009185), Array(0.23739603), Array(0.73917085), Array(0.21618992), Array(0.73917085), Array(0.21929929), Array(0.73917085), Array(0.21618992), Array(0.124009185), Array(0.21618992), Array(0.124009185), Array(0.21929929), Array(0.21618992), Array(0.73917085), Array(0.124009185), Array(0.21618992), Array(0.21618992), Array(0.21929929), Array(0.21618992), Array(0.21618992), Array(0.21929929), Array(0.73917085), Array(0.23739603), Array(0.21618992), Array(0.21618992), Array(0.124009185), Array(0.21618992), Array(0.21618992), Array(0.21929929), Array(0.124009185), Array(0.21618992), Array(0.21618992), Array(0.23739603), Array(0.73917085), Array(0.21618992), Array(0....res: Array[Double] = Array(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...flsize: Int = 1609
1609
pre: Double = 0.9987585350713842
 0.9987585350713842

你可能感兴趣的:(在 zeppelin中使用scala 版 xgboost 做预测)