《Python機器學習及實踐:從零開始通往Kaggle競賽之路》第2章 基礎篇 學習筆記(八)2.1.2.2支持向量機(迴歸)總結

目錄

2.1.2.2支持向量機(迴歸)

1、模型介紹

2、數據描述

(1)美國波士頓地區房價數據描述

(2)美國波士頓地區房價數據分割

(3)美國波士頓地區房價數據標準化處理

3、編程實踐

4、性能測評

5、特點分析


2.1.2.2支持向量機(迴歸)

1、模型介紹

支持向量機(迴歸)是從訓練數據中選取一部分更加有效的支持向量,只是這少部分的訓練樣本所提供的並不是類別目標,而是具體的預測數值。

2、數據描述

(1)美國波士頓地區房價數據描述

# 代碼34:美國波士頓地區房價數據描述
# 從sklearn.datasets導入波士頓房價數據讀取器。
from sklearn.datasets import load_boston

# 從讀取房價數據存儲在變量boston中。
boston = load_boston()
# 輸出數據描述。
print(boston.DESCR)

本地輸出:

.. _boston_dataset:

Boston house prices dataset
---------------------------

**Data Set Characteristics:**  

    :Number of Instances: 506 

    :Number of Attributes: 13 numeric/categorical predictive. Median Value (attribute 14) is usually the target.

    :Attribute Information (in order):
        - CRIM     per capita crime rate by town
        - ZN       proportion of residential land zoned for lots over 25,000 sq.ft.
        - INDUS    proportion of non-retail business acres per town
        - CHAS     Charles River dummy variable (= 1 if tract bounds river; 0 otherwise)
        - NOX      nitric oxides concentration (parts per 10 million)
        - RM       average number of rooms per dwelling
        - AGE      proportion of owner-occupied units built prior to 1940
        - DIS      weighted distances to five Boston employment centres
        - RAD      index of accessibility to radial highways
        - TAX      full-value property-tax rate per $10,000
        - PTRATIO  pupil-teacher ratio by town
        - B        1000(Bk - 0.63)^2 where Bk is the proportion of blacks by town
        - LSTAT    % lower status of the population
        - MEDV     Median value of owner-occupied homes in $1000's

    :Missing Attribute Values: None

    :Creator: Harrison, D. and Rubinfeld, D.L.

This is a copy of UCI ML housing dataset.
https://archive.ics.uci.edu/ml/machine-learning-databases/housing/


This dataset was taken from the StatLib library which is maintained at Carnegie Mellon University.

The Boston house-price data of Harrison, D. and Rubinfeld, D.L. 'Hedonic
prices and the demand for clean air', J. Environ. Economics & Management,
vol.5, 81-102, 1978.   Used in Belsley, Kuh & Welsch, 'Regression diagnostics
...', Wiley, 1980.   N.B. Various transformations are used in the table on
pages 244-261 of the latter.

The Boston house-price data has been used in many machine learning papers that address regression
problems.   
     
.. topic:: References

   - Belsley, Kuh & Welsch, 'Regression diagnostics: Identifying Influential Data and Sources of Collinearity', Wiley, 1980. 244-261.
   - Quinlan,R. (1993). Combining Instance-Based and Model-Based Learning. In Proceedings on the Tenth International Conference of Machine Learning, 236-243, University of Massachusetts, Amherst. Morgan Kaufmann.

結論:總體而言,該數據共有506條美國波士頓地區房價的數據,每條數據包括對指定房屋的13項數值型特徵描述和目標房價。另外,數據中沒有缺失的屬性/特徵值,更加方便了後續的分析。

(2)美國波士頓地區房價數據分割

# 代碼35:美國波士頓地區房價數據分割
# 從sklearn.model_selection導入數據分割器。
from sklearn.model_selection import train_test_split
# 導入numpy並重命名爲np。
import numpy as np

X = boston.data
y = boston.target

# 隨機採樣25%的數據構建測試樣本,其餘作爲訓練樣本。
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=33, test_size=0.25)

# 分析迴歸目標值的差異。
print("The max target value is", np.max(boston.target))
print("The min target value is", np.min(boston.target))
print("The average target value is", np.mean(boston.target))

備註:原來的導入模型from sklearn.cross_validation import train_test_split的時候,提示錯誤:

from sklearn.cross_validation import train_test_split
ModuleNotFoundError: No module named 'sklearn.cross_validation'

需要替換cross_validation:

from sklearn.model_selection import train_test_split

本地輸出:

The max target value is 50.0
The min target value is 5.0
The average target value is 22.532806324110677

結論:預測目標房價之間的差異較大,因此需要對特徵以及目標值進行標準化處理。

備註:讀者無需質疑將真實房價做標準化處理的做法。事實上,儘管在標準化之後,數據有了很大的變化。但是依然可以使用標準化器中的inverse_transform函數還原真實的結果;並且,對於預測的迴歸值也可以採用相同的做法進行還原。

(3)美國波士頓地區房價數據標準化處理

# 代碼36:訓練與測試數據標準化處理
# 從sklearn.preprocessing導入數據標準化模塊。
from sklearn.preprocessing import StandardScaler

# 分別初始化對特徵和目標值的標準化器。
ss_X = StandardScaler()
ss_y = StandardScaler()

# 分別對訓練和測試數據的特徵以及目標值進行標準化處理。
X_train = ss_X.fit_transform(X_train)
X_test = ss_X.transform(X_test)
y_train = ss_y.fit_transform(y_train.reshape(-1, 1))
y_test = ss_y.transform(y_test.reshape(-1, 1))

備註:原來的會報錯,是因爲工具包版本更新造成的;故採用以下方法。

根據錯誤的提示相應的找出原來出錯的兩行代碼:

y_train = ss_y.fit_transform(y_train)
y_test = ss_y.transform(y_test)

問題出現在上面的兩行代碼中,例如數據格式爲[1, 2, 3, 4]就會出錯,如果把這行數據轉換成[[1], [2], [3], [4]]就不會出錯了。所以要對上面導致出錯的兩行代碼做出修改:

y_train = ss_y.fit_transform(y_train.reshape(-1, 1))
y_test = ss_y.transform(y_test.reshape(-1,1))

3、編程實踐

使用分割處理好的訓練和測試數據;同時第一次修改模型初始化的默認配置,以展現不同配置下模型性能的差異,也爲後面要介紹的內容做個鋪墊。

# 代碼39:使用三種不同核函數配置的支持向量機迴歸模型進行訓練,並且分別對測試數據做出預測
# 從sklearn.svm中導入支持向量機(迴歸)模型。
from sklearn.svm import SVR

# 使用線性核函數配置的支持向量機進行迴歸訓練,並且對測試樣本進行預測。
linear_svr = SVR(kernel='linear')
linear_svr.fit(X_train, y_train)
linear_svr_y_predict = linear_svr.predict(X_test)

# 使用多項式核函數配置的支持向量機進行迴歸訓練,並且對測試樣本進行預測。
poly_svr = SVR(kernel='poly')
poly_svr.fit(X_train, y_train)
poly_svr_y_predict = poly_svr.predict(X_test)

# 使用徑向基核函數配置的支持向量機進行迴歸訓練,並且對測試樣本進行預測。
rbf_svr = SVR(kernel='rbf')
rbf_svr.fit(X_train, y_train)
rbf_svr_y_predict = rbf_svr.predict(X_test)

4、性能測評

接下來,就不同核函數配置下的支持向量機迴歸模型在測試集上的迴歸性能做出評估。

# 代碼40:對三種核函數配置下的支持向量機迴歸模型在相同測試集上進行性能評估
# 使用R-squared、MSE和MAE指標對三種配置的支持向量機(迴歸)模型在相同測試集上進行性能評估。
from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error

print('R-squared value of linear SVR is', linear_svr.score(X_test, y_test))
print('The mean squared error of linear SVR is', mean_squared_error(ss_y.inverse_transform(y_test), ss_y.inverse_transform(linear_svr_y_predict)))
print('The mean absolute error of linear SVR is', mean_absolute_error(ss_y.inverse_transform(y_test), ss_y.inverse_transform(linear_svr_y_predict)))

print('R-squared value of Poly SVR is', poly_svr.score(X_test, y_test))
print('The mean squared error of Poly SVR is', mean_squared_error(ss_y.inverse_transform(y_test), ss_y.inverse_transform(poly_svr_y_predict)))
print('The mean absolute error of Poly SVR is', mean_absolute_error(ss_y.inverse_transform(y_test), ss_y.inverse_transform(poly_svr_y_predict)))

print('R-squared value of RBF SVR is', rbf_svr.score(X_test, y_test))
print('The mean squared error of RBF SVR is', mean_squared_error(ss_y.inverse_transform(y_test), ss_y.inverse_transform(rbf_svr_y_predict)))
print('The mean absolute error of RBF SVR is', mean_absolute_error(ss_y.inverse_transform(y_test), ss_y.inverse_transform(rbf_svr_y_predict)))

本地輸出:

R-squared value of linear SVR is 0.650659546421538
The mean squared error of linear SVR is 27.088311013556027
The mean absolute error of linear SVR is 3.4328013877599624
R-squared value of Poly SVR is 0.40365065102550846
The mean squared error of Poly SVR is 46.24170053103929
The mean absolute error of Poly SVR is 3.73840737104651
R-squared value of RBF SVR is 0.7559887416340944
The mean squared error of RBF SVR is 18.92094886153873
The mean absolute error of RBF SVR is 2.6067819999501114

結論:不同配置下的模型在相同測試集上,存在着非常大的性能差異。並且在使用了徑向基(Radial basis function)核函數對特徵進行非線性映射之後,支持向量機展現了最佳的迴歸性能。 

5、特點分析

首次展示了不同配置模型在相同數據上所表現的性能差異。特別是該系列模型還可以通過配置不同的核函數來改變模型性能。因此,建議讀者在使用時多嘗試幾種配置,進而獲得更好的預測性能。

備註:核函數是一項非常有用的特徵映射技巧,同時在數學描述上也略爲複雜。簡單一些理解,便是通過某種函數計算,將原有的特徵映射到更高維度的空間,從而儘可能達到新的高維度特徵線性可分的程度,如圖2-9所示。結合支持向量機的特點,這種高維度線性可分的數據特徵恰好可以發揮其模型優勢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章