目录
逻辑回归模型是离散数据(二次分布)
1. 数据的种类
连续性数据:给定一个区间,可以取区间内任意一实数——工资(连续)
离散型数据:给定一个区间,只能取区间有限的实数值——性别(男女)
正太线性模型(基于正太分布,连续分布),只能对连续性数据响应,不能对离散的数据响应。
2. Sigmoid函数
Sigmoid函数常被用作神经网络的阈值函数,将变量(z)映射到0,1之间。
Sigmoid函数的图像:
3. 案列 :预测是否会发送交通事故
文件内容
我们收集了一组交通事故的统计文件,其中:
1)age(年龄 数值型)
2)vision(视力状况,分类型,1表示好,0表示有问题)
3)drive(驾车教育,分类型,1表示参加过驾车教育,0表示没有)
4)accident(去年是否出过事故,1表示出过事故,0表示没有)
第4列是因变量,其它3列是特征。
age vision drive accident
17 1 1 1
44 0 0 1
48 1 0 1
55 0 0 1
75 1 1 1
35 0 1 0
42 1 1 0
57 0 0 0
28 0 1 0
20 0 1 0
38 1 0 0
45 0 1 0
47 1 1 0
52 0 0 0
55 0 1 0
68 1 0 1
18 1 0 1
68 0 0 1
48 1 1 1
17 0 0 1
代码实现
package com.lj.logistic
import org.apache.spark.mllib.classification.{LogisticRegressionWithLBFGS, LogisticRegressionWithSGD}
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.mllib.regression.{LabeledPoint, LinearRegressionWithSGD}
object Driver {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setMaster("local").setAppName("logistic")
val sc = new SparkContext(conf)
val data = sc.textFile("e://data/logistic.txt")
//--为了满足Spark建模要求,RDD[String]->RDD[LabeledPoint]
val r1 = data.map { line =>
val info = line.split("\t")
//--获取因变量
val Y = info.last.toDouble
//--获取自变量数组
val arr = info.dropRight(1).map { num => num.toDouble }
LabeledPoint(Y, Vectors.dense(arr))
}
//--建立逻辑回归模型,底层用梯度下降法来求解系数
//val model=LogisticRegressionWithSGD.train(r1, 50,0.03)
//--建立逻辑回归模型,底层用的是拟牛顿法来求解系数
val model = new LogisticRegressionWithLBFGS().run(r1)
val coef = model.weights //--获取模型的系数
val intercept = model.intercept //--获取模型的截距项系数
val predictResult = model.predict(r1.map { lp => lp.features })
//--现在给定一组数据:age:48 vision:1 drive:1 问:是否出现交通事故
val v1 = Vectors.dense(15, 0, 0)
val testRDD = sc.makeRDD(List(v1))
val predictTest = model.predict(testRDD)
println(coef)
predictResult.foreach {println}
predictTest.foreach {println}
}
}
结果
[0.005592043370818867,1.9116578171473715,-2.23353961580022]
预测:15, 0, 0 结果是1.0
4. 总结
本例是通过逻辑回归,判断一个人是否出现过交通事故(0 or 1) 离散型
知识点
1.逻辑回归模型的目标函数是 Sigmoid函数
2.Sigmoid函数的作用:将连续型数据离散化 0 or 1
3.所以逻辑回归,如果单从回归来看,是预测数据,但是逻辑回归解决的是 二分类问题(不是预测)
4.解逻辑回归模型的系数,可以用随机梯度下降法来解,也可以用拟牛顿法来解
5.当步长不好选取时,可以考虑用拟牛顿法来处理
拟牛顿法也是一种迭代算法,通过数值解方式逼近真实解
优点:用很少的迭代次数就可以收敛,而且不需要选取步长,所以针对调节步长有困难的场景,可以用这个算法
缺点:计算代价更高
如果您看到这了,请点个赞为自己的努力加油!!!