【機器學習】過擬合及欠擬合、嶺迴歸 No.12

一、過擬合及欠擬合

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、嶺迴歸的總結

嶺迴歸:迴歸得到的迴歸係數更加符合實際,更爲可靠。另外,能讓估計參數的波動範圍變小,變得更穩定。在存在病態數據偏多的研究中有較大的實用價值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章