最近在工作之余参加了一个CTR预估的比赛,CTR预估是一个成熟又经典的问题,工业界目前使用的主流方案仍然是LR+海量特征。趁着这一次比赛的机会,正好抱着学习的心态尝试着学习用spark集群来训练一下LR。

在学校的时候大家训练模型一般都是用python+pandas+numpy+sklearn,这一套工具在单机的环境下非常的简单易学,但是面对海量数据或者高维稀疏矩阵的计算,就显得无能为力。

相比之下,spark作为分布式计算框架,用户操作起来的感觉更多是,虽然笨重,但是算得快啊。

spark提供了两套机器学习的库,mllib和ml。前者主要适用于RDD的处理,而后者主要适用于dataframe的处理。

目前spark的用户中基于spark.dataframe已经成为了主流,mllib这个库也不再维护,转向更新ml这个库。

spark上支持cpp、java、python和scala,其中scala是spark的原生语言,本文就以scala为例,训练了一个非常简单的LR模型。

import org.apache.spark.ml.classification.LogisticRegression
import org.apache.spark.ml.evaluation.BinaryClassificationEvaluator
import org.apache.spark.ml.{Pipeline, PipelineStage}
import org.apache.spark.ml.feature.{OneHotEncoder, StringIndexer, VectorAssembler}
import org.apache.spark.sql.SparkSession
import org.apache.spark.ml.linalg.Vectorsimport scala.collection.mutable.ListBufferobject newtrainLR {val spark = SparkSession.builder().appName("LR-Predict").getOrCreate()
//数据读入val trainPath = "../train_with_hour.csv"val testPath = "../test_with_hour.csv"val trainDF = spark.read.format("csv").option("header", "true").load(trainPath)val testDF = spark.read.format("csv").option("header", "true").load(testPath)val newTrainDF = trainDF.drop("_c0", "Unnamed: 0", "time", "city", "app_paid").withColumn("flag", lit(1))val newTestDF = testDF.drop("_c0", "Unnamed: 0", "time", "city").withColumn("click", lit(3)).withColumn("flag", lit(2))//合并train、test,一起做one-hot编码val allDF = newTrainDF.union(newTestDF)//获取列名arrayval colNameDF = allDF.drop("flag", "click")// 要进行OneHotEncoder编码的字段val categoricalColumns = colNameDF.columns//采用Pileline方式处理机器学习流程val stagesArray = new ListBuffer[PipelineStage]()for (cate <- categoricalColumns) {//使用StringIndexer 建立类别索引val indexer = new StringIndexer().setInputCol(cate).setOutputCol(s"${cate}Index")// 使用OneHotEncoder将分类变量转换为二进制稀疏向量val encoder = new OneHotEncoder().setInputCol(indexer.getOutputCol).setOutputCol(s"${cate}classVec")stagesArray.append(indexer, encoder)}val assemblerInputs = categoricalColumns.map(_ + "classVec")// 使用VectorAssembler将所有特征转换为一个向量val assembler = new VectorAssembler().setInputCols(assemblerInputs).setOutputCol("features")//使用pipeline批处理val pipeline = new Pipeline()pipeline.setStages(stagesArray.toArray)val pipelineModel = pipeline.fit(allDF)val dataset = pipelineModel.transform(allDF)val newDF = dataset.select("click", "features", "flag")//拆分train、testval processedTrain = newDF.filter(col("flag") === 1).drop("flag")val processedTest = newDF.filter(col("flag") === 2).drop("click", "flag")//处理label列val indexer2Click = new StringIndexer().setInputCol("click").setOutputCol("ctr")val finalTrainDF = indexer2Click.fit(processedTrain).transform(processedTrain).drop("click")//随机分割测试集和训练集数据val Array(trainingDF, testDF) = finalTrainDF.randomSplit(Array(0.7, 0.3), seed = 1)println(s"trainingDF size=${trainingDF.count()},testDF size=${testDF.count()}")val lrModel = new LogisticRegression().setLabelCol("ctr").setFeaturesCol("features").setMaxIter(10000).setThreshold(0.5).setRegParam(0.15).fit(trainingDF)val predictions = lrModel.transform(testDF).select($"ctr".as("label"), "features", “rawPrediction", "probability", "prediction")//使用BinaryClassificationEvaluator来评价我们的模型val evaluator = new BinaryClassificationEvaluator()evaluator.setMetricName("areaUnderROC")val auc = evaluator.evaluate(predictions)val newprediction = lrModel.transform(processedTest).select("probability")//取出预测为1的probabilityval reseult2 = newprediction.map(line => {val dense = line.get(line.fieldIndex("probability")).asInstanceOf[org.apache.spark.ml.linalg.DenseVector]val y = dense(1).toString(y)}).toDF("pro2ture")reseult2.repartition(1).write.text(“../firstLrResultStr")

使用spark训练LR模型相关推荐

  1. 【Spark】Spark训练Lr模型,并保存为Pmml

    scala版本spark构建的Lr模型: 一.问题背景   需要构建一个Lr模型来进行物品的Ctr预测. 二.解决方案   由于我们训练的数据量较多,所以首先考虑采用spark来构建模型并测试训练,这 ...

  2. Python statsmodel包训练LR模型

    Python中训练LR模型一般使用sklearn包,输出模型报告和其他机器学习方法一样.但从统计背景出发,想看更详细的报告,statsmodel包可以帮助实现. 1.训练模型 import stats ...

  3. Spark 训练机器学习模型莫名报错(java.lang.stackoverflow)

    遇到一个问题,为此熬了夜,如果没遇到这篇文章,很难发现原因. 具体描述一下问题,我的代码如下: var dataDf = ... // load from other place val inDoub ...

  4. Facebook的GBDT+LR模型python代码实现

    承接上篇讲解,本文代码,讲解看上篇 目标:GBDT+LR模型 步骤:GBDT+OneHot+LR 测试数据:iris 代码: 结果比较:与直接GBDT模型的比较 目标:GBDT+LR模型 实现GBDT ...

  5. XGBOOST + LR 模型融合 python 代码

    XGBOOST + LR (XGBOOST grid search) 先留个广告,最近做一个数据挖掘的比赛,主要用的就是 xgboost,等比赛完后年前好好整理代码开源,到时候代码会比下面整份完整. ...

  6. python机器学习算法(赵志勇)学习笔记( Logistic Regression,LR模型)

    Logistic Regression(逻辑回归) 分类算法是典型的监督学习,分类算法通过对训练样本的学习,得到从样本特征到样本的标签之间的映射关系,也被称为假设函数,之后可利用该假设函数对新数据进行 ...

  7. 推荐系统实战中LR模型训练(一)

    背景: 在"批量导入数据到Redis" 中已经介绍了将得到的itema item1:score1,item2:score2-批量导入到Redis数据库中.本文的工作是运用机器学习L ...

  8. Spark MLlib中支持二次训练的模型算法

    在Spark MLlib中可以做二次训练的模型 大家好,我是心情有点低落的一拳超人 今天给大家带来我整理的Spark 3.0.1 MLlib库中可以做二次训练的模型总结,首先给大家介绍一下什么是二次训 ...

  9. 推荐系统实战中LR模型训练(二)

    背景: 上一篇推荐系统实战中LR模型训练(一) 中完成了LR模型训练的代码部分.本文中将详细讲解数据准备部分,即将文本数据数值化为稀疏矩阵的形式. 文本数据: 稀疏矩阵: 实现过程: 文本数据格式如下 ...

最新文章

  1. 任务的插入时间复杂度优化到 O(1),Timing Wheel时间轮是怎么做到的?
  2. 利用Jenkins的Pipeline实现集群自动化部署SpringBoot项目
  3. 使用PHP对数据库输入进行恶意代码清除
  4. RichEdit使用大全
  5. matplotlib直方图_你真的了解matplotlib吗?---直方图(上)
  6. Markdown编译器插入公式的数学符号及字体颜色、背景
  7. apache php 脚本,PHP脚本不在Apache服务器上执行
  8. 顺序表删除重复元素(完整代码的实现)
  9. [2013.9.6]说说Win7的Aero效果
  10. 『迷你教程』数据分析都不知道的非参数统计概论
  11. 如何批量把照片设置统一尺寸?
  12. Linux添加硬盘并挂载(超细致)
  13. spring mcv 拦截器
  14. 蚂蚁p8多少股票_蚂蚁金服上市了,小编不想努力了。
  15. Android:上海垃圾分类必备,图像识别垃圾分类app的制作
  16. 零基础学日语资料附经验分享
  17. Neural-Motifs 源码解读(3):RelModel类
  18. 并发编程指南(二)Dispatch Queue
  19. android 调用搜狗地图api,sogou地图API用法实例教程
  20. emlog新版导航源码 带用户中心

热门文章

  1. dns服务器被修改隐藏,路由器的DNS无故被修改成58.53.128.78的解决办法
  2. Verasonics系统用户主要研究方向及部分参考文献
  3. 免费的系统安全测试软件PC Security Test
  4. 六大APP分析技巧,助力皇家彩世界下载节节高
  5. if语句matlab求被三整除的数,matlab能被3或4整除语句
  6. springBoot的注解
  7. 中国图像传感器市场调研及投资前景预测分析报告2022-2027年
  8. 40岁,刚被裁,想说点啥。
  9. 新品周刊 | 杰克宝与布加迪推出独家联名腕表;特步騛速系列跑鞋全面上市
  10. python 波形包络线_一个简单的波形包络提取算法