官术网_书友最值得收藏!

1.5 項目實戰

最后,我們來做一個線性回歸的實戰項目:分別使用OLSLinearRegression和GDLinearRegression預測紅酒口感,如表1-1所示。

表1-1 紅酒口感數據集(https://archive.ics.uci.edu/ml/datasets/wine+quality)

數據集中包含1599條數據,其中每一行包含紅酒的11個化學特征以及專家評定的口感值。雖然口感值只是3~8的整數,但我們依然把該問題當作回歸問題處理,而不是當作包含6種類別(3~8)的分類問題處理。如果當作分類問題,則預測出的類別間無法比較好壞,例如我們不清楚第1類口感是否比第5類口感好,但我們明確知道5.3比4.8口感好。

讀者可使用任意方式將數據集文件winequality-red.csv下載到本地,此文件所在的URL為:https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequalityred.csv。

1.5.1 準備數據

調用Numpy的genfromtxt函數加載數據集:

1.5.2 模型訓練與測試

我們要訓練并測試兩種不同方法實現的線性回歸模型:OLSLinearRegression和GDLinearRegression。

1. OLSLinearRegression

先從更為簡單的OLSLinearRegression開始。

首先創建模型:

創建OLSLinearRegression時無須傳入任何參數。

然后,調用sklearn中的train_test_split函數將數據集切分為訓練集和測試集(比例 為7:3):

接下來,訓練模型:

因為訓練集容量及實例特征數量都不大,所以很短時間內便可完成訓練。

使用已訓練好的模型對測試集中的實例進行預測:

仍以均方誤差(MSE)衡量回歸模型的性能,調用sklearn中的mean_squared_error函數計算MSE:

模型在測試集上的MSE為0.421,其平方根約為0.649。還可以測試模型在訓練集上的MSE:

模型在訓練集與測試集的性能相差不大,表明未發生過度擬合現象。

注意

過度擬合也稱為過擬合,不過在中文上下文中使用“過擬合”容易產生歧義,故本書統一使用“過度擬合”。

另一個常用的衡量回歸模型的指標是平均絕對誤差(MAE),其定義如下:

MAE的含義更加直觀一些:所有實例預測值與實際值之誤差絕對值的平均值。

調用sklearn中的mean_absolute_error函數計算模型在測試集上的MAE:

MAE為0.492,即預測口感值比實際口感值平均差了0.492。

2. GDLinearRegression

再來訓練并測試GDLinearRegression,該過程比之前的OLSLinearRegression麻煩一些,因為它有3個超參數需要我們設置,而最優的超參數組合通常需要通過大量實驗得到。

GDLinearRegression的超參數有:

(1)梯度下降最大迭代次數n_iter

(2)學習率eta

(3)損失降低閾值tol(tol不為None時,開啟早期停止法)

先以超參數(n_iter=3000,eta=0.001,tol=0.00001)創建模型:

為了與之前的OLSLinearRegression進行對比,我們使用與之前相同的訓練集和測試集(不重新切分X,y)訓練模型:

以上輸出表明,經過一步梯度下降以后,損失Loss不降反升,然后算法便停止了,這說明步長太大,已經邁到對面山坡上了,需調小學習率。將學習率調整為eta=0.0001再次嘗試:

這次雖然損失隨著迭代逐漸下降了,但是迭代到了最大次數3000,算法依然沒有收斂,最終損失(在訓練集上的MSE)為0.539,距離之前用最小二乘法計算出的最小值0.417還差很遠,并且發現后面每次迭代損失下降得非常小。這種狀況主要是由于中各特征尺寸相差較大造成的,觀察中各特征的均值:

可看出各特征尺寸差距確實很大,有的特征間相差了好幾個數量級。以兩個特征為例,如果特征尺寸比的小很多(如圖1-5所示),通常的變化對損失函數值影響更大,梯度下降時就會先沿著接近軸的方向下山,再沿著軸進入一段長長的幾乎平坦的山谷,用下山時謹慎的小步走平地,速度慢得像蝸牛爬,雖然最終也可以抵達最小值點,但需要更多的迭代次數,花費更長時間。

圖1-5

相反,如果特征尺寸相同(見圖1-6),梯度下降時將更直接地走向最小值點,算法收斂更快。

圖1-6

接下來我們把各特征縮放到相同尺寸,然后重新訓練模型。將特征縮放到相同尺寸有兩種常用方法:歸一化(Normalization)和標準化(Standardization)。

歸一化是指使用min-max縮放將各特征的值縮放至[0, 1]區間。對于第i個實例的第j個特征,歸一化轉換公式為:

其中,分別為所有實例第j個特征的最大值和最小值。調用sklearn中的MinMaxScaler函數可以完成歸一化轉換。

標準化是指將各特征的均值設置為0,方差設置為1。對于第i個實例的第j個特征,標準化轉換公式為:

其中,分別為所有實例第j個特征的均值和標準差。調用sklearn中的StandardScaler函數可以完成標準化轉換。

對于大多數機器學習算法而言,標準化更加實用,因為標準化保持了異常值所蘊含的有用信息。這里我們調用sklearn中的StandardScaler函數對各特征進行縮放:

這里需要注意,在以上的代碼中,StandardScaler只對訓練集進行擬合(計算均值和標準差),然后使用相同的擬合參數對訓練集和測試集進行轉換,因為在預測時測試集對于我們是未知的。

現在各特征值被縮放到了相同的尺寸。接下來重新創建模型,并使用已縮放的數據進行訓練:

這次我們將eta大幅提高到了0.05,經過136次迭代后算法收斂,目前損失(在訓練集上的MSE)為0.428,已接近用最小二乘法計算出的最小值0.417。

最后使用已訓練好的模型對測試集中的實例進行預測,并評估性能:

此時MSE為0.393,MAE為0.492,與之前使用OLSLinearRegression的性能差不多。讀者可以繼續調整超參數進行優化,但性能不會有太明顯的提升,畢竟線性回歸是非常簡單的模型。

至此,線性回歸的項目就完成了。

主站蜘蛛池模板: 汨罗市| 灵璧县| 罗城| 台东市| 常州市| 青龙| 兴安盟| 福州市| 项城市| 崇义县| 蓬溪县| 阿拉尔市| 巩留县| 乐亭县| 仙游县| 伊通| 武宣县| 双峰县| 阳东县| 襄城县| 红桥区| 屯昌县| 方正县| 宜兰市| 渝北区| 北海市| 会昌县| 张北县| 房产| 襄樊市| 灵山县| 襄汾县| 澄城县| 长泰县| 新晃| 嘉祥县| 新巴尔虎左旗| 全州县| 镇原县| 屯留县| 慈利县|