- Python機器學習算法: 原理、實現與案例
- 劉碩
- 1856字
- 2020-01-20 15:06:24
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的性能差不多。讀者可以繼續調整超參數進行優化,但性能不會有太明顯的提升,畢竟線性回歸是非常簡單的模型。
至此,線性回歸的項目就完成了。
- Designing Machine Learning Systems with Python
- 自己動手實現Lua:虛擬機、編譯器和標準庫
- C語言程序設計立體化案例教程
- JavaScript從入門到精通(第3版)
- Building RESTful Python Web Services
- Python項目實戰從入門到精通
- Python編程:從入門到實踐(第3版)
- 代替VBA!用Python輕松實現Excel編程
- 零基礎學HTML+CSS第2版
- 數據科學中的實用統計學(第2版)
- 計算機應用基礎(Windows 7+Office 2010)
- Pandas 1.x Cookbook
- HTML5程序開發范例寶典
- Mastering Magento Theme Design
- Cocos2D Game Development Essentials