1. 逻辑回归
逻辑回归(Logistic Regression)是预测分类的流程方法,它是 广义线性模型 的一个特例来预测结果分类的可能性。在spar.ml 逻辑回归中可以使用二项式逻辑回归来预测二进制结果,也可以通过多项式逻辑回归来预测多类结果。使用参数在这两种算法之间进行选择,或者不进行设置,Spark将自行推断选择合适的算法。
通过将family 参数设置为“multinomial” 可以将多项逻辑回归用于二进制分类。它将产生两组系数和两个截距。
当在具有常量非零列的数据集上对LogisticRegressionModel进行拟合时,Spark MLlib为常数非零列输出零系数。此行为与R glmnet 相同,但与LIBSVM不同。
2. 二项式逻辑回归
2.1 算法介绍
二项式逻辑回归(Binomial logistic regression)
线性最小二乘法是回归问题的最常见公式。它是 Generalized Linear models(广义线性模型) 的一个特殊应用以预测结果概率
它是一个线性模型如下列方程所示, 其中损失函数为逻辑损失: $L(w;x,y):=log(1 + exp(-yw^Tx))$
对于二分类问题,算法产出一个二值逻辑回归模型,给定一个新数据,由 x 表示,则模型通过下列逻辑方程来预测:
$f(z) = \frac{1}{1+e^{-z}}$
其中 $z=w^Tx$ ,默认情况下,如果 $f(w^Tx)> 0.5$ , 结果为正,否则为负。和线性 SVMs 不同,逻辑回归的原始输出有概率解释(x为正的概率)
2.2 参数列表
| 参数名称 |
类型 |
说明 |
| elasticNetParam |
双精度 |
弹性网格混合参数, 范围[0,1] |
| family |
|
用于系列名称的参数,它是模型中使用的标签分布的描述默认为“auto” auto:根据类的数量自动选择系列: 如果numClasses == 1 || numClasses == 2,则设置为“binomial”。 否则,设置为“multinomial” binomial:二元逻辑回归。 multinomial:没有旋转的多项logistic(softmax)回归 |
| featuresCol |
字符串 |
特征列名 |
| fitlntercept |
布尔值 |
是否训练拦截对象 |
| labelCol |
字符串 |
标签列名 |
| maxlter |
整数 |
最多迭代次数(>=0) |
| predictionCol |
字符串 |
预测结果列名 |
| probabilityCol |
字符串 |
用以预测类别条件概率的列名 |
| regParam |
双精度 |
正则化参数 (>=0) |
| standardization |
布尔值 |
训练模型前是否需要对训练特征进行标准化处理 |
| threshold |
双精度 |
二分类预测的阈值, 范围[0,1] |
| thresholds |
双精度 |
多分类预测的阈值, 以调整预测结果在各个类别的概率 |
| tol |
双精度 |
迭代算法的收敛性 |
| weightCol |
字符串 |
列权重 |
2.3 代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
| package hnbian.spark.ml.algorithms.classification import hnbian.spark.utils.{FileUtils, SparkUtils} import org.apache.spark.ml.classification.LogisticRegression import org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator
object LogisticRegression extends App{ val spark = SparkUtils.getSparkSession("LogisticRegression",4) import spark.implicits._ val filePath = FileUtils.getFilePath("sample_libsvm_data.txt") val training = spark.read.format("libsvm").load(filePath) val lr = new LogisticRegression() .setMaxIter(10) .setRegParam(0.3) .setElasticNetParam(0.8) .setThreshold(1.0) val lrModel = lr.fit(training) println(s"Coefficients: ${lrModel.coefficients} \nIntercept: ${lrModel.intercept}")
val trainingSummary = lrModel.binarySummary val objectiveHistory = trainingSummary.objectiveHistory objectiveHistory.foreach(loss => println(loss))
val roc = trainingSummary.roc roc.show()
println(s"areaUnderROC: ${trainingSummary.areaUnderROC}") val fMeasure = trainingSummary.fMeasureByThreshold fMeasure.show(false)
import org.apache.spark.sql.functions.max val maxFMeasure = fMeasure.select(max("F-Measure")).head().getDouble(0) println(s"maxFMeasure: ${maxFMeasure}") val bestThreshold = fMeasure.where($"F-Measure" === maxFMeasure) .select("threshold").head().getDouble(0) lrModel.setThreshold(bestThreshold) val predictions = lrModel.transform(training) predictions.select("label","prediction","rawPrediction","probability").show(20,false)
val evaluator = new MulticlassClassificationEvaluator() .setLabelCol("label") .setPredictionCol("prediction") .setMetricName("accuracy") val accuracy = evaluator.evaluate(predictions) println(s"准确率:${accuracy}") println("Test Error = " + (1.0 - accuracy)) spark.stop() }
|
3 多项式逻辑回归
3.1 算法说明
多项式逻辑回归 (Multinomial logistic regression)
通过多项Logistic(softmax)回归支持多类分类。
在多项Logistic回归中,该算法产生K个系数集,或K×J矩阵,其中K是结果类的数量,J是特征数。 如果算法与截距项拟合,则截距的长度K向量是可用的。
多项式系数可用作系数矩阵,截距可作为interceptVector使用。
不支持用多项式族训练的逻辑回归模型的系数和截距方法。 改用系数矩阵和interceptVector。
使用softmax函数对结果类k∈1,2,…,K的条件概率进行建模。
3.2 代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
| package hnbian.spark.ml.algorithms.classification import org.apache.spark.ml.classification.LogisticRegression import org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator
object LogisticRegressionMulticlass extends App { import hnbian.spark.utils.SparkUtils val spark = SparkUtils.getSparkSession("LogisticRegressionMulticlass",4) import hnbian.spark.utils.FileUtils val filePath = FileUtils.getFilePath("sample_multiclass_classification_data.txt") val training = spark .read .format("libsvm") .load(filePath) val lr = new LogisticRegression() .setMaxIter(10) .setRegParam(0.3) .setElasticNetParam(0.8) val lrModel = lr.fit(training) println(s"Coefficients: \n${lrModel.coefficientMatrix}")
println(s"Intercepts: ${lrModel.interceptVector}") val predictions = lrModel.transform(training) predictions.show(false) predictions.select("label","prediction","probability","rawPrediction","features").show(false)
val evaluator = new MulticlassClassificationEvaluator() .setLabelCol("label") .setPredictionCol("prediction") .setMetricName("accuracy") val accuracy = evaluator.evaluate(predictions) println(s"准确率:${accuracy}") println("Test Error = " + (1.0 - accuracy)) spark.stop() }
|