波士頓房價回歸分析
1.導入波士頓房價數據集
############################# svm實例--波士頓房價回歸分析 ####################################### #導入numpy import numpy as np #導入畫圖工具 import matplotlib.pyplot as plt #導入波士頓房價數據集 from sklearn.datasets import load_boston boston = load_boston() #打印數據集中的鍵 print(boston.keys()) #打印數據集中的短描述 #print(boston['DESCR'])
2.使用SVR進行建模
#導入數據集拆分工具 from sklearn.model_selection import train_test_split #建立訓練數據集和測試數據集 X,y = boston.data,boston.target X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=8) print('\n\n\n') print('代碼運行結果') print('====================================\n') #打印訓練集和測試集的形態 print(X_train.shape) print(X_test.shape) print('\n====================================') print('\n\n\n')
代碼運行結果 ==================================== (379, 13) (127, 13) ====================================
#導入支持向量機回歸模型 from sklearn.svm import SVR #分別測試linear核函數和rbf核函數 for kernel in ['linear','rbf']: svr = SVR(kernel = kernel,gamma = 'auto') svr.fit(X_train,y_train) print(kernel,'核函數的模型訓練集得分: {:.3f}'.format(svr.score(X_train,y_train))) print(kernel,'核函數的模型測試集得分: {:.3f}'.format(svr.score(X_test,y_test)))
linear 核函數的模型訓練集得分: 0.709 linear 核函數的模型測試集得分: 0.696 rbf 核函數的模型訓練集得分: 0.145 rbf 核函數的模型測試集得分: 0.001
#將特征數值中的最小值和最大值用散點畫出來 plt.plot(X.min(axis=0),'v',label='min') plt.plot(X.max(axis=0),'^',label='max') #設定縱坐標為對數形式 plt.yscale('log') #設置圖注位置為最佳 plt.legend(loc='best') #設定橫縱軸標題 plt.xlabel('features') plt.ylabel('feature magnitude') #顯示圖形 plt.show()
3.用StandardScaler進行數據預處理
#導入數據預處理工具 from sklearn.preprocessing import StandardScaler #對訓練集和測試集進行數據預處理 scaler = StandardScaler() scaler.fit(X_train) X_train_scaled = scaler.transform(X_train) X_test_scaled = scaler.transform(X_test) #將預處理后的數據特征最大值和最小值用散點圖表示出來 plt.plot(X_train_scaled.min(axis=0),'v',label='train set min') plt.plot(X_train_scaled.max(axis=0),'^',label='train set max') plt.plot(X_test_scaled.min(axis=0),'v',label='test set min') plt.plot(X_test_scaled.max(axis=0),'^',label='test set max') #設置圖注位置為最佳 plt.legend(loc='best') #設定橫縱軸標題 plt.xlabel('scaled features') plt.ylabel('scaled feature magnitude') #顯示圖形 plt.show()
4.數據預處理后重新訓練模型
#用預處理后的數據重新訓練模型 for kernel in ['linear','rbf']: svr = SVR(kernel = kernel) svr.fit(X_train_scaled,y_train) print('數據預處理后',kernel,'核函數的模型訓練集得分: {:.3f}'.format(svr.score(X_train_scaled,y_train))) print('數據預處理后',kernel,'核函數的模型測試集得分: {:.3f}'.format(svr.score(X_test_scaled,y_test)))
數據預處理后 linear 核函數的模型訓練集得分: 0.706 數據預處理后 linear 核函數的模型測試集得分: 0.698 數據預處理后 rbf 核函數的模型訓練集得分: 0.665 數據預處理后 rbf 核函數的模型測試集得分: 0.695
#設置"rbf"內核的SVR模型的C參數和gamma參數 svr = SVR(C=100,gamma=0.1) svr.fit(X_train_scaled,y_train) print('調節參數后的"rbf"內核的SVR模型在訓練集得分:{:.3f}'.format(svr.score(X_train_scaled,y_train))) print('調節參數后的"rbf"內核的SVR模型在測試集得分:{:.3f}'.format(svr.score(X_test_scaled,y_test)))
調節參數后的"rbf"內核的SVR模型在訓練集得分:0.966 調節參數后的"rbf"內核的SVR模型在測試集得分:0.894
總結:
我們通過對數據預處理和參數的調節,使"rbf"內核的SVR模型在測試集中的得分從0.001升到0.894,
於是我們可以知道SVM算法對數據預處理和調參的要求非常高.
文章引自 : 《深入淺出python機器學習》