網(wǎng)站做的好的醫(yī)院google瀏覽器下載
一. 線性回歸簡介
定義
線性回歸(Linear regression)是利用 回歸方程(函數(shù)) 對 一個或多個自變量(特征值)和因變量(目標值)之間 關(guān)系進行建模的一種分析方式。
回歸方程(函數(shù))
一元線性回歸: y = kx + b => wx + b k: 斜率, 在機器學習中叫 權(quán)重(weight), 簡稱: w b: 截距, 在機器學習中叫 偏差/偏置(bios), 簡稱: b
多元線性回歸: y = w1x1 + w2x2 + w3x3... + b => w轉(zhuǎn)置 * x + b
★線性回歸的分類
一元線性回歸
目標值只與一個因變量有關(guān)系
1個特征, 1個標簽
多元線性回歸
目標值只與多個因變量有關(guān)系
多個特征, 1個標簽
★應(yīng)用場景
有特征, 有標簽, 且標簽是 連續(xù)的
二. 線性回歸問題求解
線性回歸API
線性回歸API介紹
代碼演示
# 導(dǎo)包 from sklearn.linear_model import LinearRegression ? ? # 1. 準備數(shù)據(jù) # 訓練集數(shù)據(jù) x_train = [[160], [166], [172], [174], [180]] y_train = [56.3, 60.6, 65.1, 68.5, 75] ? # 2. 創(chuàng)建 線性回歸 模型對象 estimator = LinearRegression() ? # 3. 模型訓練 estimator.fit(x_train, y_train) ? # 4. 模型評估(暫時略過) ? # 5. 模型預(yù)測 # 查看模型參數(shù), 即: 斜率(權(quán)重) 和 截距(偏置) print(f'斜率k(w): {estimator.coef_}') ? ? ? ? # [0.92942177] print(f'截距b: {estimator.intercept_}') ? ?# -93.27346938775514 ? # 模型預(yù)測 x_test = [[176]] y_predict = estimator.predict(x_test) print(f'預(yù)測結(jié)果:{y_predict}') ? ? ? ? ?# [70.3047619]
★損失函數(shù)
求解最優(yōu) 斜率 和 截距(擬合結(jié)果)
誤差概念
用預(yù)測值y – 真實值y 就是 誤差
損失函數(shù)
衡量每個樣本預(yù)測值與真實值效果的函數(shù)
公式推導(dǎo)
損失函數(shù)分類
損失函數(shù): 用來衡量 預(yù)測值 和 真實值關(guān)系的, 分類如下:
-
最小二乘法:
每個樣本的 預(yù)估值 - 真實值 的平方和
-
均方誤差(Mean Square Error => MSE):
每個樣本的 預(yù)估值 - 真實值 的平方和 / 樣本數(shù)
-
平均絕對誤差(Mean Absolute Error => MAE)
每個樣本的 預(yù)估值 - 真實值 的絕對值的 和 / 樣本數(shù)
線性回歸求解步驟
損失函數(shù)優(yōu)化方向, 即: 讓損失函數(shù)值最小 方式1: 梯度下降法. 方式2: 正規(guī)方程(求導(dǎo), 求偏導(dǎo))
復(fù)習-導(dǎo)數(shù)和矩陣
數(shù)據(jù)表述
導(dǎo)數(shù)
函數(shù)上某一個點的切線就是導(dǎo)數(shù), 瞬時速度變化率
基本公式
四則運算
復(fù)合函數(shù)求導(dǎo):
g(h)是外函數(shù)h(x)是內(nèi)函數(shù)。先對外函數(shù)求導(dǎo),再對內(nèi)函數(shù)求導(dǎo)
偏導(dǎo)
向量
向量范數(shù)
矩陣
正規(guī)方程法
只適用于線性回歸
一元線性回歸推導(dǎo)
多元線性回歸推導(dǎo)
★梯度下降算法
思想原理
輸入:初始化位置S;每步距離為a 。輸出:從位置S到達山底
步驟1:令初始化位置為山的任意位置S
步驟2:在當前位置環(huán)顧四周,如果四周都比S高返回S;否則執(zhí)行步驟3
步驟3: 在當前位置環(huán)顧四周,尋找坡度最陡的方向,令其為x方向
步驟4:沿著x方向往下走,長度為a,到達新的位置S'
步驟5:在S'位置環(huán)顧四周,如果四周都比S^‘高,則返回S^‘。否則轉(zhuǎn)到步驟3
梯度下降過程就和下山場景類似, 可微分的損失函數(shù),代表著一座山, 尋找的函數(shù)的最小值,也就是山底.
梯度 gradient grad
單變量函數(shù)中,梯度就是某一點切線斜率(某一點的導(dǎo)數(shù));有方向為函數(shù)增長最快的方向
多變量函數(shù)中,梯度就是某一個點的偏導(dǎo)數(shù);有方向:偏導(dǎo)數(shù)分量的向量方向
梯度下降公式
單變量
多變量
總結(jié)梯度下降
梯度下降案例-信貸
梯度下降算法分類
分類
優(yōu)缺點
正規(guī)方程梯度下降對比
三. 回歸模型的評估方法
★MAE-平均絕對誤差
MSE-均方誤差
★RMSE-均方根誤差
MAE 和 RMSE 接近, 都表明模型的誤差很低, MAE 或 RMSE 越小, 誤差越小
RMSE的計算公式中有一個平方項, 因此大的誤差將被平方, 因此會增加RMSE的值, 大多數(shù)情況下RMSE>MAE
RMSE會放大預(yù)測誤差較大的樣本對結(jié)果的影響,
而MAE 只是給出了平均誤差
結(jié)論:RMSE > MAE都能反應(yīng)真實誤差,但是RMSE會對異常點更加敏感
四. 線性回歸API和案例
線性回歸API
正規(guī)方程
sklearn.linear_model.LinearRegression(fit_intercept=True)
通過正規(guī)方程優(yōu)化
參數(shù):fit_intercept,是否計算偏置
屬性:
LinearRegression.coef_ (回歸系數(shù))
LinearRegression.intercept_(偏置)
梯度下降
sklearn.linear_model.SGDRegressor(loss="squared_loss", fit_intercept=True, learning_rate ='constant', eta0=0.01)
SGDRegressor類實現(xiàn)了隨機梯度下降學習,它支持不同的損失函數(shù)和正則化懲罰項,來擬合線性回歸模型。
參數(shù)
loss(損失函數(shù)類型)eg:loss=”squared_loss
fit_intercept(是否計算偏置)
learning_rate (學習率策略):string, optional ,可以配置學習率隨著迭代次數(shù)不斷減小, 比如:學習率不斷變小策略: ‘invscaling’: eta = eta0 / pow(t, power_t=0.25)
eta0=0.01 (學習率的值)
屬性
SGDRegressor.coef_ (回歸系數(shù))SGDRegressor.intercept_ (偏置)
★波士頓房價預(yù)測
正規(guī)方程
from sklearn.preprocessing import StandardScaler ?# 特征處理 from sklearn.model_selection import train_test_split ?# 數(shù)據(jù)集劃分 from sklearn.linear_model import LinearRegression ?# 正規(guī)方程的回歸模型 from sklearn.linear_model import SGDRegressor ?# 梯度下降的回歸模型 from sklearn.metrics import mean_squared_error, mean_absolute_error, root_mean_squared_error ?# 均方誤差評估 from sklearn.linear_model import Ridge, RidgeCV ? import pandas as pd import numpy as np ? # 1. 加載數(shù)據(jù) # 數(shù)據(jù)地址 data_url = "http://lib.stat.cmu.edu/datasets/boston" # pandas讀取數(shù)據(jù) raw_df = pd.read_csv(data_url, sep="\\s+", skiprows=22, header=None) # 獲取特征數(shù)據(jù)集 data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]]) # 獲取標簽數(shù)據(jù)集 target = raw_df.values[1::2, 2] ? # 2. 數(shù)據(jù)預(yù)處理: 把總數(shù)據(jù)506條 按8:2劃分 x_train, x_test, y_train, y_test = train_test_split(data, target,test_size=0.2,random_state=21 ) ? # 3. 特征工程: 特征預(yù)處理(標準化, 歸一化) # 創(chuàng)建標準化對象 transfer = StandardScaler() # 標準化訓練集 x_train = transfer.fit_transform(x_train) # 標準化測試集 x_test = transfer.transform(x_test) print(len(x_train), len(x_test)) ? # 4. 模型訓練 # 創(chuàng)建線性回歸模型對象 => 正規(guī)方程 estimator = LinearRegression(fit_intercept=True) # 訓練模型 estimator.fit(x_train, y_train) # 打印模型的 權(quán)重和偏置 print('權(quán)重', estimator.coef_) print('偏置', estimator.intercept_) ? # 5. 模型預(yù)測 y_predict = estimator.predict(x_test) print(y_predict) ? # 6. 模型評估 # 基于 預(yù)測值 和 真實值 計算 模型的 均方誤差 print(f'該模型的均方誤差: {mean_squared_error(y_test, y_predict)}') print(f'該模型的平均絕對誤差: {mean_absolute_error(y_test, y_predict)}') print(f'該模型的均方根誤差: {root_mean_squared_error(y_test, y_predict)}')
梯度下降
from sklearn.preprocessing import StandardScaler ?# 特征處理 from sklearn.model_selection import train_test_split ?# 數(shù)據(jù)集劃分 from sklearn.linear_model import LinearRegression ?# 正規(guī)方程的回歸模型 from sklearn.linear_model import SGDRegressor ?# 梯度下降的回歸模型 from sklearn.metrics import mean_squared_error, mean_absolute_error, root_mean_squared_error ?# 均方誤差, 平均絕對誤差, 均方根誤差評估 from sklearn.linear_model import Ridge, RidgeCV ? import pandas as pd import numpy as np ? # 1. 加載數(shù)據(jù) # 數(shù)據(jù)地址 data_url = "http://lib.stat.cmu.edu/datasets/boston" # pandas讀取數(shù)據(jù) raw_df = pd.read_csv(data_url, sep="\\s+", skiprows=22, header=None) # 獲取特征數(shù)據(jù)集 data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]]) # 獲取標簽數(shù)據(jù)集 target = raw_df.values[1::2, 2] ? # 2. 數(shù)據(jù)預(yù)處理: 把總數(shù)據(jù)506條 按8:2劃分 x_train, x_test, y_train, y_test = train_test_split(data, target,test_size=0.2,random_state=21 ) ? # 3. 特征工程: 特征預(yù)處理(標準化, 歸一化) # 創(chuàng)建標準化對象 transfer = StandardScaler() # 標準化訓練集 x_train = transfer.fit_transform(x_train) # 標準化測試集 x_test = transfer.transform(x_test) print(len(x_train), len(x_test)) ? # 4. 模型訓練 # 創(chuàng)建線性回歸模型對象 => 梯度下降. # 理解: 新的點 = 當前點 - 學習率 * 梯度(偏導(dǎo)) # estimator = LinearRegression(fit_intercept=True) # 正規(guī)方程 # constant: 常量, 即: 學習率的值 # eta0: 學習率(梯度下降公式中的α) # max_iter: 最大迭代次數(shù) estimator = SGDRegressor(fit_intercept=True,learning_rate='constant',eta0=0.001,max_iter=1000000 ) # 訓練模型 estimator.fit(x_train, y_train) # 打印模型的 權(quán)重和偏置 print('權(quán)重', estimator.coef_) print('偏置', estimator.intercept_) ? # 5. 模型預(yù)測 y_predict = estimator.predict(x_test) print(y_predict) ? # 6. 模型評估 # 基于 預(yù)測值 和 真實值 計算 模型的 均方誤差 print(f'該模型的均方誤差: {mean_squared_error(y_test, y_predict)}') print(f'該模型的平均絕對誤差: {mean_absolute_error(y_test, y_predict)}') print(f'該模型的均方根誤差: {root_mean_squared_error(y_test, y_predict)}')
五. 模型擬合問題
復(fù)習欠擬合與過擬合
欠擬合:模型在訓練集和測試集上表現(xiàn)都不好。模型過于簡單
正好擬合(泛化程度較高): 模型在訓練集, 測試集上表現(xiàn)效果都比較好.
過擬合:模型在訓練集上表現(xiàn)好,在測試集上表現(xiàn)不好。模型過于復(fù)雜
欠擬合在訓練集和測試集上的誤差都較大
過擬合在訓練集上誤差較小,而測試集上誤差較大
欠擬合
代碼
# 導(dǎo)包 import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error ?# 計算均方誤差 from sklearn.linear_model import Ridge, Lasso ? ? # 1. 定義函數(shù), 表示: 欠擬合. def dm01_欠擬合():# 1. 準備數(shù)據(jù).# 準備噪聲(可以簡單理解為就是: 隨機種子), 噪聲相同, 每次生成的隨機數(shù)(點)相同.np.random.seed(21)# x: 表示特征, -3 ~ 3之間 隨機的小數(shù), 生成: 100個.x = np.random.uniform(-3, 3, size=100)# y: 表示標簽(目標值), 線性關(guān)系: y = 0.5x2 + x + 2 + 正態(tài)分布 + 噪聲.# np.random.normal(0, 1, size=100) 意思是: 均值為0, 標準差為1, 生成100個.y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100) ?# 模型訓練.# 2. 創(chuàng)建 線性回歸-正規(guī)方程 模型對象.estimator = LinearRegression(fit_intercept=True) ?# 計算: 偏置.# 3. 對數(shù)據(jù)集做處理.X = x.reshape(-1, 1)# print(f'處理前 x => {x}') ? ? # 假設(shè): x = [1, 2, 3]# print(f'處理后 X => {X}') ? ? # 處理后: X = [[1], [2], [3]]# 4. 模型訓練.estimator.fit(X, y) ?# 這里傳的是, 處理后的x的值, 即: 二維數(shù)組.# 5. 模型預(yù)測.y_predict = estimator.predict(X)print(f'預(yù)測值為: {y_predict}')# 6. 模型評估.print(f'均方誤差: {mean_squared_error(y, y_predict)}') ?# 2.0683653437315512# 7. 數(shù)據(jù)可視化, 繪制圖像.plt.scatter(x, y) ?# 基于: 原始的x(特征), y值(真實值)繪制 散點圖.plt.plot(x, y_predict, c='r') ?# 基于: 原值的x(特征), y值(預(yù)測值)繪制 折線圖(就是我們的 擬合回歸線)plt.show()
結(jié)果
數(shù)據(jù)是拋物線=> 非線性, 用線性模型擬合, 模型過于簡單, 欠擬合
產(chǎn)生原因
學習到數(shù)據(jù)的特征過少
解決辦法
1)添加其他特征項,有時出現(xiàn)欠擬合是因為特征項不夠?qū)е碌?#xff0c;可以添加其他特征項來解決, 例如: “組合”、“泛化”、“相關(guān)性”三類特征是特征添加的重要手段
2)添加多項式特征,模型過于簡單時的常用套路,例如將線性模型通過添加二次項或三次項使模型泛化能力更強
正擬合
代碼
def dm02_正好擬合():# 1. 準備數(shù)據(jù).# 準備噪聲(可以簡單理解為就是: 隨機種子), 噪聲相同, 每次生成的隨機數(shù)(點)相同.np.random.seed(21)# x: 表示特征, -3 ~ 3之間 隨機的小數(shù), 生成: 100個.x = np.random.uniform(-3, 3, size=100)# y: 表示標簽(目標值), 線性關(guān)系: y = 0.5x2 + x + 2 + 正態(tài)分布 + 噪聲.# np.random.normal(0, 1, size=100) 意思是: 均值為0, 標準差為1, 生成100個.y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100) ?# 模型訓練.# 2. 創(chuàng)建 線性回歸-正規(guī)方程 模型對象.estimator = LinearRegression(fit_intercept=True) ?# 計算: 偏置.# 3. 對數(shù)據(jù)集做處理.# 3.1 把數(shù)據(jù)從 一維數(shù)組 => 二維數(shù)組, 即: 從 [1, 2, 3] => [[1], [2], [3]]X = x.reshape(-1, 1)# 3.2 拼接: x 和 x的平方, 把數(shù)據(jù)從 [[1], [2], [3]] => [[1, 1], [2, 4], [3, 9]] ? 一元線性回歸 => 二元線性回歸X2 = np.hstack([X, X ** 2]) ?#print(f'處理前 x => {x}') ?# 假設(shè): x = [1, 2, 3]print(f'處理后 X => {X}') ?# 處理后: X = [[1], [2], [3]]print(f'處理后 X2 => {X2}') ?# 處理后: X2 = [[1, 1], [2, 4], [3, 9]] ?# 4. 模型訓練.estimator.fit(X2, y) ?# 這里傳的是, 處理后的x的值, 即: 二維數(shù)組 => 二元線性回歸# 5. 模型預(yù)測.y_predict = estimator.predict(X2)print(f'預(yù)測值為: {y_predict}')# 6. 模型評估.print(f'均方誤差: {mean_squared_error(y, y_predict)}') ?# 均方誤差: 1.0009503498374301# 7. 數(shù)據(jù)可視化, 繪制圖像.plt.scatter(x, y) ?# 基于: 原始的x(特征), y值(真實值)繪制 散點圖. ?# 細節(jié): 要對x的值進行升序排列, 然后再繪制, 否則會出現(xiàn): 散點沒有連貫性.# plt.plot(x, y_predict, c='r') # 基于: 原值的x(特征), y值(預(yù)測值)繪制 折線圖(就是我們的 擬合回歸線)# np.sort(x): 按照x的值 升序排列.# np.argsort(x): 按照x的值 升序排列, 返回(x對應(yīng)的)索引值.plt.plot(np.sort(x), y_predict[np.argsort(x)], c='r') ?# 基于: 原值的x(特征), y值(預(yù)測值)繪制 折線圖(就是我們的 擬合回歸線)plt.show()
結(jié)果
數(shù)據(jù)是一元二次方程拋物線, 給模型的數(shù)據(jù), 增加x2項特征, 再用線性模型擬合, 模型結(jié)果正擬合
過擬合
代碼
def dm03_過擬合():# 1. 準備數(shù)據(jù).# 準備噪聲(可以簡單理解為就是: 隨機種子), 噪聲相同, 每次生成的隨機數(shù)(點)相同.np.random.seed(21)# x: 表示特征, -3 ~ 3之間 隨機的小數(shù), 生成: 100個.x = np.random.uniform(-3, 3, size=100)# y: 表示標簽(目標值), 線性關(guān)系: y = 0.5x2 + x + 2 + 正態(tài)分布 + 噪聲.# np.random.normal(0, 1, size=100) 意思是: 均值為0, 標準差為1, 生成100個.y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100) ?# 模型訓練.# 2. 創(chuàng)建 線性回歸-正規(guī)方程 模型對象.estimator = LinearRegression(fit_intercept=True) ?# 計算: 偏置.# 3. 對數(shù)據(jù)集做處理.# 3.1 把數(shù)據(jù)從 一維數(shù)組 => 二維數(shù)組, 即: 從 [1, 2, 3] => [[1], [2], [3]]X = x.reshape(-1, 1)# 3.2 拼接: x, x的平方, x的立方, x的四次方..., 把數(shù)據(jù)從 [[1], [2], [3]] => [[1, 1....], [2, 4, 8, 16, 32, 64...], [3, 9, 27...]] ? 一元線性回歸 => 二元線性回歸X3 = np.hstack([X, X ** 2, X ** 3, X ** 4, X ** 5, X ** 6, X ** 7, X ** 8, X ** 9, X ** 10]) ?# 繼續(xù)增加 最高次項print(f'處理前 x => {x}') ?# 假設(shè): x = [1, 2, 3]print(f'處理后 X => {X}') ?# 處理后: X = [[1], [2], [3]]print(f'處理后 X2 => {X3}') ?# 處理后: X = [[1], [2], [3]] ?# 4. 模型訓練.estimator.fit(X3, y) ?# 這里傳的是, 處理后的x的值, 即: 二維數(shù)組 => 多元線性回歸# 5. 模型預(yù)測.y_predict = estimator.predict(X3)print(f'預(yù)測值為: {y_predict}')# 6. 模型評估.print(f'均方誤差: {mean_squared_error(y, y_predict)}') ?# 均方誤差: 0.9646255969834893# 7. 數(shù)據(jù)可視化, 繪制圖像.plt.scatter(x, y) ?# 基于: 原始的x(特征), y值(真實值)繪制 散點圖. ?# 細節(jié): 要對x的值進行升序排列, 然后再繪制, 否則會出現(xiàn): 散點沒有連貫性.# plt.plot(x, y_predict, c='r') # 基于: 原值的x(特征), y值(預(yù)測值)繪制 折線圖(就是我們的 擬合回歸線)# np.sort(x): 按照x的值 升序排列.# np.argsort(x): 按照x的值 升序排列, 返回(x對應(yīng)的)索引值.plt.plot(np.sort(x), y_predict[np.argsort(x)], c='r') ?# 基于: 原值的x(特征), y值(預(yù)測值)繪制 折線圖(就是我們的 擬合回歸線)plt.show()
結(jié)果
數(shù)據(jù)是一元二次的, 特征值含有多個高次項, 模型過于復(fù)雜, 學習到臟數(shù)據(jù), 過擬合
產(chǎn)生原因
原始特征過多,存在一些嘈雜特征, 模型過于復(fù)雜是因為模型嘗試去兼顧所有測試樣本
解決辦法
1)重新清洗數(shù)據(jù)
導(dǎo)致過擬合的一個原因有可能是數(shù)據(jù)不純,如果出現(xiàn)了過擬合就需要重新清洗數(shù)據(jù)。
2)增大數(shù)據(jù)的訓練量
還有一個原因就是我們用于訓練的數(shù)據(jù)量太小導(dǎo)致的,訓練數(shù)據(jù)占總數(shù)據(jù)的比例過小。
3)正則化
4)減少特征維度
正則化
解釋正則化
在解決回歸過擬合
中,我們選擇正則化。但是對于其他機器學習算法如分類算法來說也會出現(xiàn)這樣的問題,除了一些算法本身作用之外(決策樹、神經(jīng)網(wǎng)絡(luò)),我們更多的也是去自己做特征選擇,包括之前說的刪除、合并一些特征
在學習的時候,數(shù)據(jù)提供的特征有些影響模型復(fù)雜度或者這個特征的數(shù)據(jù)點異常較多,所以算法在學習的時候盡量減少這個特征的影響(甚至刪除某個特征的影響),這就是正則化
注:調(diào)整時候,算法并不知道某個特征影響,而是去調(diào)整參數(shù)得出優(yōu)化的結(jié)
★L1正則化
概念原理
L1正則化,在損失函數(shù)中添加L1正則化項
α 叫做懲罰系數(shù)
,該值越大則權(quán)重調(diào)整的幅度就越大,即:表示對特征權(quán)重懲罰力度就越大
L1 正則化會使得權(quán)重趨向于 0,甚至等于 0
,使得某些特征失效
,達到特征篩選
的目的
代碼演示
# 4. 定義函數(shù), 表示: L1正則化 => 解決 過擬合問題的, 降低模型復(fù)雜度, 可能會使得權(quán)重變?yōu)? => 特征選取. def dm04_L1正則化():# 1. 準備數(shù)據(jù).# 準備噪聲(可以簡單理解為就是: 隨機種子), 噪聲相同, 每次生成的隨機數(shù)(點)相同.np.random.seed(21)# x: 表示特征, -3 ~ 3之間 隨機的小數(shù), 生成: 100個.x = np.random.uniform(-3, 3, size=100)# y: 表示標簽(目標值), 線性關(guān)系: y = 0.5x2 + x + 2 + 正態(tài)分布 + 噪聲.# np.random.normal(0, 1, size=100) 意思是: 均值為0, 標準差為1, 生成100個.y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100) ?# 模型訓練.# 2. 創(chuàng)建 線性回歸-正規(guī)方程 模型對象.# estimator = LinearRegression(fit_intercept=True) ? # 計算: 偏置.# 2. 創(chuàng)建 線性回歸-L1正則化 模型對象.estimator = Lasso(alpha=0.1) ?# alpha: 正則化參數(shù), 其值越大, 則正則化程度越高, 即: 權(quán)重值越小, 則越容易被截斷為0. ?# 3. 對數(shù)據(jù)集做處理.# 3.1 把數(shù)據(jù)從 一維數(shù)組 => 二維數(shù)組, 即: 從 [1, 2, 3] => [[1], [2], [3]]X = x.reshape(-1, 1)# 3.2 拼接: x, x的平方, x的立方, x的四次方..., 把數(shù)據(jù)從 [[1], [2], [3]] => [[1, 1....], [2, 4, 8, 16, 32, 64...], [3, 9, 27...]] ? 一元線性回歸 => 二元線性回歸X3 = np.hstack([X, X ** 2, X ** 3, X ** 4, X ** 5, X ** 6, X ** 7, X ** 8, X ** 9, X ** 10]) ?# 繼續(xù)增加 最高次項print(f'處理前 x => {x}') ?# 假設(shè): x = [1, 2, 3]print(f'處理后 X => {X}') ?# 處理后: X = [[1], [2], [3]]print(f'處理后 X2 => {X3}') ?# 處理后: X = [[1], [2], [3]] ?# 4. 模型訓練.estimator.fit(X3, y) ?# 這里傳的是, 處理后的x的值, 即: 二維數(shù)組 => 多元線性回歸# 5. 模型預(yù)測.y_predict = estimator.predict(X3)print(f'預(yù)測值為: {y_predict}')# 6. 模型評估.print(f'均方誤差: {mean_squared_error(y, y_predict)}') ?# 均方誤差: 1.026270345364126# 7. 數(shù)據(jù)可視化, 繪制圖像.plt.scatter(x, y) ?# 基于: 原始的x(特征), y值(真實值)繪制 散點圖. ?# 細節(jié): 要對x的值進行升序排列, 然后再繪制, 否則會出現(xiàn): 散點沒有連貫性.# plt.plot(x, y_predict, c='r') # 基于: 原值的x(特征), y值(預(yù)測值)繪制 折線圖(就是我們的 擬合回歸線)# np.sort(x): 按照x的值 升序排列.# np.argsort(x): 按照x的值 升序排列, 返回(x對應(yīng)的)索引值.plt.plot(np.sort(x), y_predict[np.argsort(x)], c='r') ?# 基于: 原值的x(特征), y值(預(yù)測值)繪制 折線圖(就是我們的 擬合回歸線)plt.show()
結(jié)果圖
Lasso回歸L1正則 會將高次方項系數(shù)變?yōu)?
★L2正則化
概念原理
L2正則化,在損失函數(shù)中添加L2正則化項
α 叫做懲罰系數(shù)
,該值越大則權(quán)重調(diào)整的幅度就越大,即:表示對特征權(quán)重懲罰力度就越大
L2 正則化會使得權(quán)重趨向于 0,一般不等于 0
代碼演示
# 5. 定義函數(shù), 表示: L2正則化 => 解決 過擬合問題的, 降低模型復(fù)雜度. 會使得權(quán)重趨向于0, 不會變?yōu)?. def dm05_L2正則化():# 1. 準備數(shù)據(jù).# 準備噪聲(可以簡單理解為就是: 隨機種子), 噪聲相同, 每次生成的隨機數(shù)(點)相同.np.random.seed(21)# x: 表示特征, -3 ~ 3之間 隨機的小數(shù), 生成: 100個.x = np.random.uniform(-3, 3, size=100)# y: 表示標簽(目標值), 線性關(guān)系: y = 0.5x2 + x + 2 + 正態(tài)分布 + 噪聲.# np.random.normal(0, 1, size=100) 意思是: 均值為0, 標準差為1, 生成100個.y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100) ?# 模型訓練.# 2. 創(chuàng)建 線性回歸-正規(guī)方程 模型對象.# estimator = LinearRegression(fit_intercept=True) ? # 計算: 偏置.# 2. 創(chuàng)建 線性回歸-L2正則化 模型對象.estimator = Ridge(alpha=0.1) ?# alpha: 正則化參數(shù), 其值越大, 則正則化程度越高, 即: 權(quán)重值越小, 則越容易被截斷為0. ?# 3. 對數(shù)據(jù)集做處理.# 3.1 把數(shù)據(jù)從 一維數(shù)組 => 二維數(shù)組, 即: 從 [1, 2, 3] => [[1], [2], [3]]X = x.reshape(-1, 1)# 3.2 拼接: x, x的平方, x的立方, x的四次方..., 把數(shù)據(jù)從 [[1], [2], [3]] => [[1, 1....], [2, 4, 8, 16, 32, 64...], [3, 9, 27...]] ? 一元線性回歸 => 二元線性回歸X3 = np.hstack([X, X ** 2, X ** 3, X ** 4, X ** 5, X ** 6, X ** 7, X ** 8, X ** 9, X ** 10]) ?# 繼續(xù)增加 最高次項print(f'處理前 x => {x}') ?# 假設(shè): x = [1, 2, 3]print(f'處理后 X => {X}') ?# 處理后: X = [[1], [2], [3]]print(f'處理后 X2 => {X3}') ?# 處理后: X = [[1], [2], [3]] ?# 4. 模型訓練.estimator.fit(X3, y) ?# 這里傳的是, 處理后的x的值, 即: 二維數(shù)組 => 多元線性回歸# 5. 模型預(yù)測.y_predict = estimator.predict(X3)print(f'預(yù)測值為: {y_predict}')# 6. 模型評估.print(f'均方誤差: {mean_squared_error(y, y_predict)}') ?# 均方誤差: 0.964988964298911# 7. 數(shù)據(jù)可視化, 繪制圖像.plt.scatter(x, y) ?# 基于: 原始的x(特征), y值(真實值)繪制 散點圖. ?# 細節(jié): 要對x的值進行升序排列, 然后再繪制, 否則會出現(xiàn): 散點沒有連貫性.# plt.plot(x, y_predict, c='r') # 基于: 原值的x(特征), y值(預(yù)測值)繪制 折線圖(就是我們的 擬合回歸線)# np.sort(x): 按照x的值 升序排列.# np.argsort(x): 按照x的值 升序排列, 返回(x對應(yīng)的)索引值.plt.plot(np.sort(x), y_predict[np.argsort(x)], c='r') ?# 基于: 原值的x(特征), y值(預(yù)測值)繪制 折線圖(就是我們的 擬合回歸線)plt.show()
結(jié)果圖
Ridge線性回歸l2正則不會將系數(shù)變?yōu)? 但是對高次方項系數(shù)影響較大
L1與L2的區(qū)別
工程開發(fā)中L1、L2使用建議:一般傾向使用L2正則。
相同點
都可以降低模型的復(fù)雜度, 都可以解決: 過擬合問題.
不同點
L1正則化會使得特征的權(quán)重變?yōu)?, 一般適用于: 特征選取.L2正則化會使得特征的權(quán)重趨向于0, 不會變?yōu)榱? 可以解決 過擬合問題, 一般首選用 它.