线性回归和逻辑回归的区别_Spark实现线性回归与逻辑回归算法
一.线性回归算法简介
线性回归(Linear Regression)是利用线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合。只有一个自变量的情况称为一元线性回归,多于一个自变量情况的叫做多元线性回归。对于参数的求解,需要对函数进行评估以检测是否为最优。一般这个函数被称为损失函数(loss function),用来描述算法好坏的程度。
![](/assets/blank.gif)
计算损失函数是线性回归的基础,计算损失函数一般使用最小二乘法或梯度下降法。
![](/assets/blank.gif)
二.最小二乘法
最小二乘法【最小平方法】是一种数学优化技术。它通过最小化误差的平方来寻找数据的最佳函数匹配。利用最小二乘法可以简便地求出结果,并使得这些求得的结果与实际数据之间误差的平方和最小 。
在Spark ML中,将训练特征转换为矩阵,结果转换为向量,误差函数不变。最小二乘法要求矩阵是列满秩的,而且求矩阵的逆比较慢。
关键概念解释:
- 线性独立【线性无关】:指一组向量中任意一个向量都不能由其它一个或几个向量线性表示。一个矩阵的列秩是矩阵的线性无关的列向量的极大数目,行秩与其类似。矩阵的列秩和行秩总是相等的,可以称为矩阵的秩。
三.梯度下降法
参考头条文章:Python实现随机&批量梯度下降算法
四.线性回归算法代码实现
package org.com.tl.spark.mllibimport org.apache.log4j.{Level, Logger}import org.apache.spark.ml.regression.LinearRegressionimport org.apache.spark.sql.SparkSession/** * Created by zhen on 2020/11/25. */object LinearRegressionAnalyse { /** * 设置日志级别 */ Logger.getLogger("org").setLevel(Level.WARN) def main(args: Array[String]) { val spark = SparkSession.builder().appName("LinearRegressionAnalyse") .master("local[2]") .getOrCreate() val sc = spark.sparkContext // 加载训练数据 val allData = spark.read.format("libsvm") .load("D:/spark-2.4.3/data/mllib/sample_linear_regression_data.txt") allData.count() val weights = Array(0.8,0.2) //设置训练集和测试集的比例 val split_data = allData.randomSplit(weights) // 拆分训练集和测试集 //随机取样,训练模型 val training = split_data(0) //随机取样,预测数据 val testing = split_data(1) // 创建线性回归模型 val lr = new LinearRegression() .setMaxIter(10) // 最大迭代次数 .setRegParam(0.3) // 正则化参数 .setElasticNetParam(0.8) // 弹性系数 // 训练模型 val lrModel = lr.fit(training) //各个维度的参数值,类似于一维函数y=ax+b中的a println(s"Coefficients: ${lrModel.coefficients}") println(s"Intercept: ${lrModel.intercept}") // 截距 // 模型评估 val trainingSummary = lrModel.summary println(s"numIterations: ${trainingSummary.totalIterations}") println(s"RMSE: ${trainingSummary.rootMeanSquaredError}") // RMSE:均方根差 println(s"r2: ${trainingSummary.r2}") // r2:判定系数,也称为拟合优度,越接近1越好 // 预测 val predictions = lrModel.transform(testing) predictions.show() sc.stop() }}
执行结果:
![](/assets/blank.gif)
![](/assets/blank.gif)
分析结果可以看出,预测的结果是很不理想的,要分析原因,首先看训练数据:
![](/assets/blank.gif)
从训练数据中可以看出,首先是训练数据的范围差异较大,第一列的结果值与vector向量参数值之间差异尤为明显;可以使用归一化的方式把数据都转换到0~1之间,实现的代码如下:
/** * 最大值最小值 */val max = allData.select("label").rdd.map(row => row.getAs[Double]("label")).collect().maxval min = allData.select("label").rdd.map(row => row.getAs[Double]("label")).collect().minval broad_max = sc.broadcast(max)val broad_min = sc.broadcast(min)/** * 定义自定义函数,实现归一化 */def normalization(label : Double) = { val max = broad_max.value val min = broad_min.value (label-min) / (max - min)}val addNormalization = spark.udf.register("normalization", normalization _) val normAllData = allData.withColumn("label", addNormalization(allData("label")))normAllData.count()
五.逻辑回归算法简介
逻辑回归是一种广义线性回归(generalized linear model),因此与多元线性回归分析有很多相同之处。它们的模型形式基本上相同,其区别在于他们的因变量不同,多元线性回归直接将函数结果作为因变量。而逻辑回归则通过函数L将函数结果对应一个隐状态p,然后根据p与1-p的大小决定因变量的值。如果L是逻辑函数,就是逻辑回归,如果L是多项式函数就是多项式回归。
![](/assets/blank.gif)
六.逻辑回归算法代码实现
package org.com.tl.spark.mllibimport org.apache.log4j.{Level, Logger}import org.apache.spark.ml.classification.LogisticRegressionimport org.apache.spark.ml.linalg.Vectorsimport org.apache.spark.sql.SparkSession/** * Created by zhen on 2020/11/25. */object LogisticRegressionAnalyse { /** * 设置日志级别 */ Logger.getLogger("org").setLevel(Level.WARN) def main(args: Array[String]) { val spark = SparkSession.builder() .appName("LogisticRegressionAnalyse") .master("local[2]") .getOrCreate() // 加载训练数据 val allData = spark.read.format("libsvm") .load("D:/spark-2.4.3/data/mllib/sample_libsvm_data.txt") allData.count() val weights = Array(0.8,0.2) //设置训练集和测试集的比例 val split_data = allData.randomSplit(weights) // 拆分训练集和测试集 // 创建逻辑回归对象 val lr = new LogisticRegression() .setMaxIter(10) .setRegParam(0.3) .setElasticNetParam(0.8) // 训练模型 val lrModel = lr.fit(split_data(0)) lrModel.transform(split_data(1)) .select("label", "features", "probability", "prediction") .show() val trainingSummary = lrModel.summary // 评估 val accuracy = trainingSummary.accuracy val falsePositiveRate = trainingSummary.weightedFalsePositiveRate // 失败率 val truePositiveRate = trainingSummary.weightedTruePositiveRate // 正确率 val fMeasure = trainingSummary.weightedFMeasure // 查全率 val precision = trainingSummary.weightedPrecision // 查准率 val recall = trainingSummary.weightedRecall // 召回率 println(s"Accuracy: $accuracyFPR: $falsePositiveRateTPR: $truePositiveRate" + s"F-measure: $fMeasurePrecision: $precisionRecall: $recall") //关闭spark spark.stop() }}
执行结果:
![](/assets/blank.gif)
![](/assets/blank.gif)
从结果上来看还是令人满意的,先去看看训练数据:
![](/assets/blank.gif)
相比于上面线性回归的连续型数据,使用逻辑回归【其实是逻辑分类】对离散型数据做二分类是比较容易的,得到较高的准确率是很正常的表现【毕竟蒙还有50%的准确率。。。】。
七.总结
线性回归算法做回归预测不是一个很好的选择,线性回归一般应用于简单的逻辑,训练数据的维度较小;多维度的分析一般使用逻辑回归或神经网络;下面附上基本算法图鉴:
![](/assets/blank.gif)
线性回归和逻辑回归的区别_Spark实现线性回归与逻辑回归算法相关推荐
- Lesson 4.1-4.2 逻辑回归模型构建与多分类学习方法逻辑回归参数估计
Lesson 4.1 逻辑回归模型构建与多分类学习方法 首先我们来讨论关于逻辑回归的基本原理,当然,在此过程中,我们也将进一步补充机器学习数学理论基础. 逻辑回归的基本原理,从整体上来划分可以分为两个 ...
- 从LASSO回归到结构性稀疏:线性回归的正则项都带来了什么?
©作者 | 黄秋实 单位 | 香港中文大学(深圳) 研究方向 | 智能电网 本文我们主要关注于以下问题: 1. LASSO Regression 是什么? 2. 稀疏性的意义是什么?(从数学上证明) ...
- 分类和回归的区别和联系
先简单的说下吧,下面给出实际例子 类和回归的区别在于输出变量的类型. 定量输出称为回归,或者说是连续变量预测: 定性输出称为分类,或者说是离散变量预测. 举个例子: 预测明天的气温是多少度,这是一个回 ...
- 时间序列与因素回归的区别
浅谈时间序列与因素回归 这篇想谈谈时间序列和因素回归的关系,什么时候两个可以相互替代,什么时候不能相互替代. 什么是时间序列?时间序列(或称动态数列)是指将同一统计指标的数值按其发生的时间先后顺序排列 ...
- SVM与Logistic回归的区别
SVM与Logistic回归的区别 1.相同点 1.1 都是分类算法 1.2 如果不考虑核函数,LR和SVM都是线性分类算法 1.3 LR和SVM都是监督学习算法. 1.4 LR和SVM都是判别模型. ...
- R语言glm拟合logistic回归模型实战:基于glm构建逻辑回归模型及模型系数统计显著性分析、每个预测因子对响应变量的贡献
R语言glm拟合logistic回归模型实战:基于glm构建逻辑回归模型及模型系数统计显著性分析.每个预测因子对响应变量的贡献 目录
- 分类(classification)是认知的基础、分类步骤及主要算法、分类与回归的区别、分类过程
分类(classification)是认知的基础.分类步骤及主要算法.分类与回归的区别.分类过程 目录
- logistic回归 简介_金融专业进!逻辑回归模型简述
逻辑回归模型 逻辑回归属于机器学习中的较为经典的模型,在很多金融专业的实证部分都会用到逻辑回归.接下来分成以下几个部分对逻辑回归模型进行介绍. 1. 模型简介 逻辑回归中的"逻辑" ...
- [机器学习-实践篇]学习之线性回归、岭回归、Lasso回归,tensorflow实现的线性回归
线性回归.岭回归.Lasso回归 前言 1.线性回归 2. 岭回归 3. Lasso回归 4. tensorflow利用梯度下降实现的线性回归 前言 本章主要介绍线性回归.岭回归.Lasso回归,te ...
最新文章
- JAVA对象转为Java String的几种常用方法
- python绘图颜色代码_python matplotlib-颜色代码+ve和-ve值在绘图中
- phpmailer 私密抄送_使用 phpmailer 发送邮件,支持抄送、密送和发送附件
- 设计模式C++实现(4)——单例模式
- 进度条上的小圆点怎么做_傲视网:【AE教程】如何制作环形进度条(第一讲)...
- cmd如何默认以管理身份运行
- 巧用计算机辅助培智生,计算机辅助设计答案
- xwpython aui 子窗口-Python/wxPython:AUI管理器,防止面板离开Fram
- 关于医学影像中的轴位面(横断面)、冠状面、矢状面的解释
- poi操作Excel给列设置下拉菜单(数据验证)
- TTL转RS485电路
- 训练深度学习模型时电脑自动重启
- 简述利用PE系统破解Windows密码
- 真!一文搞定 HTTP 和 HTTPS
- Java IO基础知识
- 同余原理与丢番图方程
- 干货 | 手把手教你iOS自定义视频压缩
- java 6u45 no sni 2_sjscxz.taobao.com
- choose (when, otherwise)
- Windows 7 系统下载安装的所有方法