本文版本選自spark 2.1.0
寫這篇文章之前已閱讀過官網api,演算法本身自認為自己手動寫,應該可以搞定(進一步優化不提);但是官網卻看的我迷迷糊糊的,引數選擇和結果獲取,描述不夠清晰,寫這篇文字的目的就是為了理清所有官網沒有解答的謎團;
演算法本身比較簡單,網上文章也很多,本人自身也提不出更高大上的解決方案,所以演算法不再詳解;重點就是解讀官網的不足;
上**:
val training = spark.read.format("libsvm")
.load(pathfile+"data/mllib/linearregression.txt")
val lr = new linearregression()
.setmaxiter(10)
.setregparam(0)
.setelasticnetparam(0)
解讀:關於setelasticnetparam的原始碼描述有:
* this supports multiple types of regularization:意思就是說:這支援多種型別的正則化操作。* - none (a.k.a. ordinary least squares)
* - l2 (ridge regression)
* - l1 (lasso)
* - l2 + l1 (elastic net)
具體方法描述為:
/**可以發現這個引數設定是用來設定l1,、l2的。* set the elasticnet mixing parameter.
* for alpha = 0, the penalty is an l2 penalty.
* for alpha = 1, it is an l1 penalty.
* for alpha in (0,1), the penalty is a combination of l1 and l2.
* default is 0.0 which is an l2 penalty.**
@group
setparam
*/@since("1.4.0")
defsetelasticnetparam(value: double):this.type= set(elasticnetparam, value)
setdefault(elasticnetparam -> 0.0)
l1與l2規範是用來幹嘛的呢?簡單來說是為了處理過擬合的(後面有具體測試),下圖是乙個形象描述;
l1正則化和l2正則化可以看做是損失函式的懲罰項。對於線性回歸模型,使用l1正則化的模型建叫做lasso回歸,使用l2正則化的模型叫做ridge回歸(嶺回歸)。下圖是
python
中lasso回歸的損失函式,式中加號後面一項α||w||1
即為l1正則化項。
下圖是python中ridge回歸的損失函式,式中加號後面一項α||w||22即為l2正則化項。
結合setregparam(),該函式為設定正則化引數,結合以上描述
推測spark ml的線性規劃完整函式為:min(1/2n||coefficients*x -y||^2^ +(elasticnetparam*l1-(1-elasticnetparam)*l2))
也就是說:正則化引數設定為0時,elasticnetparam的設定無意義。
下面繼續**驗證,及其測試結果
val lrmodel = lr.fit(training)
//y=w*x+b 回歸係數(w) and 截距(b)
println(s"coefficients: $ intercept: $")
//總結訓練集上的模型並列印出一些指標
val trainingsummary = lrmodel.summary
println(s"numiterations: $")
println(s"objectivehistory: [$]")
trainingsummary.residuals.show()//殘差
println(s"rmse: $")//均方根誤差
println(s"r2: $")//判定係數,也稱為擬合優度,越接近1越好
測試資料為:【
選擇最直觀的資料,不裝逼】,引數如上文所示
1 1:0
2 1:1
3 1:2
4 1:3
5 1:4
結果為:
coefficients: [0.9999999999999993] intercept: 1.000000000000001
numiterations: 1
objectivehistory: [0.0]
測試資料為:正則化引數設定為0.11 1:0.2
2 1:1.1
3 1:2.1
4 1:2.9
5 1:4
結果為:
coefficients: [1.0619069136918209] intercept: 0.8124717577948491
numiterations: 1
objectivehistory: [0.0]
正則化引數設定為:0.1,
elasticnetparam為0.2
結果為:
coefficients: [0.9908261029681737] intercept: 0.9588982278855623
numiterations: 3
objectivehistory: [0.5,0.4037043811427782,0.040903518280319406]
正則化引數設定為:0.1,
elasticnetparam為0.8
結果為:
coefficients: [0.9878122500298612] intercept: 0.9651067649384861
numiterations: 3
objectivehistory: [0.5,0.4116133463948107,0.06201518671563113]
根據結果分析公式
min(1/2n||coefficients*x -y||^2^ +(
elasticnetparam*l1
-(1-
elasticnetparam
)*l2
)),結論不坑
複雜的沒有測試,歡迎批評指正
機器學習之線性回歸以及Logistic回歸
1 線性回歸 回歸的目的是 數值型資料的目標值。目標值的計算是通過乙個線性方程得到的,這個方程稱為回歸方程,各未知量 特徵 前的係數為回歸係數,求這些係數的過程就是回歸。對於普通線性回歸使用的損失函式一般為平方誤差。把其用最小二乘法進行優化得到的關於係數w求導所得到的矩陣形式的表示式求得的 w便為最...
機器學習之線性回歸
訓練樣例 x y 輸入變數 特徵 x ps n 1行,1 列 輸出變數 目標變數 y訓練樣例總數 m 特徵維度 n第 i 個訓練樣例 x i y i 所有訓練樣例的輸入變數組成的矩陣 x ps m行,n 1 列,每行是 x i t 所有訓練樣例的輸出變數組成的矩陣 y ps m行,1 列 下表是某地...
機器學習之線性回歸
線性回歸就是用線性方程去擬合一組資料,x 的最高端是1,用方程可以表示為 h x 0 1x1 n xn我們令 x0 1則上式可以改寫為 h x i 0n ixi tx 既然是擬合的模型,則肯定會存在不符合該模型的點,第 i 個點的真實值與模型 的值之間的差稱為誤差 e h x i y i 假設總共有...