python機器學習之模型正則化
欠擬合與過擬合
###使用線性回歸模型在批薩訓練樣本上進行擬合X_train = [[6],[8],[10],[14],[18]]y_train = [[7],[9],[13],[17.5],[18]]##導入線性回歸模型from sklearn.linear_model import LinearRegressionregressor = LinearRegression()##直接以pizza的直徑作為特徵訓練模型regressor.fit(X_train,y_train)import numpy as np##在x軸上從0到25均勻採樣100個數據點xx = np.linspace(0,26,100)xx = xx.reshape(xx.shape[0],1)##以上述的100個數據點作為基準,預測回歸直線yy = regressor.predict(xx)##對預測的回歸直線進行做圖import matplotlib.pyplot as pltplt.scatter(X_train,y_train)plt1,= plt.plot(xx,yy,label="Degree=1")plt.axis([0,25,0,25])plt.xlabel(Diameter of pizza)plt.ylabel(Price of Pizza)plt.legend(handles=[plt1])plt.show()print("The R-squared value of Linear Regressor Performing on the" +training data is,regressor.score(X_train,y_train))
###使用2次多項式回歸模型在比薩訓練樣本上進行擬合from sklearn.preprocessing import PolynomialFeatures##使用PolnominalFeatures(degree=2)映射出2次多項式特徵存儲在變數中poly2 = PolynomialFeatures(degree=2)X_train_poly2 = poly2.fit_transform(X_train)##仍然是線性回歸模型進行訓練regressor_poly2 = LinearRegression()regressor_poly2.fit(X_train_poly2,y_train)xx_poly2 = poly2.transform(xx)yy_poly2 = regressor_poly2.predict(xx_poly2)##分別對二次多項式進行做圖plt.scatter(X_train,y_train)plt1,= plt.plot(xx,yy,label="Degree1")plt2,= plt.plot(xx,yy_poly2,label="Degree=2")plt.axis([0,25,0,25])plt.xlabel("Diameter of Pizaa")plt.ylabel("Price of Pizza")plt.legend(handles=[plt1,plt2])plt.show()##輸出2次多項式回歸模型在訓練樣本上的R-squared值print("The R-squared value of Polynominal Regressor(Degree=2) Performing on the" +training data is,regressor_poly2.score(X_train_poly2,y_train))
###使用4次多項式回歸模型在比薩訓練樣本上進行擬合from sklearn.preprocessing import PolynomialFeatures##使用PolnominalFeatures(degree=2)映射出2次多項式特徵存儲在變數中poly4 = PolynomialFeatures(degree=4)X_train_poly4 = poly4.fit_transform(X_train)##仍然是線性回歸模型進行訓練regressor_poly4 = LinearRegression()regressor_poly4.fit(X_train_poly4,y_train)xx_poly4 = poly4.transform(xx)yy_poly4 = regressor_poly4.predict(xx_poly4)##分別對二次多項式進行做圖plt.scatter(X_train,y_train)plt1,= plt.plot(xx,yy,label="Degree1")plt2,= plt.plot(xx,yy_poly2,label="Degree=2")plt4,=plt.plot(xx,yy_poly4,label="Degree=4")plt.axis([0,25,0,25])plt.xlabel("Diameter of Pizaa")plt.ylabel("Price of Pizza")plt.legend(handles=[plt1,plt2,plt4])plt.show()##輸出2次多項式回歸模型在訓練樣本上的R-squared值print("The R-squared value of Polynominal Regressor(Degree=4) Performing on the" +training data is,regressor_poly4.score(X_train_poly4,y_train))
X_test = [[6],[8],[11],[16]]y_test = [[8],[12],[15],[18]]#使用測試數據集對模型進行評估regressor.score(X_test,y_test)X_test_poly2 = poly2.transform(X_test)regressor_poly2.score(X_test_poly2,y_test)X_test_poly4 = poly4.transform(X_test)regressor_poly4.score(X_test_poly4,y_test)
總結:當模型複雜度很低時,模型不僅沒有對訓練集上的數據有良好的擬合狀態,而且在測試集上也表現平平,這種情況叫做欠擬合;但是模型的複雜度很高時,儘管幾乎擬合了所有的訓練數據集,但是幾乎喪失了對未知數據的預測能力,這種情況叫過擬合。這兩種情況都是缺乏模型泛化力的表現。
L1 範數正則化
正則化的目的在於提高模型在未知測試數據上的泛化力,避免參數過度擬合。有上面可以看出2次多項式是相對較好的模型假設。之所以4次多項式出現過擬合,是由於4次方對應的係數過大,或者不為0所致。
因此正則化都是在原模型優化目標的基礎上,增加對參數的懲罰。如此一來,在新目標的優化過程中,也同時需要考量L1懲罰項的影響。
###Lasso模型在4次多項式特徵上的過擬合表現from sklearn.linear_model import Lassolasso_poly4 = Lasso()lasso_poly4.fit(X_train_poly4,y_train)##性能評估print(lasso_poly4.score(X_test_poly4,y_test))##輸出模型的參數列表print(lasso_poly4.coef_)##回顧普通4次多項式回歸模型過擬合之後的性能print(regressor_poly4.score(X_test_poly4,y_test))##回顧普通4次多項式回歸模型的參數列表print(regressor_poly4.coef_)
總結:上述代碼默認配置的Lasso模型的性能提高了大約3%;Lasso模型擬合後的參數列表中,4次與3次的參數均為0.0,使得特徵更加稀疏。
L2範數正則化
與L1正則化不同的是,L2在原優化目標的基礎上,增加了參數向量L2範數的懲罰項,優化的結果會使參數向量的大部分元素都變的很小,壓制了參數之間的差異性,這種壓制參數之間差異性的L2正則化稱為Ridge.
###Ridge 模型在4次多項式特徵上的擬合表現print(regressor_poly4.coef_)##輸出上述這些參數的平方和,驗證參數之間的巨大差異print(np.sum(regressor_poly4.coef_ **2))##導入模塊from sklearn.linear_model import Ridge##初始化默認配置ridge_poly4 = Ridge(4)ridge_poly4.fit(X_train_poly4,y_train)print(ridge_poly4.score(X_test_poly4,y_test))##輸出模型Ridge的參數列表print(ridge_poly4.coef_)##計算Ridge模型擬合後參數的平方和print(np.sum(ridge_poly4.coef_**2))
總結:Ridge的默認性能提高了3%左右;參數之間的差異非常小。
推薦閱讀:
※《機器學習基石》課程學習總結(三)
※集智漫畫:如何教女朋友人工智慧(一)
※[貝葉斯六]之樸素貝葉斯分類器設計
※模型監控構建方案
※膠囊網路(Capsule Networks)學習資源匯總
TAG:機器學習 |