機器學習 嶺回歸和Lasso回歸(4)

2021-10-10 15:49:51 字數 3557 閱讀 5810

任何資料都存在雜訊和多重共線性

如何解決多重共線性 ?

1.演算法角度(正則化)

2.資料角度(最有效果)

嶺回歸與lasso回歸的出現是為了解決線性回歸出現的過擬合(資料間高度線性相關)以及在通過正規方程方法求解θ的過程**現的x轉置乘以x不可逆這兩類問題的,這兩種回歸均通過在損失函式中引入正則化項來達到目的,具體三者的損失函式對比見下圖:

其中λ稱為正則化引數,如果λ選取過大,會把所有引數θ均最小化,造成欠擬合,如果λ選取過小,會導致對過擬合問題解決不當,因此λ的選取是乙個技術活。

嶺回歸與lasso回歸最大的區別在於嶺回歸引入的是l2範數懲罰項,lasso回歸引入的是l1範數懲罰項,lasso回歸能夠使得損失函式中的許多θ均變成0,這點要優於嶺回歸,因為嶺回歸是要所有的θ均存在的,這樣計算量lasso回歸將遠遠小於嶺回歸。

其中λ為正則係數,i為單位矩陣。

縮減方法可以去掉不重要的引數,因此能更好地理解資料。此外,與簡單的線性回歸相比,縮減法能取得更好的**效果。.嶺回歸作為一種縮減演算法可以判斷哪些特徵重要或者不重要,有點類似於降維的效果

嶺回歸是加了二階正則項的最小二乘,主要適用於過擬合嚴重或各變數之間存在多重共線性的時候,嶺回歸是有bias的,這裡的bias是為了讓variance更小。

縮減演算法可以看作是對乙個模型增加偏差的同時減少方差

嶺回歸可以解決特徵數量比樣本量多的問題

變數間存在共線性(最小二乘回歸得到的係數不穩定,方差很大)

應用場景就是處理高度相關的資料

對糖尿病資料集進行嶺回歸建模

from pandas import series,dataframe

import matplotlib.pyplot as plt

import seaborn as sns

%matplotlib inline

from sklearn.datasets import load_diabetes

from sklearn.model_selection import train_test_split

diabetes = load_diabetes()

train = diabetes.data

target = diabetes.target

feature_names = diabetes.feature_names

x_train,x_test,y_train,y_test = train_test_split(train,target,test_size=0.2)

rideg = ridge(alpha=1.0)

rideg.fit(x_train,y_train)

# 獲取訓練好模型的w引數

rideg.coef_

# 對w引數繪製圖形,通過w的大小可以進行特徵選擇

sns.set()

importances = series(data=np.abs(rideg.coef_),index=feature_names).sort_values(ascending=false)

importances.plot(kind='bar')

plt.xticks(rotation=0)

plt.show()

# 由影象我們選擇前七個特徵

importancesm_cols = ['***','bmi','bp','s3','s4','s6','s5']

datasets = dataframe(data=train,columns=feature_names)

x = datasets[importancesm_cols]

y = target

x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2)

rideg = ridge(alpha=1.0)

rideg.fit(x_train,y_train)

from sklearn.metrics import mean_squared_error

mean_squared_error(y_test,rideg.predict(x_test))

影象如下:

與嶺回歸相似的是,lasso 回歸同樣是通過新增正則項來改進普通最小二乘法,不過這裡新增的是 l1 正則項。即:

l1:l1正則化最大的特點是能稀疏矩陣,進行龐大特徵數量下的特徵選擇

l1是模型各個引數的絕對值之和

l2:l2正則能夠有效的防止模型過擬合,解決非滿秩下求逆困難的問題

l2是模型各個引數的平方和的開方值。

import numpy as np

from scipy.linalg import hilbert

from sklearn.linear_model import lasso

import matplotlib.pyplot as plt

%matplotlib inline

"""使用lasso 回歸擬合併繪圖

"""from sklearn.linear_model import lasso

x = hilbert(10)

w = np.random.randint(2,10,10) # 隨機生成 w 係數

y_temp = np.matrix(x) * np.matrix(w).t # 計算 y 值

y = np.array(y_temp.t)[0] #將 y 值轉換成 1 維行向量 相當於給矩陣建立乙個真實值

alphas = np.linspace(-2,2,10)

lasso_coefs =

for a in alphas:

lasso = lasso(alpha=a,fit_intercept=false)

lasso.fit(x,y)

plt.plot(alphas,lasso_coefs) # 繪製不同alpha下的 w 擬合值

plt.xlabel('alpha')

plt.ylabel('w')

plt.title('lasso regression')

plt.scatter(np.linspace(0,0,10),parameters[0]) # 普通最小二乘法的 w 放入圖中

由圖可見,當 alpha 取值越大時,正則項主導收斂過程,各 w 係數趨近於 0。當 alpha 很小時,各 w 係數波動幅度變大。

機器學習 嶺回歸和LASSO回歸

1.用矩陣表示多元線性回歸 y bx a q b y bx t y bx 達到最小時的b值。也即是殘差平方和最小時。b bi 的值。可以證明b的最小二乘估計 xtx 1xty 其中 xtx 1為廣義逆。1.出現多重共線性2.當n 嶺回歸 ridge regression 先對資料做標準化 b k x...

機器學習 嶺回歸和 LASSO 回歸實現

普通最小二乘法帶來的侷限性,導致許多時候都不能直接使用其進行線性回歸擬合。特別是以下兩種情況 為了解決上述兩種情況 現的問題,嶺回歸 ridge regression 應運而生。嶺回歸可以被看作為一種改良後的最小二乘估計法,它通過向損失函式中新增l2l2 l2正則項 2 範數 有效防止模型出現過擬合...

嶺回歸和lasso回歸

在多元線性回歸模型中估計回歸係數使用的是ols,但同時還也有異方差和多重共線性的影響。回歸中關於自變數的選擇大有門道,變數過多時可能會導致多重共線性問題造成回歸係數的不顯著,甚至造成ols估計的失效。嶺回歸和lasso回歸在ols回歸模型的損失函式上加上了不同的懲罰項,該懲罰項由回歸係數的函式構成,...