Scikit Learn - 彈性網路



彈性網路是一種正則化迴歸方法,它線性組合了 Lasso 和 Ridge 迴歸方法的兩種懲罰項,即 L1 和 L2。當存在多個相關特徵時,它非常有用。Lasso 和彈性網路之間的區別在於,Lasso 可能會隨機選擇這些特徵中的一個,而彈性網路則更有可能同時選擇兩者。

Sklearn 提供了一個名為 **ElasticNet** 的線性模型,它使用 L1 和 L2 範數進行係數正則化。這種組合的優勢在於,它允許學習一個稀疏模型(其中一些權重非零,類似於 Lasso 正則化方法),同時仍然保持 Ridge 正則化方法的正則化特性。

以下是需要最小化的目標函式:

$$\displaystyle\min\limits_{w}\frac{1}{2n_{samples}}\lVert X_{w}-Y\rVert_2^2+\alpha\rho\lVert W\rVert_1+\frac{\alpha\lgroup 1-\rho\rgroup}{2}\ \lVert W\rVert_2^2$$

引數

下表列出了 **ElasticNet** 模組使用的引數:

序號 引數及描述
1

alpha − float,可選,預設值 = 1.0

Alpha,乘以 L1/L2 項的常數,是決定我們想要對模型進行多少懲罰的調整引數。預設值為 1.0。

2

l1_ratio − float

這稱為彈性網路混合引數。其範圍為 0 < = l1_ratio < = 1。如果 l1_ratio = 1,則懲罰項為 L1 懲罰。如果 l1_ratio = 0,則懲罰項為 L2 懲罰。如果 l1 ratio 的值介於 0 和 1 之間,則懲罰項為 L1 和 L2 的組合。

3

fit_intercept − 布林值,可選。預設值 = True

此引數指定是否應將常數(偏差或截距)新增到決策函式中。如果設定為 False,則不會在計算中使用截距。

4

tol − float,可選

此引數表示最佳化的容差。將比較 tol 值和更新,如果發現更新小於 tol,則最佳化檢查對偶間隙以確定最優性,並繼續直到它小於 tol。

5

normalise − 布林值,可選,預設值 = False

如果此引數設定為 True,則在迴歸之前將對迴歸量 X 進行標準化。標準化將透過減去均值併除以 L2 範數來完成。如果 fit_intercept = False,則此引數將被忽略。

6

precompute − True|False|類陣列,預設值 = False

使用此引數,我們可以決定是否使用預先計算的 Gram 矩陣來加速計算。為了保持稀疏性,對於稀疏輸入,它將始終為 True。

7

copy_X − 布林值,可選,預設值 = True

預設情況下,它為 True,這意味著 X 將被複制。但如果將其設定為 False,則 X 可能會被覆蓋。

8

max_iter − int,可選

顧名思義,它表示共軛梯度求解器所採用的最大迭代次數。

9

warm_start − bool,可選,預設值 = false

將此引數設定為 True,我們可以重用先前對 fit 的呼叫的解決方案作為初始化。如果我們選擇預設值,即 false,它將擦除先前的解決方案。

10

random_state − int,RandomState 例項或 None,可選,預設值 = none

此引數表示用於在混洗資料時生成的偽隨機數的種子。以下是選項:

  • int − 在這種情況下,random_state 是隨機數生成器使用的種子。

  • RandomState 例項 − 在這種情況下,random_state 是隨機數生成器。

  • None − 在這種情況下,隨機數生成器是 np.random 使用的 RandonState 例項。

11

selection − str,預設值 = ‘cyclic’

  • Cyclic − 預設值為 cyclic,這意味著特徵預設情況下將依次迴圈。

  • Random − 如果我們將 selection 設定為 random,則每次迭代都會更新一個隨機係數。

屬性

下表列出了 **ElasticNet** 模組使用的屬性:

序號 屬性及描述
1

coef_ − 陣列,形狀 (n_tasks, n_features)

此屬性提供權重向量。

2

Intercept_ − 陣列,形狀 (n_tasks)

它表示決策函式中的獨立項。

3

n_iter_ − int

它給出座標下降求解器為達到指定的容差而執行的迭代次數。

實現示例

以下 Python 指令碼使用 **ElasticNet** 線性模型,該模型進一步使用座標下降作為演算法來擬合係數:

from sklearn import linear_model
ENreg = linear_model.ElasticNet(alpha = 0.5,random_state = 0)
ENreg.fit([[0,0], [1, 1], [2, 2]], [0, 1, 2])

輸出

ElasticNet(alpha = 0.5, copy_X = True, fit_intercept = True, l1_ratio = 0.5,
   max_iter = 1000, normalize = False, positive = False, precompute=False,
   random_state = 0, selection = 'cyclic', tol = 0.0001, warm_start = False)

示例

現在,一旦擬合,模型就可以預測新值,如下所示:

ENregReg.predict([[0,1]])

輸出

array([0.73686077])

示例

對於上述示例,我們可以使用以下 Python 指令碼獲取權重向量:

ENreg.coef_

輸出

array([0.26318357, 0.26313923])

示例

類似地,我們可以使用以下 Python 指令碼獲取截距的值:

ENreg.intercept_

輸出

0.47367720941913904

示例

我們可以使用以下 Python 指令碼獲取達到指定容差的總迭代次數:

ENreg.n_iter_

輸出

15

我們可以更改 alpha 的值(朝向 1)以從模型中獲得更好的結果。

示例

讓我們看看 alpha = 1 的相同示例。

from sklearn import linear_model
ENreg = linear_model.ElasticNet(alpha = 1,random_state = 0)
ENreg.fit([[0,0], [1, 1], [2, 2]], [0, 1, 2])

Output
ElasticNet(alpha = 1, copy_X = True, fit_intercept = True, l1_ratio = 0.5,
   max_iter = 1000, normalize = False, positive = False, precompute = False,
   random_state = 0, selection = 'cyclic', tol = 0.0001, warm_start = False)

#Predicting new values
ENreg.predict([[1,0]])

Output
array([0.90909216])

#weight vectors
ENreg.coef_

Output
array([0.09091128, 0.09090784])

#Calculating intercept
ENreg.intercept_

Output
0.818180878658411

#Calculating number of iterations
ENreg.n_iter_

Output
10

從上面的示例中,我們可以看到輸出的差異。

廣告

© . All rights reserved.