本文目錄:
- 一、欠擬合
- 二、過擬合
- 三、擬合問題原因及解決辦法
- 四、正則化:盡量減少高次冪特征的影響
- (一)L1正則化
- (二)L2正則化
- (三)L1正則化與L2正則化的對比
- 五、正好擬合代碼(附贈)
一、欠擬合
欠擬合:一個假設 在訓練數據上不能獲得更好的擬合,并且在測試數據集上也不能很好地擬合數據 ,此時認為這個假設出現了欠擬合的現象。(模型過于簡單)
欠擬合代碼實現:
例:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error # 計算均方誤差
from sklearn.model_selection import train_test_splitdef dm01_欠擬合():# 1. 準備x, y數據, 增加上噪聲.# 用于設置隨機數生成器的種子(seed), 種子一樣, 每次生成相同序列.np.random.seed(666)# x: 隨機數, 范圍為 (-3, 3), 100個.x = np.random.uniform(-3, 3, size=100)# loc: 均值, scale: 標準差, normal: 正態分布.y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100)# 2. 實例化 線性回歸模型.estimator = LinearRegression()# 3. 訓練模型X = x.reshape(-1, 1)estimator.fit(X, y)# 4. 模型預測.y_predict = estimator.predict(X)print("預測值:", y_predict)# 5. 計算均方誤差 => 模型評估print(f'均方誤差: {mean_squared_error(y, y_predict)}')# 6. 畫圖plt.scatter(x, y) # 散點圖plt.plot(x, y_predict, color='r') # 折線圖(預測值, 擬合回歸線)plt.show() # 具體的繪圖if __name__ == '__main__':dm01_欠擬合()
運行結果:
二、過擬合
過擬合:一個假設 在訓練數據上能夠獲得比其他假設更好的擬合, 但是在測試數據集上卻不能很好地擬合數據 (體現在準確率下降),此時認為這個假設出現了過擬合的現象。
過擬合代碼實現:
例:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error # 計算均方誤差
from sklearn.model_selection import train_test_splitdef dm03_過擬合():# 1. 準備x, y數據, 增加上噪聲.# 用于設置隨機數生成器的種子(seed), 種子一樣, 每次生成相同序列.np.random.seed(666)# x: 隨機數, 范圍為 (-3, 3), 100個.x = np.random.uniform(-3, 3, size=100)# loc: 均值, scale: 標準差, normal: 正態分布.y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100)# 2. 實例化 線性回歸模型.estimator = LinearRegression()# 3. 訓練模型X = x.reshape(-1, 1)# hstack() 函數用于將多個數組在行上堆疊起來, 即: 數據增加高次項.X3 = np.hstack([X, X**2, X**3, X**4, X**5, X**6, X**7, X**8, X**9, X**10])estimator.fit(X3, y)# 4. 模型預測.y_predict = estimator.predict(X3)print("預測值:", y_predict)# 5. 計算均方誤差 => 模型評估print(f'均方誤差: {mean_squared_error(y, y_predict)}')# 6. 畫圖plt.scatter(x, y) # 散點圖# sort() 該函數直接返回一個排序后的新數組。# numpy.argsort() 該函數返回的是數組值從小到大排序時對應的索引值plt.plot(np.sort(x), y_predict[np.argsort(x)], color='r') # 折線圖(預測值, 擬合回歸線)plt.show() # 具體的繪圖if __name__ == '__main__':dm03_過擬合()
運行結果:
三、擬合問題原因及解決辦法
1.欠擬合產生原因: 學習到數據的特征過少。
解決辦法:
1)添加其他特征項,有時出現欠擬合是因為特征項不夠導致的,可以添加其他特征項來解決。
2)添加多項式特征,模型過于簡單時的常用套路,例如將線性模型通過添加二次項或三次項使模型泛化能力更強。
2.過擬合產生原因: 原始特征過多,存在一些嘈雜特征, 模型過于復雜是因為模型嘗試去兼顧所有測試樣本。
解決辦法:
1)重新清洗數據,導致過擬合的一個原因有可能是數據不純,如果出現了過擬合就需要重新清洗數據。
2)增大數據的訓練量,還有一個原因就是我們用于訓練的數據量太小導致的,訓練數據占總數據的比例過小。
3)正則化
4)減少特征維度。
四、正則化:盡量減少高次冪特征的影響
(一)L1正則化
LASSO回歸: from sklearn.linear_model import Lasso
代碼如下:
from sklearn.linear_model import Lasso # L1正則
from sklearn.linear_model import Ridge # 嶺回歸 L2正則def dm04_模型過擬合_L1正則化():# 1. 準備x, y數據, 增加上噪聲.# 用于設置隨機數生成器的種子(seed), 種子一樣, 每次生成相同序列.np.random.seed(666)# x: 隨機數, 范圍為 (-3, 3), 100個.x = np.random.uniform(-3, 3, size=100)# loc: 均值, scale: 標準差, normal: 正態分布.y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100)# 2. 實例化L1正則化模型, 做實驗: alpha懲罰力度越來越大, k值越來越小.estimator = Lasso(alpha=0.005)# 3. 訓練模型X = x.reshape(-1, 1)# hstack() 函數用于將多個數組在行上堆疊起來, 即: 數據增加高次項.X3 = np.hstack([X, X**2, X**3, X**4, X**5, X**6, X**7, X**8, X**9, X**10])estimator.fit(X3, y)print(f'權重: {estimator.coef_}')# 4. 模型預測.y_predict = estimator.predict(X3)print("預測值:", y_predict)# 5. 計算均方誤差 => 模型評估print(f'均方誤差: {mean_squared_error(y, y_predict)}')# 6. 畫圖plt.scatter(x, y) # 散點圖# sort() 該函數直接返回一個排序后的新數組。# numpy.argsort() 該函數返回的是數組值從小到大排序時對應的索引值plt.plot(np.sort(x), y_predict[np.argsort(x)], color='r') # 折線圖(預測值, 擬合回歸線)plt.show() # 具體的繪圖if __name__ == '__main__':dm04_模型過擬合_L1正則化()
(二)L2正則化
Ridge回歸: from sklearn.linear_model import Ridge
代碼如下:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression, Lasso, Ridge
from sklearn.metrics import mean_squared_error # 計算均方誤差
from sklearn.model_selection import train_test_splitdef dm05_模型過擬合_L2正則化():# 1. 準備x, y數據, 增加上噪聲.# 用于設置隨機數生成器的種子(seed), 種子一樣, 每次生成相同序列.np.random.seed(666)# x: 隨機數, 范圍為 (-3, 3), 100個.x = np.random.uniform(-3, 3, size=100)# loc: 均值, scale: 標準差, normal: 正態分布.y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100)# 2. 實例化L2正則化模型, 做實驗: alpha懲罰力度越來越大, k值越來越小.estimator = Ridge(alpha=0.005)# 3. 訓練模型X = x.reshape(-1, 1)# hstack() 函數用于將多個數組在行上堆疊起來, 即: 數據增加高次項.X3 = np.hstack([X, X**2, X**3, X**4, X**5, X**6, X**7, X**8, X**9, X**10])estimator.fit(X3, y)print(f'權重: {estimator.coef_}')# 4. 模型預測.y_predict = estimator.predict(X3)print("預測值:", y_predict)# 5. 計算均方誤差 => 模型評估print(f'均方誤差: {mean_squared_error(y, y_predict)}')# 6. 畫圖plt.scatter(x, y) # 散點圖# sort() 該函數直接返回一個排序后的新數組。# numpy.argsort() 該函數返回的是數組值從小到大排序時對應的索引值plt.plot(np.sort(x), y_predict[np.argsort(x)], color='r') # 折線圖(預測值, 擬合回歸線)plt.show() # 具體的繪圖if __name__ == '__main__':# dm04_模型過擬合_L1正則化()dm05_模型過擬合_L2正則化()
(三)L1正則化與L2正則化的對比
五、正好擬合代碼(附贈)
例:
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as pltdef dm02_模型ok():# 1. 準備x, y數據, 增加上噪聲.# 用于設置隨機數生成器的種子(seed), 種子一樣, 每次生成相同序列.np.random.seed(666)# x: 隨機數, 范圍為 (-3, 3), 100個.x = np.random.uniform(-3, 3, size=100)# loc: 均值, scale: 標準差, normal: 正態分布.y = 0.5 * x ** 2 + x + 2 + np.random.normal(0, 1, size=100)# 2. 實例化 線性回歸模型.estimator = LinearRegression()# 3. 訓練模型X = x.reshape(-1, 1)X2 = np.hstack([X, X ** 2])estimator.fit(X2, y)# 4. 模型預測.y_predict = estimator.predict(X2)print("預測值:", y_predict)# 5. 計算均方誤差 => 模型評估print(f'均方誤差: {mean_squared_error(y, y_predict)}')# 6. 畫圖plt.scatter(x, y) # 散點圖# sort() 該函數直接返回一個排序后的新數組。# numpy.argsort() 該函數返回的是數組值從小到大排序時對應的索引值plt.plot(np.sort(x), y_predict[np.argsort(x)], color='r') # 折線圖(預測值, 擬合回歸線)# plt.plot(x, y_predict)plt.show() # 具體的繪圖
運行結果:
今天的分享到此結束。