当前位置:   article > 正文

Spark实现逻辑回归算法和实例代码解析

spark 什么场景会用到 逻辑回归

spark mllib 机器学习

1. 逻辑回归概述

1.1 概述

逻辑回归与线性回归类似,但它不属于回归分析家族(主要为二分类),而属于分类家族,差异主要在于变量不同,因此其解法与生成曲线也不尽相同。 逻辑回归是无监督学习的一个重要算法,对某些数据与事物的归属(分到哪个类别)及可能性(分到某一类别的概率)进行评估。

1.2 使用场景
  • 在医学界,广泛应用于流行病学中,比如探索某个疾病的危险因素,根据危险因素预测疾病是否发生,与发生的概率。比如探讨胃癌,可以选择两组人群,一组是胃癌患者,一组是非胃癌患者。因变量是“是否胃癌”,这里“是”与“否”就是要研究的两个分类类别。自变量是两组人群的年龄,性别,饮食习惯,等等许多(可以根据经验假设),自变量可以是连续的,也可以是分类的。
  • 在金融界,较为常见的是使用逻辑回归去预测贷款是否会违约,或放贷之前去估计贷款者未来是否会违约或违约的概率。
  • 在消费行业中,也可以被用于预测某个消费者是否会购买某个商品,是否会购买会员卡,从而针对性得对购买概率大的用户发放广告,或代金券等等,进行精准营销。

2.逻辑回归算法原理

公式推导部分转自知乎机器学习专栏 zhuanlan.zhihu.com/p/28775274

2.1Sigmoid函数

逻辑回归本质是线性回归,只是在特征到结果的过程上加上了一层映射。即首先需要把特征进行求和,然后将求和后的结果应用于一个g(z)函数,g(z)可以将值映射到0或者是1上面,这个函数就是Sigmoid函数,公式如下:

2.2原理图

默认分类的值是0.5,超过0.5则类别为1,小于0.5类别为0

在线性回归的基础上,套用了Sigmoid函数。下面左图是一个线性的决策边界,右图是非线性的决策边界。

对于线性边界的情况,边界形式可以归纳为如下公式(1):

因此我们可以构造预测函数为公式(2):

该预测函数表示分类结果为1时的概率。因此对于输入点x,分类结果为类别1和类别0的概率分别为公式(3):

对于训练数据集,特征数据x={x1, x2, … , xm}和对应的分类数据y={y1, y2, … , ym}。构建逻辑回归模型f,最典型的构建方法便是应用极大似然估计。对公式(3)取极大似然函数,可以得到如下的公式(4):

再对公式(4)取对数,可得到公式(5):

最大似然估计就是求使l取最大值时的theta。Spark MLlib 中提供了两种方法来求这个参数,分别是梯度下降法SGD和L-BFGS。

2.3spark mllib

逻辑回归和多重线性回归有很多的相似之处。最大的区别是他们的因变量不同。这两个回归也可以统一归为广义线性模型。在 spark mllib 实现的过程中也是先定义好父类广义线性模型,然后让线性回归和逻辑回归去继承这个类,重新覆盖里面的一些参数,比如 Updater,GradientDescent等。

逻辑回归主要包含以下类:

  1. 首先是伴生对象类,LogisticRegressionWithSGD.(包含有静态train方法)
  2. 然后是逻辑回归的主类,class LogisticRegressionWithSGD,这个类继承了GeneralizedLinearAlgorithm类。同时执行了父类的run方法。不过里面的部分参数,比如说梯度下降方法,权重更新方法在LogisticRegressionWithSGD有新的定义。父类包含有optimizer.optimize方法。用于执行梯度下降。权重的优化计算调用的是runMiniBatchWithSGD。梯度的计算调用的是Gradient.compute 方法。
  3. 最后有一个逻辑回归模型,LogisticRegressionModel类。其里面也包含有predict方法来进行预测。

逻辑回归相关的spark mllib源码解析可以参考这篇文章:blog.csdn.net/stevekangpe…

2.4逻辑回归优缺点
  • 优点:计算代价低,速度快,容易理解和实现。
  • 缺点:容易欠拟合,分类和回归的精度不高

3.Spark实现逻辑回归代码解析

3.1简单例子

下面的例子展示了如何使用逻辑回归训练模型,预测结果,保存和调用模型。

  1. import org.apache.spark.SparkContext
  2. import org.apache.spark.mllib.classification.{LogisticRegressionWithLBFGS, LogisticRegressionModel}
  3. import org.apache.spark.mllib.evaluation.MulticlassMetrics
  4. import org.apache.spark.mllib.regression.LabeledPoint
  5. import org.apache.spark.mllib.linalg.Vectors
  6. import org.apache.spark.mllib.util.MLUtils
  7. // 加载训练数据
  8. val data = MLUtils.loadLibSVMFile(sc, "data/mllib/sample_libsvm_data.txt")
  9. // 切分数据,training (60%) and test (40%).
  10. val splits = data.randomSplit(Array(0.6, 0.4), seed = 11L)
  11. val training = splits(0).cache()
  12. val test = splits(1)
  13. // 训练模型
  14. val model = new LogisticRegressionWithLBFGS()
  15. .setNumClasses(10)
  16. .run(training)
  17. // Compute raw scores on the test set.
  18. val predictionAndLabels = test.map { case LabeledPoint(label, features) =>
  19. val prediction = model.predict(features)
  20. (prediction, label)
  21. }
  22. // Get evaluation metrics.
  23. val metrics = new MulticlassMetrics(predictionAndLabels)
  24. val precision = metrics.precision
  25. println("Precision = " + precision)
  26. // 保存和加载模型
  27. model.save(sc, "myModelPath")
  28. val sameModel = LogisticRegressionModel.load(sc, "myModelPath")
  29. 复制代码
3.2实例调参分析
  1. package Classification
  2. /**
  3. * LogisticRegression Algorithm
  4. * Created by wy on 2019/03/25
  5. */
  6. //spark初始化
  7. import org.apache.log4j.{Level, Logger}
  8. import org.apache.spark.{SparkConf, SparkContext}
  9. //分类数据格式处理
  10. import org.apache.spark.mllib.linalg.Vectors
  11. import org.apache.spark.mllib.regression.LabeledPoint
  12. import org.apache.spark.rdd.RDD
  13. //逻辑回归-随机梯度下降SGD
  14. import org.apache.spark.mllib.classification.LogisticRegressionWithSGD
  15. //计算Accuracy、PR、ROC和AUC
  16. import org.apache.spark.mllib.evaluation.BinaryClassificationMetrics
  17. //数据标准化
  18. import org.apache.spark.mllib.linalg.distributed.RowMatrix
  19. import org.apache.spark.mllib.feature.StandardScaler
  20. //参数调优
  21. import org.apache.spark.mllib.optimization.{Updater,SimpleUpdater,L1Updater,SquaredL2Updater}
  22. import org.apache.spark.mllib.classification.ClassificationModel
  23. object LogisticRegression {
  24. //屏蔽不必要的日志显示在终端上
  25. //Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
  26. Logger.getLogger("org.apache.spark").setLevel(Level.ERROR) //warn类信息不会显示,只显示error级别的
  27. Logger.getLogger("org.apache.eclipse.jetty.server").setLevel(Level.OFF)
  28. def main(args: Array[String]): Unit = {
  29. //初始化
  30. val conf = new SparkConf().setMaster("local").setAppName("LogisticRegression")
  31. val sc = new SparkContext(conf)
  32. /**
  33. * 数据:lr_test.txt
  34. * 该数据集包含了46个feature,1个label
  35. * */
  36. //input
  37. val sourceRDD = sc.textFile("E:\\Spark\\scala-data\\LRdata\\lr_test.txt")
  38. val data = sourceRDD.map{
  39. line =>{
  40. val arr = line.split("#")
  41. val label = arr(1).toDouble
  42. val features = arr(0).split(",").map(_.toDouble)
  43. LabeledPoint(label,Vectors.dense(features)) //创建一个稠密向量
  44. }
  45. }
  46. /**
  47. * 创建一个稀疏向量(第一种方式)
  48. * val sv1: Vector = Vector.sparse(3, Array(0,2), Array(1.0,3.0));
  49. * 创建一个稀疏向量(第二种方式)
  50. * val sv2 : Vector = Vector.sparse(3, Seq((0,1.0),(2,3.0)))
  51. *
  52. * 对于稠密向量:很直观,你要创建什么,就加入什么,其函数声明为Vector.dense(values : Array[Double])
  53. * 对于稀疏向量,当采用第一种方式时,3表示此向量的长度,第一个Array(0,2)表示的索引,第二个Array(1.0, 3.0)
  54. * 与前面的Array(0,2)是相互对应的,表示第0个位置的值为1.0,第2个位置的值为3
  55. *
  56. * 对于稀疏向量,当采用第二种方式时,3表示此向量的长度,后面的比较直观,Seq里面每一对都是(索引,值)的形式。
  57. * */
  58. data.cache() //缓存
  59. val Array(trainData, testData) = data.randomSplit(Array(0.8,0.2),seed = 11L)
  60. trainData.cache()
  61. testData.cache()
  62. val numData = data.count
  63. val numTrainData = trainData.count
  64. val numTestData = testData.count
  65. println("原始数据量:",numData) //40530
  66. println("训练数据量:",numTrainData) //32503
  67. println("测试数据量:",numTestData) //8027
  68. val stepSize = 0.1 //迭代步长,默认为1.0
  69. val numIterations = 50 //迭代次数,默认为100
  70. val miniBatchFraction = 1.0 //每次迭代参与计算的样本比例,默认为1.0
  71. /** 训练逻辑回归模型 */
  72. val lrModel = LogisticRegressionWithSGD.train(data, numIterations, stepSize, miniBatchFraction)
  73. //打印模型权重值
  74. val res = lrModel.weights.toArray
  75. println("权重值列表如下:")
  76. res.foreach(println)
  77. println("----------------------拟合预测结果--------------------")
  78. //预测值与真实值比较
  79. //val testPoint = testData.first
  80. //val testPredict = lrModel.predict(testPoint.features)
  81. //testPredict: Double = 0.0
  82. //val testTrueLabel = testPoint.label
  83. //testTrueLabel: Double = 0.0
  84. /** 预测的正确率计算 */
  85. val lrTestCorrect = data.map { x =>
  86. if (lrModel.predict(x.features)== x.label) 1 else 0
  87. }.sum
  88. //预测正确率
  89. val lrAccuracy = lrTestCorrect / numData
  90. println(f"Accuracy:${lrAccuracy * 100}%2.3f%%")
  91. // Accuracy: 97.839%
  92. /** 计算 准确率-召回律(PR曲线) ROC曲线的面积(AUC)
  93. * 1.准确率通常用于评价结果的质量,定义为真阳性的数目除以真阳性和假阳性的总数,其中真阳性值被预测的类别为1的样本,
  94. * 假阳性是错误预测为1的样本。
  95. * 2.召回率用来评价结果的完整性,定义为真阳性的数目除以真阳性和假阳性的和,其中假阳性是类别为1却被预测为0的样本。
  96. * 通常高准确率对应着低召回率
  97. * 3.ROC曲线与PR曲线类似,是对分类器的真阳性率-假阳性率的图形化解释。
  98. * */
  99. val metrics = Seq(lrModel).map{ model =>
  100. val scoreAndLabels = data.map{ x =>
  101. (model.predict(x.features), x.label)
  102. }
  103. val metrics = new BinaryClassificationMetrics(scoreAndLabels)
  104. (model.getClass.getSimpleName, metrics.areaUnderPR(), metrics.areaUnderROC())
  105. }
  106. //val allMetrics = metrics ++ nbMetrics ++ dtMetrics
  107. metrics.foreach{ case (model, pr, roc) =>
  108. println(f"model:$model\n" +
  109. f"Area under PR: ${pr * 100.0}%2.3f%%\n" +
  110. f"Area under ROC: ${roc * 100.0}%2.3f%%")
  111. }
  112. //Accuracy:97.839%
  113. //model:LogisticRegressionModel
  114. //Area under PR: 51.081%
  115. //Area under ROC: 50.000%
  116. /** 改进模型性能以及参数调优 */
  117. //特征标准化
  118. //将特征变量用(RowMatrix类)表示成MLlib中的(分布矩阵)
  119. val vectors = data.map(x => x.features)
  120. val matrix = new RowMatrix(vectors)
  121. val matrixSummary = matrix.computeColumnSummaryStatistics() //计算矩阵每列的统计特性
  122. println("----------------------特征标准化----------------------")
  123. println("mean: ",matrixSummary.mean) //输出每列均值
  124. println("max: ",matrixSummary.max) //每列最大值
  125. println("variance: ",matrixSummary.variance) //矩阵每列方差
  126. println("numNonzeros:",matrixSummary.numNonzeros) //每列非0项的数目
  127. println("normL2: ",matrixSummary.normL2) //L2范数:向量各元素的平方和然后求平方根
  128. /**为使得数据更符合模型的假设,对每个特征进行标准化,使得每个特征是(0均值)和(单位标准差)*/
  129. //做法:对(每个特征值)减去(列的均值),然后(除以)列的(标准差)以进行缩放
  130. val scaler = new StandardScaler(withMean = true, withStd = true).fit(vectors) //将向量传到转换函数
  131. val scaledData = data.map(x => LabeledPoint(x.label, scaler.transform(x.features)))
  132. //println(data.first.features)
  133. println("标准化后的特征第一行结果:")
  134. println(scaledData.first.features)
  135. //[0.0016544159298287912,0.0273303020874253,0.008141541536538578,0.07992614623509364,...
  136. //为验证第一个特征已经应用标准差公式被转换了,用 第一个特征(减去)其均值,然后(除以)标准差--方差的平方根
  137. println("验证第一个特征是否正确")
  138. println((data.first.features(0) - matrixSummary.mean(0)) / math.sqrt(matrixSummary.variance(0)))
  139. //0.0016544159298287912 验证正确
  140. /** 现在使用标准化的数据重新训练模型逻辑回归-(决策树和朴素贝叶斯不受特征标准化的影响)*/
  141. //val Array(scaledTrainData, scaledTestData) = scaledData.randomSplit(Array(0.8,0.2),seed = 11L)
  142. val scaledLrModel = LogisticRegressionWithSGD.train(scaledData,numIterations,stepSize,miniBatchFraction)
  143. val scaledLrCorrect = scaledData.map{ x =>
  144. if (scaledLrModel.predict(x.features) == x.label) 1 else 0
  145. }.sum
  146. val scaledLrTestAccuracy = scaledLrCorrect / numData
  147. val lrPredictionsVsTrue = scaledData.map{ x =>
  148. (scaledLrModel.predict(x.features), x.label)
  149. }
  150. val lrMetricsScaled = new BinaryClassificationMetrics(lrPredictionsVsTrue)
  151. val lrPr = lrMetricsScaled.areaUnderPR() //lrPr: Double = 0.27532
  152. val lrPoc = lrMetricsScaled.areaUnderROC() //lrPoc: Double = 0.58451
  153. println("------------标准化后数据训练、拟合和结果----------------")
  154. println(f"Model:${scaledLrModel.getClass.getSimpleName}\n" +
  155. f"Accuracy: ${scaledLrTestAccuracy * 100}%2.3f%%\n" +
  156. f"Area under PR: ${lrPr * 100}%2.3f%%\n" +
  157. f"Area under ROC:${lrPoc * 100}%2.3f%%")
  158. //Model:LogisticRegressionModel
  159. //Accuracy: 64.974%
  160. //Area under PR: 35.237%
  161. //Area under ROC:65.355%
  162. /** 模型参数调优MLlib线性模型优化技术:SGD和L-BFGS(只在逻辑回归中使用LogisticRegressionWithLBFGS)*/
  163. //线性模型
  164. //定义训练调参辅助函数,根据给定输入训练模型 (输入, 则正则化参数, 迭代次数, 正则化形式, 步长)
  165. def trainWithParams(input: RDD[LabeledPoint], regParam: Double, numIterations: Int,
  166. updater: Updater, stepSize: Double) = {
  167. val lr =new LogisticRegressionWithSGD //逻辑回归也可以用LogisticRegressionWithLBFGS
  168. lr.optimizer
  169. .setNumIterations(numIterations) //迭代次数
  170. .setStepSize(stepSize) //步长
  171. .setRegParam(regParam) //则正则化参数
  172. .setUpdater(updater) //正则化形式
  173. lr.run(input) //输入训练数据RDD
  174. }
  175. //定义第二个辅助函数,label为需要调试的参数,data:输入预测的数据,model训练的模型
  176. def createMetrics(label: Double, data: RDD[LabeledPoint], model: ClassificationModel) = {
  177. val scoreAndLabels = data.map { point =>
  178. (model.predict(point.features),point.label) //(predicts,label)
  179. }
  180. val metrics = new BinaryClassificationMetrics(scoreAndLabels)
  181. (label, metrics.areaUnderROC()) //计算AUC
  182. }
  183. //加快多次模型训练速度, 缓存标准化后的数据
  184. scaledData.cache()
  185. println("------------------标准化后数据调参---------------------")
  186. //1迭代次数
  187. val iterateResults = Seq(1, 5, 10, 50, 100).map { param =>
  188. //训练
  189. val model = trainWithParams(scaledData, 0.0, param, new SimpleUpdater, 1.0)
  190. //拟合,计算AUC
  191. createMetrics(param, scaledData, model)
  192. }
  193. println("1迭代次数numIterations:Seq(1, 5, 10, 50, 100)")
  194. iterateResults.foreach { case (param, auc) => println(f"$param iterations, AUC = ${auc * 100}%2.2f%%")}
  195. //1 iterations, AUC = 64.50%
  196. //5 iterations, AUC = 67.07%
  197. //10 iterations, AUC = 67.10%
  198. //50 iterations, AUC = 67.56%
  199. //100 iterations, AUC = 67.56%
  200. var maxIterateAuc = 0.0
  201. var bestIterateParam = 0
  202. for(x <- iterateResults){
  203. //println(x)
  204. if(x._2 > maxIterateAuc){
  205. maxIterateAuc = x._2
  206. bestIterateParam = x._1.toInt
  207. }
  208. }
  209. println("max auc: " + maxIterateAuc + " best numIterations param: " + bestIterateParam)
  210. //2步长 大步长收敛快,太大可能导致收敛到局部最优解
  211. val stepResults = Seq(0.001, 0.01, 0.1, 1.0, 10.0).map { param =>
  212. val model = trainWithParams(scaledData, 0.0, bestIterateParam, new SimpleUpdater, param)
  213. createMetrics(param, scaledData, model)
  214. }
  215. println("\n2步长stepSize:Seq(0.001, 0.01, 0.1, 1.0, 10.0)")
  216. stepResults.foreach { case (param, auc) => println(f"$param stepSize, AUC = ${auc * 100}%2.2f%%")}
  217. //0.001 step size, AUC = 64.50%
  218. //0.01 step size, AUC = 64.50%
  219. //0.1 step size, AUC = 65.36%
  220. //1.0 step size, AUC = 67.56%
  221. //10.0 step size, AUC = 50.20%
  222. var maxStepAuc = 0.0
  223. var bestStepParam = 0.0
  224. for(x <- stepResults){
  225. //println(x)
  226. if(x._2 > maxStepAuc){
  227. maxStepAuc = x._2
  228. bestStepParam = x._1
  229. }
  230. }
  231. println("max auc: " + maxStepAuc + " best stepSize param: " + bestStepParam)
  232. //3.1正则化参数,默认值为0.0,L1正则new L1Updater
  233. val regL1Results = Seq(0.0, 0.001, 0.01, 0.1, 1.0, 10.0).map{ param =>
  234. val model = trainWithParams(scaledData, param, bestIterateParam, new L1Updater, bestStepParam)
  235. createMetrics(param, scaledData, model)
  236. }
  237. println("\n3.1 L1正则化参数regParam:Seq(0.0, 0.001, 0.01, 0.1, 1.0, 10.0)")
  238. regL1Results.foreach{ case (param,auc) => println(f"$param regParam L1, AUC = ${auc * 100}%2.2f%%")}
  239. //regParam L1 = 0.0, AUC = 67.56%
  240. //regParam L1 = 0.001, AUC = 66.43%
  241. //regParam L1 = 0.01, AUC = 65.74%
  242. //regParam L1 = 0.1, AUC = 50.00%
  243. //regParam L1 = 1.0, AUC = 50.00%
  244. //regParam L1 = 10.0, AUC = 50.00%
  245. var maxRegL1Auc = 0.0
  246. var bestRegL1Param = 0.0
  247. for(x <- regL1Results){
  248. //println(x)
  249. if(x._2 > maxRegL1Auc){
  250. maxRegL1Auc = x._2
  251. bestRegL1Param = x._1
  252. }
  253. }
  254. println("max auc: " + maxRegL1Auc + " best L1regParam: " + bestRegL1Param)
  255. //3.2正则化参数:默认值为0.0,L2正则new SquaredL2Updater
  256. val regL2Results = Seq(0.0, 0.001, 0.01, 0.1, 1.0, 10.0).map{ param =>
  257. val model = trainWithParams(scaledData, param, bestIterateParam, new SquaredL2Updater, bestStepParam)
  258. createMetrics(param, scaledData, model)
  259. }
  260. println("\n3.2 L2正则化参数regParam:Seq(0.0, 0.001, 0.01, 0.1, 1.0, 10.0)")
  261. regL2Results.foreach{ case (param,auc) => println(f"$param regParam L2, AUC = ${auc * 100}%2.2f%%")}
  262. //regParam L2 = 0.0 , AUC = 67.56%
  263. //regParam L2 = 0.001 , AUC = 67.56%
  264. //regParam L2 = 0.01 , AUC = 67.43%
  265. //regParam L2 = 0.1 , AUC = 67.14%
  266. //regParam L2 = 1.0 , AUC = 66.60%
  267. //regParam L2 = 10.0 , AUC = 36.76%
  268. var maxRegL2Auc = 0.0
  269. var bestRegL2Param = 0.0
  270. for(x <- regL2Results){
  271. //println(x)
  272. if(x._2 > maxRegL2Auc){
  273. maxRegL2Auc = x._2
  274. bestRegL2Param = x._1
  275. }
  276. }
  277. println("max auc: " + maxRegL2Auc + " best L2regParam: " + bestRegL2Param)
  278. //4正则化形式:默认为new SimpleUpdater 正则化系数无效,前两个参数调参后最优AUC为maxStepAuc
  279. //则,3.1和3.2的最优AUC与maxStepAuc比较,较大的则为最优正则化形式
  280. var bestRegParam = 0.0
  281. var bestUpdaterID = 0
  282. if(maxStepAuc >= maxRegL1Auc ){
  283. if(maxStepAuc >= maxRegL2Auc){
  284. bestUpdaterID = 0
  285. bestRegParam = 0.0
  286. }
  287. else {
  288. bestUpdaterID = 2
  289. bestRegParam = bestRegL2Param
  290. }
  291. }
  292. else {
  293. if(maxRegL2Auc >= maxRegL1Auc){
  294. bestUpdaterID = 2
  295. bestRegParam = bestRegL2Param
  296. }
  297. else {
  298. bestUpdaterID = 1
  299. bestRegParam = bestRegL1Param
  300. }
  301. }
  302. val Updaters = Seq(new SimpleUpdater, new L1Updater, new SquaredL2Updater)
  303. val bestUpdater = Updaters(bestUpdaterID)
  304. //最优参数:
  305. println("------------------更新模型训练参数---------------------")
  306. println(f"best numIterations param: $bestIterateParam\n" +
  307. f"best stepSize param: $bestStepParam\n" +
  308. f"best regParam: $bestRegParam\n" +
  309. f"best regUpdater: $bestUpdater\n"
  310. )
  311. // numIterations:50
  312. // stepSize:1.0
  313. // regParam:0.0
  314. // updater:new SimpleUpdater
  315. /** 数据标准化、参数调优后,再次训练逻辑回归模型,可以用28分训练测试 */
  316. val upDateLrModel = trainWithParams(scaledData, bestRegParam, bestIterateParam, bestUpdater, bestStepParam)
  317. //保存和加载模型
  318. upDateLrModel.save(sc, "E:\\Spark\\scala-data\\Model")
  319. val newModel = LogisticRegressionModel.load(sc, "E:\\Spark\\scala-data\\Model")
  320. //打印模型权重值
  321. val newRes = newModel.weights.toArray
  322. println("参数调优后特征权重值列表如下:")
  323. newRes.foreach(println)
  324. }
  325. }
  326. 复制代码
3.3本地运行结果
  1. ------------标准化后数据训练、拟合和结果----------------
  2. Model:LogisticRegressionModel
  3. Accuracy: 64.974%
  4. Area under PR: 35.237%
  5. Area under ROC:65.355%
  6. ------------------标准化后数据调参---------------------
  7. 1迭代次数numIterations:Seq(1, 5, 10, 50, 100)
  8. 1.0 iterations, AUC = 64.50%
  9. 5.0 iterations, AUC = 67.07%
  10. 10.0 iterations, AUC = 67.10%
  11. 50.0 iterations, AUC = 67.56%
  12. 100.0 iterations, AUC = 67.56%
  13. max auc: 0.6756122825453876 best numIterations param: 50
  14. 2步长stepSize:Seq(0.001, 0.01, 0.1, 1.0, 10.0)
  15. 0.001 stepSize, AUC = 64.50%
  16. 0.01 stepSize, AUC = 64.50%
  17. 0.1 stepSize, AUC = 65.36%
  18. 1.0 stepSize, AUC = 67.56%
  19. 10.0 stepSize, AUC = 50.20%
  20. max auc: 0.6756122825453876 best stepSize param: 1.0
  21. 3.1 L1正则化参数regParam:Seq(0.0, 0.001, 0.01, 0.1, 1.0, 10.0)
  22. 0.0 regParam L1, AUC = 67.56%
  23. 0.001 regParam L1, AUC = 66.43%
  24. 0.01 regParam L1, AUC = 65.74%
  25. 0.1 regParam L1, AUC = 50.00%
  26. 1.0 regParam L1, AUC = 50.00%
  27. 10.0 regParam L1, AUC = 50.00%
  28. max auc: 0.6756122825453876 best L1regParam: 0.0
  29. 3.2 L2正则化参数regParam:Seq(0.0, 0.001, 0.01, 0.1, 1.0, 10.0)
  30. 0.0 regParam L2, AUC = 67.56%
  31. 0.001 regParam L2, AUC = 67.56%
  32. 0.01 regParam L2, AUC = 67.43%
  33. 0.1 regParam L2, AUC = 67.14%
  34. 1.0 regParam L2, AUC = 66.60%
  35. 10.0 regParam L2, AUC = 36.76%
  36. max auc: 0.6756122825453876 best L2regParam: 0.0
  37. ------------------更新模型训练参数---------------------
  38. best numIterations param: 50
  39. best stepSize param: 1.0
  40. best regParam: 0.0
  41. best regUpdater: org.apache.spark.mllib.optimization.SimpleUpdater@4b6fc615
  42. ---------------调用模型输出特征权重值------------------
  43. -0.014912705104766975
  44. -0.010300917189488083
  45. 0.0037483953352201067
  46. -1.0105291799106376E-4
  47. 0.08089240228856116
  48. ···
  49. 复制代码

参考文献:

Spark MLlib 源代码解析之逻辑回归LogisticRegression

知乎专栏-深入机器学习系列3-逻辑回归

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/659456
推荐阅读
相关标签
  

闽ICP备14008679号