任何資料都存在雜訊和多重共線性
如何解決多重共線性 ?
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回歸模型的損失函式上加上了不同的懲罰項,該懲罰項由回歸係數的函式構成,...