背景回顧:
- 線性回歸的基本概念,應用場景?
- 回顧Coursera上ML的基本概念,什么是hypothesis?什么是cost function?什么是objective function?
- LASSO回歸的基本概念,跟普通回歸有什么區別?解決了模型的哪些缺陷?
- 構建LASSO回歸模型的基本步驟?
- Python代碼實現,搞清楚函數所在的包,以及每個函數參數的意義
- 搞清楚每種模型里面的核心參數,如何得到最佳參數?如LASSO就一個alpha參數,數據集小CV即可,數據集大就看在驗證集上的表現。
- 數據:訓練集、驗證集、測試集
更大的問題:
- 關於ML和DL你要學習到什么程度?死扣數學,還是會copy代碼,跑出結果?根據自己的定位找到一個balance
- 如何根據自己的問題去找高質量的數據,並且選擇合適的model,最后給出一個漂亮的endpoint結果
- 因為現在割Python包做得越來越好了,很多ML和DL的model很快就可以建立起來跑通,並且效果不錯
- 所以關鍵就落在:問題、高質量數據集、選擇模型、模型評估、高階內容(confounder)
線性回歸
以基因表達矩陣舉例,可以拿來預測很多內容:比如proliferation和migration ability,還有age,這本質就是一個監督學習的模型,用來預測指定的指標。
數學上的表示也很簡單,y = aX + b,這里 X 就是一個 m x n 的矩陣,我們就是要求得 a 和 b 這些參數來確定這個線性模型。
LASSO回歸
是線性回歸的一種
出現的原因:參數a是一個n維的向量,對於基因表達矩陣,這個n可能是2萬到3萬,其中某些基因可能是高度相關的【correlated】,另外有些基因可能是毫無關聯的,這時我們就要去除掉一些基因。LASSO應運而生!
這里來直接看看scikit的sklearn里面對Lasso的介紹,https://scikit-learn.org/stable/modules/linear_model.html#lasso。
The Lasso is a linear model that estimates sparse coefficients估計稀疏系數. It is useful in some contexts due to its tendency to prefer solutions with fewer non-zero coefficients由於它傾向於選擇具有較少非零系數的解決方案, effectively reducing the number of features upon which the given solution is dependent. For this reason, Lasso and its variants are fundamental to the field of compressed sensing壓縮感知. Under certain conditions, it can recover the exact set of non-zero coefficients恢復非零系數的精確集合
Lasso也叫 L1,這里需要了解一下范數,通俗理解就是計算距離的方式,類似不同維度空間坐標系。
ML基礎知識回顧
y = aX + b,就是模型表示,也叫做hypothesis
Cost function(也叫做Objective function)就是關於a和b的函數,目的就是檢驗predicted_y和real_y之間的差距,數學形式就是 1/2m ∑(predicted_y - real_y)2. 參考:Cost Function
我們的目標就是最小cost function下,求得的a和b的具體值,argmin (cost function)
求解的方法很多,梯度下降算法就是其中的一種,核心原理就是類似山頂下山,初始化參數,選擇斜度(偏導數)最大的地方往下走,然后同步更新參數,直到最后斜率為0,此時即為局部最優解或全局最優解,其中一個核心參數就是步長。【凸凹函數只有全局最優解】
LASSO的數學實現
參見sklearn的教程,看數學公式,鏈接如上,把維度n看作了一個參數,將其范數加進了cost function里,同時也加了一個weight(α)用於控制權重。
Python代碼實現
import numpy as np import matplotlib.pyplot as plt from sklearn.metrics import r2_score # ############################################################################# # Generate some sparse data to play with np.random.seed(42) n_samples, n_features = 50, 100 X = np.random.randn(n_samples, n_features) # Decreasing coef w. alternated signs for visualization idx = np.arange(n_features) coef = (-1) ** idx * np.exp(-idx / 10) coef[10:] = 0 # sparsify coef y = np.dot(X, coef) # Add noise y += 0.01 * np.random.normal(size=n_samples) # Split data in train set and test set n_samples = X.shape[0] X_train, y_train = X[: n_samples // 2], y[: n_samples // 2] X_test, y_test = X[n_samples // 2 :], y[n_samples // 2 :] # ############################################################################# # Lasso from sklearn.linear_model import Lasso alpha = 0.1 lasso = Lasso(alpha=alpha) y_pred_lasso = lasso.fit(X_train, y_train).predict(X_test) r2_score_lasso = r2_score(y_test, y_pred_lasso) print(lasso) print("r^2 on test data : %f" % r2_score_lasso)
優化后的代碼
優化內容:
- 加入了交叉驗證,防止模型過擬合,也選出了最優的系數外參數,即Lasso的權重α,根據MSE選擇最佳的α
- 觀察最終線性模型系數的分布,線性模型的就是一堆系數,沒有任何多余技巧,LASSO就是選擇特征的一種技巧,系數確定還是靠的cost function
from sklearn.linear_model import LassoCV # LassoCV from sklearn.model_selection import StratifiedShuffleSplit # StratifiedShuffleSplit lassocv = LassoCV(alphas=numpy.logspace(-3.5,-0.5,500), fit_intercept=False, positive=True, cv=5) # cv=StratifiedShuffleSplit(n_splits=10, test_size=0.2) lassocv.fit(X_train, y_train) import matplotlib from matplotlib.pyplot import * from numpy import * from pandas import * alpha_df = DataFrame({"alpha":lassocv.alphas_, "mse":lassocv.mse_path_.mean(1)}) best_alpha = alpha_df[alpha_df.mse == alpha_df.mse.max()].alpha matplotlib.pyplot.figure(figsize=(3,2)) axvline(best_alpha.values[0]) plot(lassocv.alphas_, lassocv.mse_path_.mean(1))
# ############################################################################# # Lasso from sklearn.linear_model import Lasso alpha = best_alpha.values[0] lasso = Lasso(alpha=alpha) y_pred_lasso = lasso.fit(X_train, y_train).predict(X_test) r2_score_lasso = r2_score(y_test, y_pred_lasso) print(lasso) print("r^2 on test data : %f" % r2_score_lasso)
plt.hist(lasso.coef_, bins=50)
模型評估
正常情況系,必須要留出一部分數據,或者選一些新數據來獨立評估模型的好壞。
參考Alex那篇文章
- Pearson correlation coefficient,r
- Coefficient of determination,R2
- Mean absolute error: MAE
- ε - accuracy
We used multiclass.roc function from the pROC R package to calculate multiclass area under the receiver operating characteristic curve for the accuracy (mAUC) of age bin prediction. 分類模型
AIC BIC
交叉驗證
交叉驗證是在機器學習建立模型和驗證模型參數時常用的辦法。交叉驗證,顧名思義,就是重復的使用數據,把得到的樣本數據進行切分,組合為不同的訓練集和測試集,用訓練集來訓練模型,用測試集來評估模型預測的好壞。在此基礎上可以得到多組不同的訓練集和測試集,某次訓練集中的某樣本在下次可能成為測試集中的樣本,即所謂“交叉”。
交叉驗證的應用場景
交叉驗證用在數據不是很充足的時候。比如在我日常項目里面,對於普通適中問題,如果數據樣本量小於一萬條,我們就會采用交叉驗證來訓練優化選擇模型。如果樣本大於一萬條的話,我們一般隨機的把數據分成三份,一份為訓練集(Training Set),一份為驗證集(Validation Set),最后一份為測試集(Test Set)。用訓練集來訓練模型,用驗證集來評估模型預測的好壞和選擇模型及其對應的參數。把最終得到的模型再用於測試集,最終決定使用哪個模型以及對應參數。
交叉驗證種類
第一種是簡單交叉驗證,所謂的簡單,是和其他交叉驗證方法相對而言的。首先,我們隨機的將樣本數據分為兩部分(比如: 70%的訓練集,30%的測試集),然后用訓練集來訓練模型,在測試集上驗證模型及參數。接着,我們再把樣本打亂,重新選擇訓練集和測試集,繼續訓練數據和檢驗模型。最后我們選擇損失函數評估最優的模型和參數。
第二種是S折交叉驗證(S-Folder Cross Validation)。和第一種方法不同,S折交叉驗證會把樣本數據隨機的分成S份,每次隨機的選擇S-1份作為訓練集,剩下的1份做測試集。當這一輪完成后,重新隨機選擇S-1份來訓練數據。若干輪(小於S)之后,選擇損失函數評估最優的模型和參數。
第三種是留一交叉驗證(Leave-one-out Cross Validation),它是第二種情況的特例,此時S等於樣本數N,這樣對於N個樣本,每次選擇N-1個樣本來訓練數據,留一個樣本來驗證模型預測的好壞。此方法主要用於樣本量非常少的情況,比如對於普通適中問題,N小於50時,我一般采用留一交叉驗證。
一些問題
Q:為什么CV選出來的model不一定有最佳的表現,如R2指標?
CV的目的只是為了防止模型過擬合,它會在擬合模型后,根據留下來的那個數據集來計算MSE(Mean squared error),比如cv=5就會算5次,我們就可以根據這個來選最優的alpha,因為已經防止過擬合了,所以R2指標不好看,但是在新數據上表現肯定會更好。
模型應用實例
lamanno2016-proliferation
Alex的paper
其他線性模型
普通最小二乘法(Ordinary least squares):
以模型預測值與樣本觀測值的殘差平方和最小作為優化目標。
嶺回歸(Ridge regression)
在普通最小二乘法的基礎上增加懲罰因子以減少共線性的影響,以帶懲罰項(L2正則化)的殘差平方和最小作為優化目標。在指標中同時考慮了較好的學習能力以及較小的慣性能量,以避免過擬合而導致模型泛化能力差。
Lasso 回歸(Least absolute shrinkage and selection operator)
在普通最小二乘法的基礎上增加絕對值偏差作為懲罰項(L1正則化)以減少共線性的影響,在擬合廣義線性模型的同時進行變量篩選和復雜度調整,適用於稀疏系數模型。
多元 Lasso 回歸(Multi-task Lasso)
用於估計多元回歸稀疏系數的線性模型。注意不是指多線程或多任務,而是指對多個輸出變量篩選出相同的特征變量(也即回歸系數整列為 0,因此該列對應的輸入變量可以被刪除)。
彈性網絡回歸(Elastic-Net)
引入L1和L2范數正則化而構成帶有兩種懲罰項的模型,相當於嶺回歸和 Lasso 回歸的組合。
Multi-task Elastic-Net
用於估計多元回歸稀疏系數線性模型的彈性網絡回歸方法。
最小角回歸算法(Least Angle Regression)
結合前向梯度算法和前向選擇算法,在保留前向梯度算法的精確性的同時簡化迭代過程。每次選擇都加入一個與相關度最高的自變量,最多 m步就可以完成求解。特別適合於特征維度遠高於樣本數的情況。
LARS Lasso
使用最小角回歸算法求解 Lasso模型。
正交匹配追蹤法(Orthogonal Matching Pursuit)
用於具有非零系數變量數約束的近似線性模型。在分解的每一步進行正交化處理,選擇刪除與當前殘差最大相關的列,反復迭代達到所需的稀疏程度。
貝葉斯回歸(Bayesian Regression)
用貝葉斯推斷方法求解的線性回歸模型,具有貝葉斯統計模型的基本性質,可以求解權重系數的概率密度函數。可以被用於觀測數據較少但要求提供后驗分布的問題,例如對物理常數的精確估計;也可以用於變量篩選和降維。
邏輯回歸(Logistic Regression)
邏輯回歸是一種廣義線性模型,研究順序變量或屬性變量作為輸出的問題,實際是一種分類方法。通過線性模型加Sigmoid映射函數,將線性模型連續型輸出變換為離散值。常用於估計某種事物的可能性,如尋找危險因素、預測發病概率、判斷患病概率,是流行病學和醫學中最常用的分析方法。
廣義線性回歸(Generalized Linear Regression)
廣義線性回歸是線性回歸模型的推廣,實際上是非線性模型。通過單調可微的聯結函數,建立輸出變量與輸入變量的線性關系,將問題簡潔直接地轉化為線性模型來處理。
隨機梯度下降(Stochastic Gradient Descent)
梯度下降是一種基於搜索的最優化方法,用梯度下降法來求損失函數最小時的參數估計值,適用樣本數(和特征數)非常非常大的情況。隨機梯度下降法在計算下降方向時,隨機選一個數據進行計算,而不是掃描全部訓練數據集,加快了迭代速度。
感知機(Perceptron)
感知機是一種適合大規模學習的簡單分類算法。訓練速度比SGD稍快,並且產生的模型更稀疏。
被動攻擊算法(Passive Aggressive Algorithms)
被動攻擊算法是一類用於大規模學習的算法。
魯棒性回歸(Robustness regression)
魯棒性回歸的目的是在存在損壞數據的情況下擬合回歸模型,如存在異常值或錯誤的情況。
多項式回歸(Polynomial regression)
多項式回歸通過構造特征變量的多項式來擴展簡單的線性回歸模型。例如將特征變量組合成二階多項式,可以將拋物面擬合到數據中,從而具有更廣泛的靈活性和適應性。
邏輯回歸到底是線性的還是非線性的?
邏輯回歸的模型引入了sigmoid函數映射,是非線性模型,但本質上又是一個線性回歸模型,因為除去sigmoid映射函數關系,其他的步驟,算法都是線性回歸的。可以說,邏輯回歸,都是以線性回歸為理論支持的。
只要系數是線性的(沒有平方立方啥的),那模型就算是線性的。
學習的核心資源:
- 發表的paper
- scikit-learn,簡稱sklearn,現成的代碼
- Coursera上的ML教程
參考