鄭淞元
(浙江省杭州學軍中學,浙江杭州,310000)
存款營銷是銀行吸收存款的主要經(jīng)營模式,通過對銀行歷史營銷數(shù)據(jù)進行建模,利用模型去判斷一個潛在客戶是否會有存款業(yè)務,從而幫助銀行提高營銷成功率和營銷效率,更好的分配人力資源,節(jié)省成本。本文將使用spark框架中的邏輯回歸實現(xiàn),按照數(shù)據(jù)分析的步驟,分析銀行營銷數(shù)據(jù),建立邏輯回歸模型,預測客戶是否會存款,并提出建議。
邏輯回歸是一個有監(jiān)督機器學習算法中的分類算法。通常是利用已知的特征變量來預測一個離散型目標變量的值(如0/1,是/否,真/假)。通過邏輯回歸擬合得到結(jié)果變量值是一個概率值(0-100%),根據(jù)概率值的大小和根據(jù)業(yè)務場景確定的分類閾值,映射為最終預測目標變量的分類值,如:概率值大于等于50%,映射目標變量分類值為1;概率值小于50%,映射目標變量分類值為0。
線性回歸的基本思路是對多維空間中存在的樣本點,用特征的線性組合去擬合多維空間中點的分布和軌跡,公式如下:z=θ0 +θ1x1 +θ2x2 +θ3x3......+θnxn=θTx;
特征工程是對原始數(shù)據(jù)進行加工,提取滿足算法和模型要求的特征變量。特征工程包括特征提取、特征轉(zhuǎn)換、降維等操作。Spark提供了多種特征工程算法的實現(xiàn)。本驗中,我們使用了StringIndex 和 OneHotEncoder 兩種特征轉(zhuǎn)換算法。
StringIndex是指把一組字符型標簽編碼成一組數(shù)值型標簽索引,索引的范圍為0到標簽數(shù)量。索引構(gòu)建的順序為標簽的頻率,優(yōu)先編碼頻率較大的標簽,即出現(xiàn)頻率最高的標簽為0號。如果輸入的是數(shù)值型的,將轉(zhuǎn)成字符型,再對其進行編碼。
表1 StringIndex特征轉(zhuǎn)換示例
在上述例子數(shù)據(jù)中,a出現(xiàn)了3次,c出現(xiàn)了2次,b出現(xiàn)了1次,按照category頻率從高到低,從0開始編碼,所以a的編碼為0.0,c的編碼為1.0,b的編碼為2.0。
OneHot編碼將已經(jīng)轉(zhuǎn)換為數(shù)值型的類別特征,映射為一個稀疏向量對象,對于某一個類別映射的向量中只有一位有效,即只有一位數(shù)字是1,其他數(shù)字位都是0。如下列例子,有兩個特征屬性:
婚姻狀況:[“已婚”,“單身”,“離異”,“未知”]
有無房貸:[“有房貸”,“無房貸”]
機器學習算法不接收字符型的特征值,需要將字符型分類值的特征數(shù)字化,對于某一個樣本,如[“已婚”,“無房貸”],最直接的方法可以采用序列化的方式:[0,1],但是這樣的特征處理并不能直接放入機器學習算法中。對于類似婚姻狀況是4維,有無房貸是2維等問題,可以采用One-Hot編碼的方式對上述樣本[“已婚”,“無房貸”]進行編碼,“已婚”對應[1,0,0,0],“無房貸”對應[0,1],則完整的特征數(shù)字化的結(jié)果為:[1,0,0,0,0,1],這樣做會使數(shù)據(jù)變得連續(xù),但也會非常稀疏,所以在Spark中,用了稀疏向量來表示這個結(jié)果,并且邏輯回歸算法的分類器是需要連續(xù)數(shù)值作為特征輸入的。
Apache Spark是專為大規(guī)模數(shù)據(jù)處理而設計的快速通用的計算引擎,其核心特點是基于內(nèi)存的,對于大型的、低延遲的大數(shù)據(jù)分析應用有很好的性能表現(xiàn)。Spark的計算模型借鑒吸收了Hadoop MapReduce優(yōu)點,同時也著力去解決MapReduce的一系列問題。
Spark具有如下幾個主要特點:
(1)運行速度快:構(gòu)建RDD的DAG支持循環(huán)數(shù)據(jù)流結(jié)構(gòu),通過執(zhí)行引擎進行內(nèi)存中的并行計算處理。
(2)容易使用:提供了多種語言的交互方式,比如Scala、Java、Python和R語言等,可以方便得通過Spark Shell使用上述幾種語言編程交互式使用Spark。
(3)通用性:強大而完整的工具套件和技術(shù)棧--SQL查詢、streaming流式計算、機器學習和圖算法等相關(guān)組件。
(4)運行模式多樣:可單獨得構(gòu)建集群來使用,可運行在Hadoop之上,可以在Amazon EC2等云環(huán)境中進行部署,數(shù)據(jù)源也可以很多樣化,可以訪問HDFS、Cassandra、HBase、Hive等多種數(shù)據(jù)源。
本實驗基于windows系統(tǒng)平臺。使用的編程語言主要是Scala,開發(fā)工具為Scala IDE。本次實驗數(shù)據(jù)來自:https://github.com/ChitturiPadma/datasets/blob/master/bank_marketing_data.csv。
在數(shù)據(jù)bank_marketing_data.csv中,包含4萬多條記錄和21個字段,本次實驗中,我們使用其中10個字段作為因變量,1個字段作為目標變量,具體列明含義如表2所示。
表2 數(shù)據(jù)字段描述
經(jīng)過對數(shù)據(jù)的概要分析可知,營銷數(shù)據(jù)中除了數(shù)值型的字段 (age、duration、previous、empvarrate),還有一些包含分類值的字符型字段(job,marital、default、housing、poutcome、loan)。本步驟就要利用特征工程,對分類字段進行特征轉(zhuǎn)換,使用spark提供的StringIndex和OneHotEncoder算法。
圖1 特征工程加工后的分類變量
最后需要對在對目標變量y進行StringIndex數(shù)據(jù)轉(zhuǎn)換后,就可以基于編碼后的向量字段應用邏輯回歸算法進行預測了。
基于Spark平臺進行邏輯回歸分析的基本步驟如下:
(1)實例化一個向量組裝器對象,將向量類型字段和數(shù)值型字段形成一個新的字段:features,其中包含了所有的特征值 val;
(2)對目標變量進行StringIndexer特征轉(zhuǎn)換,輸出新列;
(3)將特征按順序進行合并,形成一個數(shù)組 val;
(4)將原始數(shù)據(jù)selected_Data進行8-2分,80%用于訓練數(shù)據(jù)training。20%用于測試數(shù)據(jù)test,評估訓練模型的精確度 ;
(5)實例化邏輯回歸算法;
(6)將算法數(shù)組和邏輯回歸算法合并,傳入pipeline對象的stages中,然后作用于訓練數(shù)據(jù),訓練模型;
(7)將上一步的訓練模型作用于測試數(shù)據(jù),返回測試結(jié)果;
(8)顯示測試結(jié)果集中的真實值、預測值、原始值、百分比字段;
(9)創(chuàng)建二分類算法評估器,對測試結(jié)果進行評估val。
val splits = selected_Data.randomSplit(Array(0.8,0.2))val lr = new LogisticRegression()var model = new Pipeline().setStages(transformers:+ lr).fit(training)
圖2 代碼1(邏輯回歸模型進行預測)
運行代碼,可以得出結(jié)果如圖3所示。
圖3 預測結(jié)果圖像
圖3運行后輸出的測試結(jié)果前10條數(shù)據(jù),其中probability 列值范圍是[0,1],對應的發(fā)生概率,如果某個分類值出現(xiàn)的概率大于0.5,那么預測值prediction就是對應的那個分類值。對20%測試集的預測精確度為:0.9192031636279924,即:精確度為 90% 以上,說明我們模型是有效的,預測的準確度比較高。需要注意的是,每次運行的精確度不會完全一樣,有稍微差別。
本文章介紹了運用邏輯回歸機器學習算法的基本步驟,以銀行營銷數(shù)據(jù)為基礎(chǔ)演示了的分析預測方法,該方法包括以下步驟:
(1)獲取銀行營銷數(shù)據(jù);(2)分析營銷數(shù)據(jù)的結(jié)構(gòu);(3)概要分析數(shù)據(jù)字段的內(nèi)容;(4)對數(shù)據(jù)使用特征工程;(5)建立邏輯回歸模型并進行預測。
除上述步驟外,根據(jù)數(shù)據(jù)情況和具體場景,有時還需要對數(shù)據(jù)進行清洗。