線性模型之-Lasso


算法的簡要概述

在機器學習問題中,高維度數據進行回歸和分類是一個很困難的問題。例如在許多Microarray生物數據上,數據的維度通常是千和萬級別,但是由於收集數據需要昂貴的實驗,因此可用的訓練數據卻相當少,通常只有50-300左右,這樣的現象通常稱為“small samples, large problem”。
高維度問題帶來兩個缺點:
1)計算量。從大小矩陣乘積計算和多矩陣計算角度來說,矩陣的稀疏程度越大,矩陣計算數量越少,矩陣計算速度越快。
2)overfitting。對於回歸問題來說:

\[f(\mathbf{x})=\sum_{j=1}^{p} w^{j} x^{j}=\mathbf{w}^{T}\mathbf{x} \]

損失函數是$$J(\mathbf{w})=\frac{1}{n} \sum_{i=1}{n}\left(y_{i}-f\left(\mathbf{x}_{i}\right)\right){2}=\frac{1}{n}|\mathbf{y}-X \mathbf{w}|^{2}$$ 問題的解是$$\hat{\mathbf{w}}=\left(X^{T} X\right)^{-1} X^{T} \mathbf{y}$$ 其中:數據\(X=\left(\mathbf{x}_{1}, \dots, \mathbf{x}_{n}\right)^{T} \in \mathbb{R}^{n \times p}\),標簽是\(\mathbf{y}=\left(y_{1}, \dots, y_{n}\right)^{T}\),n是數據個數,p是數據維度,如果n>p,矩陣\(X^{T} X\)的秩小於矩陣未知數的個數,所以矩陣有無數解,所以無論怎么樣,我們現在得到的解不是最優解,所以我們需要減少數據的維度,找到最優解。減少數據維度的方法就是對w系數做出懲罰也就是做約束也叫正則化,常規的有L1正則化和L2正則化,L1正則化對應的是Lasso算法,L2正則化對應的是Ringe算法。

相關算法

  • 多任務Lasso回歸算法,標簽y是一個2D數組,形式為(n_samples,n_tasks). 多任務學習是使用不同的線性函數在一樣的數據上學習不同的目標函數,也就是在同一個數據上訓練多個不同的線性函數。
  • Ridge算法,不同於Lasso引入L1正則化,Ridge引入的是L2正則化。

算法的原理

算法公式是:$$J_{L}(\mathbf{w})=\frac{1}{n}|\mathbf{y}-X \mathbf{w}|^{2}+\lambda|\mathbf{w}|_{1}$$ 加入正則化項,使較多參數變成為0,獲取大量稀疏解,關於稀疏解的推導和證明請參考這篇博客

算法求解參數

L1范數罰有一個問題:由於|X|函數在0處不可導,故而直接使用最小二乘法、梯度下降法等方法均失效,但是由於其為第一類間斷點中的可去間斷點,可以通過補充該點的定義解決,通常,對於線性回歸中的lasso回歸可以采用近似的前向逐步回歸,坐標軸下降法替代。

Sklearn中重要的參數和函數解釋

參數名稱
參數解釋
alpha 懲罰項系數,默認是1,如果是0的話,算法相當於是最小二乘法
屬性名稱
屬性解釋
coef_ 懲罰項中w的解
sparse_coef_ 表示內容和coef_一樣,但是是稀疏解的形式
intercept_ \(w_{0}\)
n_iter_ 通過坐標下降法達到最優解的次數

Sklearn的函數使用方法

1. 基本回歸

 1)使用sklean自帶的make_regression去fake回歸數據

from sklearn.datasets import make_regression
reg_data, reg_target = make_regression(n_samples=200,n_features=1500, n_informative=3, noise=7)
>>> reg_data.shape
(200, 1500)

 2)導入Lasso模型,fit數據

>>> from sklearn.linear_model import Lasso
>>> lasso = Lasso()
>>> lasso.fit(reg_data, reg_target)
Lasso(alpha=1.0, copy_X=True, fit_intercept=True, max_iter=1000,  
normalize=False, positive=False, precompute=False, random_state=None,  
selection='cyclic', tol=0.0001, warm_start=False)

可以看到,默認的alpha參數是1

2. 幾個重要參數

 1) 相關系數w0

>>> lasso.intercept_
 -0.31346949753751252

 2) 迭代次數參數

>>> lasso.n_iter_
11

 3) 稀疏解的個數

>>> import numpy as np
>>> np.sum(lasso.coef_ != 0)
30
3. 交叉驗證獲取參數

 在Lasso算法中,通常用交叉驗證獲取最佳參數。

>>> from sklearn.linear_model import LassoCV
>>> lassocv = LassoCV()
>>> lassocv.fit(reg_data, reg_target)
LassoCV(alphas=None, copy_X=True, cv=None, eps=0.001, fit_intercept=True,max_iter=1000,  
n_alphas=100, n_jobs=1, normalize=False, positive=False,precompute='auto',   
random_state=None, selection='cyclic', tol=0.0001,verbose=False)

 CV方法獲得的最佳系數

>>> np.sum(lasso.coef_ != 0)
30
>>> lasso.n_iter_
11

看起來,用LassoCV和Lasso獲得的參數完全一致,所以可以判定Lasso是用CV方式獲取參數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM