最近在工作之余参加了一个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.Vectors
import scala.c