拟合与岭回归
?
目錄
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 擬合與嶺回歸
1 什么是過擬合與欠擬合
2 模型復雜度
3 鑒別欠擬合與過擬合
4 過擬合解決方法
5 嶺回歸(Ridge)
6 模型的保存與加載
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?擬合與嶺回歸
1 什么是過擬合與欠擬合
通過下面兩張圖來解釋過擬合和欠擬合:
??
左圖中機器通過這些圖片來學習天鵝的特征知道了天鵝是有翅膀的,天鵝的嘴巴是長長的。簡單的認為有這些特征的都是天鵝。因為機器學習到的天鵝特征太少了,導致區分標準太粗糙,不能準確識別出天鵝。這就是欠擬合
有圖中機器通過這些圖片來學習天鵝的特征,經過訓練后,知道了天鵝是有翅膀的,天鵝的嘴巴是長長的彎曲的,天鵝的脖子是長長的有點曲度,天鵝的整個體型像一個"2"且略大于鴨子。這時候機器已經基本能區別天鵝和其他動物了。但是已有的天鵝圖片全是白天鵝的,會認為天鵝的羽毛都是白的,以后看到羽毛是黑的天鵝就會認為那不是天鵝。這就是過擬合
由上圖得知欠擬合是訓練誤差和測試誤差都大,過擬合是隨著模型的復雜度越來越復雜,訓練誤差不斷減少,決策樹就是這樣的,但是測試誤差先是減少到達某一個臨界點后越來越大了,說明過擬合了,只是在訓練集合里面考慮訓練集的特點,但是測試集里面的特點可能不是這個規律。
過擬合:一個假設在訓練數據上能夠獲得比其他假設更好的擬合, 但是在訓練數據外的數據集上卻不能很好地擬合數據,此時認為這個假設出現了過擬合的現象。(模型過于復雜)。
欠擬合:一個假設在訓練數據上不能獲得更好的擬合, 但是在訓練數據外的數據集上也不能很好地擬合數據,此時認為這個假設出現了欠擬合的現象。(模型過于簡單)、
2 模型復雜度
線性回歸不僅僅只能擬合線性關系數據。現實中大多數數據是非線性關系,對應的就是彎彎曲曲的曲線,求出系數后就變復雜了,因為特征復雜,線性回歸非線性也可以去擬合。特征復雜就意味著復雜模型。
假如建立的模型是線性如第一個圖,這時候畫出來的是一條直線;對于圖二的曲線要建立一個模型把這個曲線畫出來,那么數據的關系可能是某個平方的值在加上一個值,那模型就變復雜了;有可能還更加復雜的情況,特征更多,數據之間更復雜,某個值的平方加某個值的三次方等。這些x和θ是根據數據來定的,模型復雜的原因:數據的特征值和目標值之間的關系不僅僅是線性關系。
在線性擬合的時候還是求出這些θ參數,不管x是什么東西,當數據比較復雜的時候,θ乘以某個特征,這個時候預測關系比較復雜,因為某些特征是特征平方的關系。你怎么知道這是x的平方還是x的三次方,不用管,因為數據本身就是這種特性,我們的目的是為了求θ。對于線性關系來說,如果數據是復雜,有彎曲關系的時候,容易復雜度變大。
3 鑒別欠擬合與過擬合
欠擬合產生原因: 學習到數據的特征過少;解決辦法: 增加數據的特征數量。
過擬合產生原因: 原始特征過多,存在一些嘈雜特征, 模型過于復雜是因為模型嘗試去兼顧 各個測試數據點;解決辦法: 進行特征選擇,消除關聯性大的特征(很難做),交叉驗證(讓所有數據都有過訓練,不能解決只能驗證是哪種擬合),正則化(了解)。
如何知道是欠擬合還是過擬合呢?一般可以通過交叉驗證得來,比較在交叉驗證中本身在訓練集里面就60%左右的效果,那么說明在訓練集訓練的時候已經學不到很多東西,就可以認為是欠擬合情況,如果在網格搜索里面把交叉驗證單獨拿出來發現訓練集結果特別好,90%多但是測試集預測的時候發現才80%多,那就認為是過擬合。
總結就是根據訓練集結果現象判斷,根據交叉驗證訓練集結果與測試集對比一般是準確率,會看誤差,這個有業務去定。
4 過擬合解決方法
特征選擇有過濾式(低方差特征)和嵌入式(正則化,決策樹,神經網絡)。
正則化:如雖然不知道是哪些特征影響,但是可以不斷地去試,不斷的調整曲線,減少權重,把權重θ3,權重θ4不斷減少趨近于0,那么模型就變簡單了。所以正則化出發的角度就是在更新權重的過程中,不斷的嘗試把某一個特征前面的權重θ減小,看下哪個效果好,最終發現有一些特征前面的權重調整到趨近于0的時候效果好,這就是正則化解決問題的角度。
雖然不知道是哪些特征影響,但是可以減少權重,因為權重是我們取求出來的,盡量減少高次項特征的影響
L2正則化:作用:可以使得W的每個元素都很小,都接近于0 ;優點:越小的參數說明模型越簡單,越簡單的模型則越不容易產生過擬合現象
線性回歸:LinearRegression容易出現過擬合,為了把訓練數據集表現更好,把所有訓練數據擬合進去。
那么就用L2正則化(Ridge)的方式去解決,Ridge嶺回歸,帶有正則化的回歸,能夠解決過擬合。
基本上回歸解決過擬合的方式就是L2正則化。
回歸和分類解決過擬合的方式是不一樣的,決策樹解決過擬合的方式:①把api里面的葉子節點數量增大;②隨機森林。
5 嶺回歸(Ridge)
嶺回歸就是帶有正則化的回歸。
帶有正則化的線性回歸-Ridge的API:sklearn.linear_model.Ridge
sklearn.linear_model.Ridge(alpha=1.0) 具有l2正則化的線性最小二乘法
alpha:正則化力度 (λ也表示正則化力度 )
coef_:回歸系數
正則化力度對權重有什么影響呢?看下面官網給的一張圖
正則化力度越大(右到左),模型越來越簡單。所以正則化對權重的影響為:正則化力度越來越大,權重越來越趨近于0。
嶺回歸進行房價預測如下:
from sklearn.datasets import load_boston from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LinearRegression,SGDRegressor,Ridge from sklearn.metrics import mean_squared_error # 1獲取數據 lb = load_boston()# 2分割數據為訓練集合測試集 x_train,x_test,y_train,y_test = train_test_split(lb.data,lb.target,test_size=0.25)# 3進行標準化處理,特征值和目標值都必須進行標準化處理 std1 = StandardScaler() x_train = std1.fit_transform(x_train) x_test = std1.transform(x_test) # 目標值標準化 std2 = StandardScaler() y_train = std2.fit_transform(y_train.reshape(-1,1)) y_test = std2.transform(y_test.reshape(-1,1))# 4.estimator估計器測試 # 4.3嶺回歸求解預測 rd = Ridge() # 輸入數據一直不斷用訓練數據建立模型 rd.fit(x_train,y_train) print("嶺回歸系數為",rd.coef_) # 預測測試集房子價格 y_rdPredict = rd.predict(x_test) y_rdPredict = std2.inverse_transform(y_rdPredict) print("sgd測試集每個樣本的預測價格:",y_rdPredict) print("梯度下降均方根誤差",mean_squared_error(std2.inverse_transform(y_test),y_rdPredict))線性回歸 LinearRegression與Ridge對比:嶺回歸:回歸得到的回歸系數更符合實際,更可靠。另外,能讓估計參數的波動范圍變小,變的更穩定。在存在病態數據偏多的研究中有較大的實用價值。
6 模型的保存與加載
sklearn的模型保存月加載API:sklearn.externals.joblib
保存:joblib.dump(rf,"test.pkl")
加載:estimator=joblib.load("test.pkl")
注意:文件格式為pkl(二進制文件)
from sklearn.datasets import load_boston from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LinearRegression,SGDRegressor,Ridge from sklearn.metrics import mean_squared_error from sklearn.externals import joblib # 1獲取數據 lb = load_boston()# 2分割數據為訓練集合測試集 x_train,x_test,y_train,y_test = train_test_split(lb.data,lb.target,test_size=0.25)# 3進行標準化處理,特征值和目標值都必須進行標準化處理 std1 = StandardScaler() x_train = std1.fit_transform(x_train) x_test = std1.transform(x_test) # 目標值標準化 std2 = StandardScaler() y_train = std2.fit_transform(y_train.reshape(-1,1)) y_test = std2.transform(y_test.reshape(-1,1))# 4.estimator估計器測試 # 4.1正規方程求解預測 lr = LinearRegression() # 輸入數據一直不斷用訓練數據建立模型 lr.fit(x_train,y_train)print("lr回歸系數為",lr.coef_)# 保存訓練好的模型 joblib.dump(lr,"test.pkl") y_predict = lr.predict(x_test) y_predict = std2.inverse_transform(y_predict) print("未保存模型前的預測結果:",y_predict)# 當時用什么模型訓練的這時候就返回什么模型 model = joblib.load("test.pkl")# 預測測試集房子價格 y_modelPredict = model.predict(x_test) print("保存后的模型的預測結果:",std2.inverse_transform(y_modelPredict))總結
- 上一篇: 学生成绩统计c语言课程设计,学生成绩管理
- 下一篇: java获取参数编码_java获取接口数