''' 嶺回歸: 普通線性回歸模型使用基於梯度下降的最小二乘法,在最小化損失函數的前提下,尋找最優模型參數, 在此過程中,包括少數異常樣本在內的全部訓練數據都會對最終模型參數造成程度相等的影響, 異常值對模型所帶來影響無法在訓練過程中被識別出來。為此,嶺回歸在模型迭代過程所依據的損失函數中增加了正則項, 以限制模型參數對異常樣本的匹配程度,進而提高模型面對多數正常樣本的擬合精度。 嶺回歸的目的: 1>普通線性回歸無法識別或者避免異常樣本對模型參數的影響,導致在預測時效果查(預測結果偏向於異常樣本),嶺回歸可以通過正則強度的設置 來減少異常樣本對模型參數的影響,從而使得預測結果更偏向於正常樣本,提高了模型擬合精度。 2>加入正則項后,其R2得分肯定會低於普通線性回歸,原因:普通線性回歸考慮的是全部樣本損失函數最小值,而嶺回歸就是為了避免異常值對預測的影響 從而刻意減少異常樣本在計算中的權重,進而導致其損失函數最小值是大於普通線性回歸的損失函數最小值。
正則強度越大,泛化能力越強
相關API: import sklearn.linear_model as lm # 創建模型 model = lm.Ridge(正則強度,fit_intercept=是否訓練截距, max_iter=最大迭代次數) # 訓練模型 # 輸入:為一個二維數組表示的樣本矩陣 # 輸出:為每個樣本最終的結果 model.fit(輸入, 輸出) # 預測輸出 # 輸入array是一個二維數組,每一行是一個樣本,每一列是一個特征。 result = model.predict(array) 示例:加載abnormal.txt文件中的數據,基於嶺回歸算法訓練回歸模型。 ''' import sklearn.linear_model as lm import numpy as np import matplotlib.pyplot as mp import sklearn.metrics as sm x, y = np.loadtxt('./ml_data/abnormal.txt', delimiter=',', unpack=True, usecols=(0, 1)) # 把輸入變成二維數組,一行一樣本,一列一特征 x = x.reshape(-1, 1) # 變成n行1列 model = lm.Ridge(150, fit_intercept=True, max_iter=1000) model.fit(x, y) pred_y = model.predict(x) # 把樣本x帶入模型求出預測y # 輸出模型的評估指標 print('平均絕對值誤差:', sm.mean_absolute_error(y, pred_y)) print('平均平方誤差:', sm.mean_squared_error(y, pred_y)) print('中位絕對值誤差:', sm.median_absolute_error(y, pred_y)) print('R2得分:', sm.r2_score(y, pred_y)) # 繪制圖像 mp.figure("Linear Regression", facecolor='lightgray') mp.title('Linear Regression', fontsize=16) mp.tick_params(labelsize=10) mp.grid(linestyle=':') mp.xlabel('x') mp.ylabel('y') mp.scatter(x, y, s=60, marker='o', c='dodgerblue', label='Points') mp.plot(x, pred_y, c='orangered', label='LR Line') mp.tight_layout() mp.legend() mp.show()
輸出結果:
平均絕對值誤差: 1.0717908951634179
平均平方誤差: 3.7362971803503267
中位絕對值誤差: 0.696470799282414
R2得分: 0.44530850891980656