基於spark_streaming的logistic流式機器學習

在前期搭建好spark、scala平臺和學習基於python的logistic流式機器學習例程後,這一週正式基於spark做一個基於logistic的流式機器學習的實現。

一、spark streaming例程

首先嚐試spark streaming指導手冊中自帶的例程(鏈接http://spark.apache.org/docs/latest/streaming-programming-guide.html),由於網上的例子比較詳細,在此不過多闡述,例程主要實現的是基於流數據的單詞統計功能的實現,通過不斷向本機的9999端口發送英文單詞,spark streaming的NetworkWordCount例程則按照一定的頻率對接收到的數據按照單詞出現的次數進行統計,並打印出來。如下圖所示。

二、給spark streaming發送數據

由於我們要實現基於logistic模型的流式學習得將學習的數據庫通過TCP網絡發往spark streaming端,因此我們通過C語言編寫一個讀取數據文件並開啓TCP端口偵聽spark streaming的連接,連接成功後再不斷地向spark streaming端發送數據。

數據發送端的程序流程圖如下圖所示。


三、logistic迴歸的數據集

數據集我們採用UCI(加州大學歐文分校)機器學習數據中心提供的數據,我們首先採用了一份比較小的數據集,包含了699個樣本

(鏈接http://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+%28Diagnostic%29

關於數據集一小部分見下截圖。

每一列的含義見下

由於我們的logistic迴歸模型不對id號進行學習,並且不能有missing value,因此將id的那一列刪除,將missing value替換爲0。

四、基於spark streaming的logistic流式機器學習

我們編寫的基於spark streaming的流式Logistic迴歸的代碼流程圖如下

注意我們沒有用純粹的隨機梯度下降法,即每次梯度下降的迭代只隨機取一個數據計算梯度。而是取一個batch的數據進行多次梯度下降,其初始的參數是上一個batch數據得到的輸出。之所以這樣設計,是因爲純粹的隨機梯度下降法並不穩定,容易受外點的數據影響。假如訓練數據中有一些外點,用隨機梯度下降會在外點的這一步得到一個錯誤的梯度,把結果引向一個錯誤的方向,而需要接下來的幾個非外點的數據,將方向重新導回正確的方向,因此一個外點會導致數個數據是無效的。而使用一個batch進行多次梯度下降,每一個batch的迭代本身具有一定的抗外點的性能,因此不會對結果造成太大的影響。

此結構參考了spark中LogisticRegressionWithSGD函數,它也是對一個batch進行Logistic迴歸,不同的是,我們的流式Logistic迴歸的數據是從streaming中讀入的。

爲了測試我們算法的有效性,我們選擇了網站http://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+%28Diagnostic%29數據集,其中包含699個數據。將其中80%的數據作爲訓練,20%的數據作爲測試。訓練的batch的大小50,梯度下降的步長爲0.05,每個batch的梯度下降的迭代次數爲50次,每用一個batch進行訓練之後,我們都用測試集進行測試,計算錯誤率。其結果如下圖所示:

可以看到,前幾個batch訓練後,由於訓練數據不夠,結果不太穩定,當訓練數據越來越多後,錯誤率總體趨於穩定,也證明了我們的流式Logistic迴歸是有效的。

本代碼可以在我們的項目主頁下的StreamingLogisticRegression目錄下找到,其中包含了源碼,可執行文件,和數據集。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章