1 定義
- 過擬合:一個假設在訓練數據上能夠獲得比其他假設更好的擬合, 但是在測試數據集上卻不能很好地擬合數據,此時認為這個假設出現了過擬合的現象。(模型過於復雜)
- 欠擬合:一個假設在訓練數據上不能獲得更好的擬合,並且在測試數據集上也不能很好地擬合數據,此時認為這個假設出現了欠擬合的現象。(模型過於簡單)

那么是什么原因導致模型復雜?線性回歸進行訓練學習的時候變成模型會變得復雜,這里就對應前面再說的線性回歸的兩種關系,非線性關系的數據,也就是存在很多無用的特征或者現實中的事物特征跟目標值的關系並不是簡單的線性關系?
2 原因以及解決辦法
- 欠擬合原因以及解決辦法
- 原因:學習到數據的特征過少
- 解決辦法:
- 1)添加其他特征項,有時候我們模型出現欠擬合的時候是因為特征項不夠導致的,可以添加其他特征項來很好地解決。例如,“組合”、“泛化”、“相關性”三類特征是特征添加的重要手段,無論在什么場景,都可以照葫蘆畫瓢,總會得到意想不到的效果。除上面的特征之外,“上下文特征”、“平台特征”等等,都可以作為特征添加的首選項。
- 2)添加多項式特征,這個在機器學習算法里面用的很普遍,例如將線性模型通過添加二次項或者三次項使模型泛化能力更強。
- 過擬合原因以及解決辦法
- 原因:原始特征過多,存在一些嘈雜特征, 模型過於復雜是因為模型嘗試去兼顧各個測試數據點
- 解決辦法:
- 1)重新清洗數據,導致過擬合的一個原因也有可能是數據不純導致的,如果出現了過擬合就需要我們重新清洗數據。
- 2)增大數據的訓練量,還有一個原因就是我們用於訓練的數據量太小導致的,訓練數據占總數據的比例過小。
- 3)正則化
- 4)減少特征維度,防止維災難
3 正則化
3.1 什么是正則化

如何解決?

在學習的時候,數據提供的特征有些影響模型復雜度或者這個特征的數據點異常較多,所以算法在學習的時候盡量減少這個特征的影響(甚至刪除某個特征的影響),這就是正則化
3.2 正則化類別
- L2正則化
- 作用:可以使得其中一些W的都很小,都接近於0,削弱某個特征的影響
- 優點:越小的參數說明模型越簡單,越簡單的模型則越不容易產生過擬合現象
- Ridge回歸
- L1正則化
- 作用:可以使得其中一些W的值直接為0,刪除這個特征的影響
- LASSO回歸
3.3 正則化線性模型
- Ridge Regression 嶺回歸
- Lasso 回歸
- Elastic Net 彈性網絡
- Early stopping
1 Ridge Regression (嶺回歸,又名 Tikhonov regularization)
嶺回歸是線性回歸的正則化版本,即在原來的線性回歸的 cost function 中添加正則項(regularization term):

以達到在擬合數據的同時,使模型權重盡可能小的目的,嶺回歸代價函數:

- α=0:嶺回歸退化為線性回歸
2 Lasso Regression(Lasso 回歸)
Lasso 回歸是線性回歸的另一種正則化版本,正則項為權值向量的ℓ1范數。
Lasso回歸的代價函數 :

【注意 】
- Lasso Regression 的代價函數在 θi=0處是不可導的.
- 解決方法:在θi=0處用一個次梯度向量(subgradient vector)代替梯度,如下式
- Lasso Regression 的次梯度向量

Lasso Regression 有一個很重要的性質是:傾向於完全消除不重要的權重。
例如:當α 取值相對較大時,高階多項式退化為二次甚至是線性:高階多項式特征的權重被置為0。
也就是說,Lasso Regression 能夠自動進行特征選擇,並輸出一個稀疏模型(只有少數特征的權重是非零的)。
3 Elastic Net (彈性網絡)
彈性網絡在嶺回歸和Lasso回歸中進行了折中,通過 混合比(mix ratio) r 進行控制:
- r=0:彈性網絡變為嶺回歸
- r=1:彈性網絡便為Lasso回歸
彈性網絡的代價函數 :

小結:
-
常用:嶺回歸
-
假設只有少部分特征是有用的:
- 彈性網絡
- Lasso
- 一般來說,彈性網絡的使用更為廣泛。因為在特征維度高於訓練樣本數,或者特征是強相關的情況下,Lasso回歸的表現不太穩定。
-
-
api:
-
from sklearn.linear_model import Ridge, ElasticNet, Lasso
-
-
3.4線性回歸的改進-嶺回歸
- sklearn.linear_model.Ridge(alpha=1.0, fit_intercept=True,solver="auto", normalize=False)
- 具有l2正則化的線性回歸
- alpha:正則化力度,也叫 λ
- λ取值:0~1 1~10
- solver:會根據數據自動選擇優化方法
- sag:如果數據集、特征都比較大,選擇該隨機梯度下降優化
- normalize:數據是否進行標准化
- normalize=False:可以在fit之前調用preprocessing.StandardScaler標准化數據
- Ridge.coef_:回歸權重
- Ridge.intercept_:回歸偏置
Ridge方法相當於SGDRegressor(penalty='l2', loss="squared_loss"),只不過SGDRegressor實現了一個普通的隨機梯度下降學習,推薦使用Ridge(實現了SAG)
- sklearn.linear_model.RidgeCV(_BaseRidgeCV, RegressorMixin)
- 具有l2正則化的線性回歸,可以進行交叉驗證
- coef_:回歸系數
class _BaseRidgeCV(LinearModel): def __init__(self, alphas=(0.1, 1.0, 10.0), fit_intercept=True, normalize=False,scoring=None, cv=None, gcv_mode=None, store_cv_values=False):
3.4.2 觀察正則化程度的變化,對結果的影響?

- 正則化力度越大,權重系數會越小
- 正則化力度越小,權重系數會越大
3.3.3波士頓房價預測
def linear_model3(): """ 線性回歸:嶺回歸 :return: """ # 1.獲取數據 data = load_boston() # 2.數據集划分 x_train, x_test, y_train, y_test = train_test_split(data.data, data.target, random_state=22) # 3.特征工程-標准化 transfer = StandardScaler() x_train = transfer.fit_transform(x_train) x_test = transfer.fit_transform(x_test) # 4.機器學習-線性回歸(嶺回歸) estimator = Ridge(alpha=1) # estimator = RidgeCV(alphas=(0.1, 1, 10)) estimator.fit(x_train, y_train) # 5.模型評估 # 5.1 獲取系數等值 y_predict = estimator.predict(x_test) print("預測值為:\n", y_predict) print("模型中的系數為:\n", estimator.coef_) print("模型中的偏置為:\n", estimator.intercept_) # 5.2 評價 # 均方誤差 error = mean_squared_error(y_test, y_predict) print("誤差為:\n", error)
1 sklearn模型的保存和加載API
- from sklearn.externals import joblib
- 保存:joblib.dump(estimator, 'test.pkl')
- 加載:estimator = joblib.load('test.pkl')
