Spark机器学习--运用逻辑回归分析银行营销数据
一、介绍
1.1 内容
存款营销是银行吸收存款的主要经营模式,通过现有数据建立模型来判断客户是否订阅存款业务,从而帮助商业银行更好的分配人力资源,提高业务量,以满足现阶段营销活动对提高营销成功率的期望。
本实验会使用spark机器学习中的逻辑回归算法,分析银行营销数据,按照机器学习开发步骤,建立逻辑回归模型,预测客户是否会存款,并评估预测模型的精确度。
实验将采用如下步骤进行回归机器学习算法开发:
1.2 知识点
- Spark机器学习开发的常规步骤
- Spark框架提供的特征转换算法--StringIndex
- Spark框架提供的特征转换算法--OneHotEncoder
- Spark提供的API对预测结果准确度进行评估
- Spark SQL在Spark机器学习中的用法
1.3 环境
- 编程语言为Scala
- 编程软件为实验环境中提供的Scala IDE工具
- Spark API版本为2.1
二、理论学习
2.1 逻辑回归(Logistic Regression)
机器学习算法分为监督学习算法和无监督学习算法,在监督学习算法中,算法有目标变量(即预测值)和特征变量等两种变量,根据目标变量的值是离散值还是连续数值,分为分类算法(目标变量的值为离散值,如 是/否、0/1)和回归算法(目标变量为连续值)。
逻辑回归是一个分类算法而不是回归算法。通常是利用已知的特征变量来预测一个离散型目标变量的值(如0/1,是/否,真/假)。通过拟合一个逻辑函数来预测一个事件发生的概率,预测值是一个概率值(0-100%),根据概率值的大小,映射为目标变量的分类值,如:概率值大于等于 50%,映射目标变量分类值为 1,概率值小于 50%,映射目标变量分类值为 0。
2.2 逻辑回归与线性回归
为了更好理解逻辑回归算法,可以与线性回归算法做个对比。线性回归对多维空间中存在的样本点,用特征的线性组合去拟合多维空间中点的分布和轨迹。线性回归的公式如下: 对于逻辑回归来说,其思想也是基于线性回归。其公式如下: 其中, 被称作sigmoid函数,Logistic Regression算法将线性函数的结果映射到了sigmoid函数中。sigmoid的函数图形如下:
hθ(x)<0.5 则说明当前样本数据属于A类;
hθ(x)>0.5 则说明当前样本数据属于B类。
所以可以将sigmoid函数看成样本数据的概率函数。Spark提供的逻辑回归算法,对样本数据的预测结果中,有一列存储了概率值。本实验中将此概率值进行了输出。
2.3 特征工程
特征工程是最大限度地从原始数据中提取特征以供算法和模型使用的过程。特征工程包括特征提取、特征转换、降维等操作。 Spark提供了多种特征工程算法,详细内容可查看官方文档。
本实验中,我们使用 StringIndex 和 OneHotEncoder 两种特征转换算法。
2.2.1 StringIndex
StringIndexer 是指把一组字符型标签编码成一组数值型标签索引,索引的范围为 0 到标签数量,索引构建的顺序为标签的频率,优先编码频率较大的标签,所以出现频率最高的标签为 0 号。如果输入的是数值型的,会转成字符型,再对其进行编码。
Spark官方实例: 下列数据,包括id和category两列:
id | category
----|----------
0 | a
1 | b
2 | c
3 | a
4 | a
5 | c
使用StringIndexer特征转换算法,对上述数据category列进行特征转换,设置生成新列名为categoryIndex,结果为:
id | category | categoryIndex
----|----------|---------------
0 | a | 0.0
1 | b | 2.0
2 | c | 1.0
3 | a | 0.0
4 | a | 0.0
5 | c | 1.0
上述结果中,由于 a 出现了 3 次,c 出现了 2 次,b 出现了 1 次,按照出现频率由高到低,从 0 开始编码,所以 a 的编码为 0.0,c 的编码为1.0,b 的编码为2.0。
2.2.2 OneHotEncoder
OneHot编码将已经转换为数值型的类别特征,映射为一个稀疏向量对象,对于某一个类别映射的向量中只有一位有效,即只有一位数字是 1,其他数字位都是 0。如下面的例子,有如下两个特征属性:
- 婚姻状况:["已婚","单身","离异","未知"]
- 有无房贷:["有房贷","无房贷"]
对于某一个样本,如["已婚","无房贷"],因为机器学习算法不接收字符型的特征值,我们需要将这个分类值的特征数字化,最直接的方法,可以采用序列化的方式:[0,1]。但是这样的特征处理并不能直接放入机器学习算法中。对于这个问题,婚姻状况是4维的,有无房贷是2维的,这样,我们可以采用One-Hot编码的方式对上述的样本["已婚","无房贷"]编码,"已婚"对应[1,0,0,0],"无房贷"对应[0,1],则完整的特征数字化的结果为:[1,0,0,0,0,1],这样做结果就是数据会变得连续,但也会非常的稀疏,所以在Spark中,使用了稀疏向量来表示这个结果。
逻辑回归算法的分类器需要连续数值作为特征输入。
三、步骤
3.1 获取银行营销数据
通过命令,可获取本次实验数据。
wget http://labfile.oss.aliyuncs.com/courses/990/bank_marketing_data.zip
该数据来自于https://github.com/ChitturiPadma/datasets/blob/master/bank_marketing_data.csv
在本实验中所用到的实验数据都存储在/opt/train/bank_marketing_data.csv
,注意下载数据后,请拷贝到对应的路径下。下面的代码以此作为依据。
3.2 分析营销数据结构
3.2.1 数据结构描述
在数据bank_marketing_data.csv中,包含4万多条记录和21个字段,本次实验中,我们使用其中10个字段作为因变量,1个字段作为目标变量,进行分析预测。11个字段的名称和中文含义如下:
字段名称 | 中文含义 |
---|---|
age | 客户年龄 |
job | 客户职业 |
marital | 婚姻状况 |
default | 是否有信用违约 |
housing | 是否有住房贷款 |
loan | 是否有住房贷款 |
duration | 最后一次联系持续时间(秒) |
previous | 之前活动中与用户联系次数 |
poutcome | 之前市场营销活动的结果 |
empvarrate | 就业变化速率 |
y | 目标变量,本次活动实施结果:是否同意存款 |
3.2.2 编写程序查看数据结构
- 打开开发环境:ScalaIDE,创建一个Scala项目:sparkml,创建
package:com.shiyanlou.algorithm
用来存放机器学习算法相关的程序。创建Scala Object
:LogisiticRegressionTest
。 - 将
/opt/spark-2.1.0-bin-hadoop2.6/jars/
目录下的所有jar包引入到项目类路径。 - 在
LogisiticRegressionTest Object
中创建main
方法,此时的项目结构如下:
- 在main方法中编写如下代码:
//实例化SparkSession对象 val spark=SparkSession.builder().appName("Logistic_Prediction").master("local").getOrCreate() //设置日志级别,减少日志输出,便于查看运行结果 spark.sparkContext.setLogLevel("WARN") //导入隐式转换包,方便使用转换函数 import spark.implicits._ //读取数据,传入数据路径/opt/train/bank_marketing_data.csv val bank_Marketing_Data=spark.read .option("header", true) .option("inferSchema", "true") .csv("/opt/train/bank_marketing_data.csv") //查看营销数据的前5条记录,包括所有字段 println("all columns data:") bank_Marketing_Data.show(5) //读取营销数据指定的11个字段,并将age、duration、previous三个字段的类型从Integer类型转换为Double类型 val selected_Data=bank_Marketing_Data.select("age", "job", "marital", "default", "housing",