目錄
Ridge Regression (嶺回歸)
Lasso Regression
Elasitc Net(彈性網絡)
案例:葡萄酒質量預測
官網地址https://scikit-learn.org/stable/modules/linear_model.html
Ridge Regression (嶺回歸)
API
class?sklearn.linear_model.Ridge(alpha=1.0,?fit_intercept=True,?normalize=False,?copy_X=True,?max_iter=None,?tol=0.001,?solver=’auto’,?random_state=None)
嶺回歸是一種正則化方法,通過在損失函數中加入L2范數懲罰系項,來控制線性模型的復雜程度,從而使模型更加穩健。參數alpha:{float,array-like},shape(n_targets)正則化參數α項,其值越大正則化項越大。其必須是正浮點數。 正則化改善了問題的條件并減少了估計的方差。Alpha對應于其他線性模型(如Logistic回歸或LinearSVC)中的C^-1。 如果傳遞數組,則假定懲罰被特定于目標。 因此,它們必須在數量上對應。fit_intercept:boolean是否計算此模型的截距,即b值。如果為False,則不計算b值(模型會假設你的數據已經中心化)copy_X:boolean,可選,默認為True如果為True,將復制X; 否則,它可能被覆蓋。max_iter:int,可選共軛梯度求解器的最大迭代次數。如果為None,則為默認值(不同silver的默認值不同) 對于'sparse_cg'和'lsqr'求解器,默認值由scipy.sparse.linalg確定。 對于'sag'求解器,默認值為1000。normalize:boolean,可選,默認為False如果為真,則回歸X將在回歸之前被歸一化。 當fit_intercept設置為False時,將忽略此參數。 當回歸量歸一化時,注意到這使得超參數學習更加魯棒,并且幾乎不依賴于樣本的數量。 相同的屬性對標準化數據無效。 然而,如果你想標準化,請在調用normalize = False訓練估計器之前,使用preprocessing.StandardScaler處理數據。solver:{'auto','svd','cholesky','lsqr','sparse_cg','sag'}指定求解最優化問題的算法:'auto':根據數據類型自動選擇求解器。'svd':使用X的奇異值分解來計算Ridge系數。對于奇異矩陣比'cholesky'更穩定。'cholesky':使用標準的scipy.linalg.solve函數來獲得閉合形式的解。'sparse_cg':使用在scipy.sparse.linalg.cg中找到的共軛梯度求解器。作為迭代算法,這個求解器比大規模數據(設置tol和max_iter的可能性)的“cholesky”更合適。'lsqr':使用專用的正則化最小二乘常數scipy.sparse.linalg.lsqr。它是最快的,但可能不是在舊的scipy版本可用。它還使用迭代過程。'sag':使用隨機平均梯度下降。它也使用迭代過程,并且當n_samples和n_feature都很大時,通常比其他求解器更快。注意,“sag”快速收斂僅在具有近似相同尺度的特征上被保證。您可以使用sklearn.preprocessing的縮放器預處理數據。所有最后四個求解器支持密集和稀疏數據。但是,當fit_intercept為True時,只有'sag'支持稀疏輸入。新版本0.17支持:隨機平均梯度下降解算器。tol:float。解的精度,制定判斷迭代收斂與否的閾值。random_state:int seed,RandomState實例或None(默認)僅用于'sag'求解器。如果為整數,則它指定了隨機數生成器的種子。如果為RandomState實例,則指定了隨機數生成器。如果為None,則使用默認的隨機數生成器。?新版本0.17:random_state支持隨機平均漸變。屬性coef_:array,shape(n_features,)或(n_targets,n_features)權重向量。intercept_:float | array,shape =(n_targets,)決策函數的獨立項,即截距b值。 如果fit_intercept = False,則設置為0.0。n_iter_:array或None,shape(n_targets,)每個目標的實際迭代次數。 僅適用于sag和lsqr求解器。 其他求解器將返回None。在版本0.17中出現。
方法
fit(X,y [,sample_weight]):訓練模型。
get_params([deep]):獲取此估計器的參數。
predict(X):使用線性模型進行預測,返回預測值。
score(X,y [,sample_weight]):返回預測性能的得分,不大于1,越大效果越好。
set_params(** params)設置此估計器的參數。
Lasso Regression
API
class sklearn.linear_model.Lasso(alpha=1.0, fit_intercept=True, normalize=False, precompute=False, copy_X=True, max_iter=1000, tol=0.0001, warm_start=False, positive=False, random_state=None, selection='cyclic'屬性:alpha:float, optional。正則項參數。常數。默認值1.0。alpha=0時轉化為最小二乘估計,由線性回歸模型求解。使用Lasso模型時,通常令alpha≠0。fit_intercept:boolean, optional, default True。是否計算截距。如果為False,對數據進行去中心化處理。normalize:boolean, optional, default False。當fit_intercept=False時,該參數忽略。如果為normalize=True,使用回歸模型之前先對回歸數據X進行去均值和除以l2范數的處理。如果要對數據X進行標準化,令normalize=False,并在調用fit方法之前,使用sklearn.preprocessing.StandardScaler進行標準化。precompute:True | False | array-like, default=False是否使用事先計算好的Gram矩陣來加速模型計算。如果precompute='auto',讓程序自動決定。Gram矩陣可以作為參數被傳遞。對于稀疏數據,通常令precompute=True,保留稀疏性。copy_X:boolean, optional, default True如果copy_X=True,復制X;如果copy_X=False,覆蓋上次運行的X。max_iter:int, optional最大迭代次數。tol:float, optional優化容忍度:如果更新大于tol,繼續優化,直到小于tol。warm_start:bool, optional如果warm_start=True,使用上次的解作為初始化;如果warm_start=False,清除之前的解。positive:bool, optional如果positive=True,強制將系數設為正數。random_state:int, RandomState instance or None, optional, default None偽隨機數發生器種子,隨機選擇特征來更新模型。如果為int,random_state即為隨機數發生器使用的種子;如果為RandomState實例,random_state即為隨機數發生器;如果為None,隨機數發生器為np.random使用的隨機數發生器實例。該參數僅當selection=‘random’時使用。selection:str, default ‘cyclic’如果為‘random’,每次迭代都會更新隨機系數,而不是按順序遍歷每個特征。該參數值可以使得算法更快收斂,尤其當tol>1e-4時。坐標軸下降法的下降形式屬性(Attributes)coef_:array, shape (n_features,) | (n_targets, n_features)系數向量。目標函數中的w。sparse_coef_:scipy.sparse matrix, shape (n_features, 1) | (n_targets, n_features)求解的coef_的稀疏表示。intercept_:float | array, shape (n_targets,)決策函數的依賴項。n_iter_:int | array-like, shape (n_targets,)坐標下降法求解達到容忍度時的迭代次數。
方法
fit(X,y,sample_weight=None):X:numpy array或稀疏矩陣,shape(n_samples,n_features)。訓練數據y:numpy array,shape(n_samples,n_targets),對應的目標值sample_weight:numpy array,shape(n_samples),每個樣本單獨的權值。返回一個訓練好的線性模型。get_params(deep=True):獲取模型的參數,返回一個string到任意可能值的映射predict(X):對給定的數據X進行預測X:arrat-like對象或稀疏矩陣。shape(n_samples,n_features)。待測樣本返回:array,shape(n_samples,),對輸入的預測結果score(X,y,sample_weight=None):計算對于X,y的R^2值。R^2=1-u/v. u= ((y_true - y_pred) ** 2).sum() ,v=((y_true - y_true.mean()) ** 2).sum()X:測試樣例,array-like對象,shape(n_samples,n_features)y:X的真實目標值,array-like對象,shape(n_samples,)或者(n_samples, n_outputs)sample_weight:array-like對象,shape(n_samples,),樣本的獨立權值。返回對應的R^2值,floatset_params(**params):設置參數。
Elasitc Net(彈性網絡)
class sklearn.linear_model.ElasticNet(alpha=1.0, l1_ratio=0.5, fit_intercept=True, normalize=False, precompute=False, max_iter=1000, copy_X=True, tol=0.0001, warm_start=False, positive=False, random_state=None, selection=’cyclic’)參數:alpha :?alpha:正則化項中alpha值。l1_ratio:ρ值,ElasticNet混合參數,其中0 <= l1_ratio <= 1。對于l1_ratio = 0,懲罰為L2范數。 對于l1_ratio = 1,為L1范數。 對于0?<l1_ratio<1,懲罰是L1和L2的組合。fit_intercept:一個布爾值,制定是否需要b值。max_iter:一個整數,指定最大迭代數。normalize:一個布爾值。如果為True,那么訓練樣本會在回歸之前會被歸一化。copy_X:一個布爾值。如果為True,會復制X,否則會覆蓋X。precompute:一個布爾值或者一個序列。它決定是否提前計算Gram矩陣來加速計算。Gram也可以傳遞參數,?對于稀疏輸入,此選項始終為“True”以保留稀疏性。tol:一個浮點數,指定判斷迭代收斂與否的一個閾值。warm_start:一個布爾值。如果為True,那么使用前一次訓練結果繼續訓練,否則從頭開始訓練。positive:一個布爾值。如果為True,那么強制要求權重向量的分量都為整數。selection:一個字符串,可以選擇‘cyclic’或者‘random’。它指定了當每輪迭代的時候,選擇權重向量的哪個分量來更新。‘ramdom’:更新的時候,隨機選擇權重向量的一個分量來更新。‘cyclic’:更新的時候,從前向后一次選擇權重向量的一個分量來更新。random_state:一個整數或者一個RandomState實例,或者None。 如果為整數,則它指定了隨機數生成器的種子。如果為RandomState實例,則指定了隨機數生成器。如果為None,則使用默認的隨機數生成器。?屬性:coef_:權重向量。intercept:b值。n_iter_:實際迭代次數。
方法
fix(X,y[,sample_weight]):訓練模型。
predict(X):用模型進行預測,返回預測值。
score(X,y[,sample_weight]):返回預測性能的得分,不大于1,越大效果越好。
get_params([deep]):獲取此估計器的參數。
set_params(** params):設置此估計器的參數。
案例:葡萄酒質量預測
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas as pd
import warnings
import sklearn
from sklearn.linear_model import LinearRegression, LassoCV, RidgeCV, ElasticNetCV
from sklearn.preprocessing import PolynomialFeatures # 數據預處理,標準化
from sklearn.pipeline import Pipeline
from sklearn.linear_model.coordinate_descent import ConvergenceWarning# 設置字符集,防止中文亂碼
mpl.rcParams['font.sans-serif'] = [u'simHei']
mpl.rcParams['axes.unicode_minus'] = False
# 攔截異常,不顯示異常
warnings.filterwarnings(action='ignore', category=ConvergenceWarning)# 創建模擬數據
np.random.seed(100)
np.set_printoptions(linewidth=1000, suppress=True) # 顯示方式設置,每行的字符數用于插入換行符,是否使用科學計數法
N = 10
x = np.linspace(0, 6, N) + np.random.randn(N)
y = 1.8 * x ** 3 + x ** 2 - 14 * x - 7 + np.random.randn(N)
# 將其設置為矩陣
x.shape = -1, 1
y.shape = -1, 1# RidgeCV和Ridge的區別是:前者可以進行交叉驗證
models = [Pipeline([('Poly', PolynomialFeatures(include_bias=False)),('Linear', LinearRegression(fit_intercept=False))]),Pipeline([('Poly', PolynomialFeatures(include_bias=False)),# alpha給定的是Ridge算法中,L2正則項的權重值,也就是ppt中的蘭姆達# alphas是給定CV交叉驗證過程中,Ridge算法的alpha參數值的取值的范圍('Linear', RidgeCV(alphas=np.logspace(-3, 2, 50), fit_intercept=False))]),Pipeline([('Poly', PolynomialFeatures(include_bias=False)),('Linear', LassoCV(alphas=np.logspace(0, 1, 10), fit_intercept=False))]),Pipeline([('Poly', PolynomialFeatures(include_bias=False)),# la_ratio:給定EN算法中L1正則項在整個懲罰項中的比例,這里給定的是一個列表;# 表示的是在CV交叉驗證的過程中,EN算法L1正則項的權重比例的可選值的范圍('Linear', ElasticNetCV(alphas=np.logspace(0, 1, 10), l1_ratio=[.1, .5, .7, .9, .95, 1], fit_intercept=False))])
]# 線性模型過擬合圖形識別
plt.figure(facecolor='w')
degree = np.arange(1, N, 4) # 階
dm = degree.size
colors = [] # 顏色
for c in np.linspace(16711680, 255, dm):colors.append('#%06x' % int(c))model = models[0]
for i, d in enumerate(degree):plt.subplot(int(np.ceil(dm / 2.0)), 2, i + 1)plt.plot(x, y, 'ro', ms=10, zorder=N)# 設置階數model.set_params(Poly__degree=d)# 模型訓練model.fit(x, y.ravel())lin = model.get_params('Linear')['Linear']output = u'%d階,系數為:' % (d)# 判斷lin對象中是否有對應的屬性if hasattr(lin, 'alpha_'):idx = output.find(u'系數')output = output[:idx] + (u'alpha=%.6f, ' % lin.alpha_) + output[idx:]if hasattr(lin, 'l1_ratio_'):idx = output.find(u'系數')output = output[:idx] + (u'l1_ratio=%.6f, ' % lin.l1_ratio_) + output[idx:]print(output, lin.coef_.ravel())x_hat = np.linspace(x.min(), x.max(), num=100) ## 產生模擬數據x_hat.shape = -1, 1y_hat = model.predict(x_hat)s = model.score(x, y)z = N - 1 if (d == 2) else 0label = u'%d階, 正確率=%.3f' % (d, s)plt.plot(x_hat, y_hat, color=colors[i], lw=2, alpha=0.75, label=label, zorder=z)plt.legend(loc='upper left')plt.grid(True)plt.xlabel('X', fontsize=16)plt.ylabel('Y', fontsize=16)plt.tight_layout(1, rect=(0, 0, 1, 0.95))
plt.suptitle(u'線性回歸過擬合顯示', fontsize=22)
plt.show()## 線性回歸、Lasso回歸、Ridge回歸、ElasticNet比較
plt.figure(facecolor='w')
degree = np.arange(1, N, 2) # 階, 多項式擴展允許給定的階數
dm = degree.size
colors = [] # 顏色
for c in np.linspace(16711680, 255, dm):colors.append('#%06x' % int(c))
titles = [u'線性回歸', u'Ridge回歸', u'Lasso回歸', u'ElasticNet']for t in range(4):model = models[t] # 選擇了模型--具體的pipeline(線性、Lasso、Ridge、EN)plt.subplot(2, 2, t + 1) # 選擇具體的子圖plt.plot(x, y, 'ro', ms=10, zorder=N) # 在子圖中畫原始數據點; zorder:圖像顯示在第幾層# 遍歷不同的多項式的階,看不同階的情況下,模型的效果for i, d in enumerate(degree):# 設置階數(多項式)model.set_params(Poly__degree=d)# 模型訓練model.fit(x, y.ravel())# 獲取得到具體的算法模型# model.get_params()方法返回的其實是一個dict對象,后面的Linear其實是dict對應的key# 也是我們在定義Pipeline的時候給定的一個名稱值lin = model.get_params()['Linear']# 打印數據output = u'%s:%d階,系數為:' % (titles[t], d)# 判斷lin對象中是否有對應的屬性if hasattr(lin, 'alpha_'): # 判斷lin這個模型中是否有alpha_這個屬性idx = output.find(u'系數')output = output[:idx] + (u'alpha=%.6f, ' % lin.alpha_) + output[idx:]if hasattr(lin, 'l1_ratio_'): # 判斷lin這個模型中是否有l1_ratio_這個屬性idx = output.find(u'系數')output = output[:idx] + (u'l1_ratio=%.6f, ' % lin.l1_ratio_) + output[idx:]# line.coef_:獲取線性模型的參數列表,也就是我們ppt中的theta值,ravel()將結果轉換為1維數據print(output, lin.coef_.ravel())# 產生模擬數據x_hat = np.linspace(x.min(), x.max(), num=100) ## 產生模擬數據x_hat.shape = -1, 1# 數據預測y_hat = model.predict(x_hat)# 計算準確率s = model.score(x, y)# 當d等于5的時候,設置為N-1層,其它設置0層;將d=5的這條線凸顯出來z = N + 1 if (d == 5) else 0label = u'%d階, 正確率=%.3f' % (d, s)plt.plot(x_hat, y_hat, color=colors[i], lw=2, alpha=0.75, label=label, zorder=z)plt.legend(loc='upper left')plt.grid(True)plt.title(titles[t])plt.xlabel('X', fontsize=16)plt.ylabel('Y', fontsize=16)
plt.tight_layout(1, rect=(0, 0, 1, 0.95))
plt.suptitle(u'各種不同線性回歸過擬合顯示', fontsize=22)
plt.show()
?