一、過擬合及欠擬合
1、過擬合:一個假設在訓練集數據上能夠比其他假設更好的擬合,但是在訓練集外的數據集上卻不能很好的擬合數據,此時認爲這個假設出現了過擬合現象。(模型過於複雜)
過擬合原因:原始特徵太多,存在一些嘈雜特徵,模型過於複雜是因爲模型嘗試去兼顧各個測試數據點。模型複雜的原因是:數據的特徵和目標值之間的關係不僅僅是線性關係。
解決方法:進行特徵選擇,消除關聯性大的特徵(很難做);交叉驗證(讓所有數據都經過訓練);正則化。
2、 欠擬合:一個假設在訓練集數據上不能很好的擬合,在訓練集數據外的數據集上也不能很好的擬合數據,此時認爲這個假設出現了欠擬合的現象。(模型過於簡單)
欠擬合原因:學習到的數據的特徵太少
解決方法:增加數據的特徵數量
3、L2正則化
作用:使得W的每個元素(權重)都很小,都無限接近於0
優點:參數越小說明模型越簡單,模型越簡單則越不容易產生過擬合現象
二、Ridge(嶺迴歸)
1、一種帶有正則化的線性迴歸算法
2、sklearn API:
Sklearn.linear_model.Ridge
3、案例:波士頓房價預測
# 使用sklearn中波士頓房價數據
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression,SGDRegressor, Ridge
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
def liner_analy():
'''
使用線性迴歸預測波士頓房價
:return:
'''
# 獲取數據
lb = load_boston()
# 分割數據集到訓練集和測試集
x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)
# print(y_train, y_test)
# 進行標準化處理
# 特徵值和目標值均需要進行標準化處理,實例化兩個標準化API
std_x = StandardScaler()
x_train = std_x.fit_transform(x_train)
x_test = std_x.transform(x_test)
std_y = StandardScaler()
y_train = std_y.fit_transform(y_train.reshape(-1, 1))
y_test = std_y.transform(y_test.reshape(-1, 1))
# 估計器進行預測
# 使用正規方程求解預測結果
# lr = LinearRegression()
# 使用梯度下降求解預測結果
# lr = SGDRegressor()
# 使用嶺迴歸求解房價預測
rd = Ridge()
rd.fit(x_train, y_train)
print(rd.coef_)
# 預測測試集的房價
y_predict = rd.predict(x_test)
# 將預測房價轉換成標準化前的數據
y_predict = std_y.inverse_transform(y_predict)
print("測試集中每個房子的預測價格: ", y_predict)
print("均方誤差: ", mean_squared_error(std_y.inverse_transform(y_test), y_predict))
return None
if __name__ == "__main__":
liner_analy()
4、嶺迴歸的總結
嶺迴歸:迴歸得到的迴歸係數更加符合實際,更爲可靠。另外,能讓估計參數的波動範圍變小,變得更穩定。在存在病態數據偏多的研究中有較大的實用價值。