SVR的簡單實例應用

在開始實例應用前先明確一般的操作步驟:

  1. 導入數據
  2. 分割訓練集和測試集
  3. 數據預處理
  4. 建模
  5. 模型測試與模型評價

話不多說,我們直接開始吧!
導入數據:

# 導入需要的庫函數
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
data = pd.read_excel(r"文件的絕對路徑+文件名.xlsx")
data

最後一行代碼可以看到我們所導入的數據集。
在這裏插入圖片描述
分割訓練集和測試集:

# 確定數據集X和Y
X = data.iloc[:,:-1]
Y = data.iloc[:,-1]
#分割數據集的函數,test_siz用於決定訓練集與測試集的分割比例,random_state表示按指定的數值來獲取指定的隨機分配
Xtrain, Xtest, Ytrain, Ytest = train_test_split(X,Y,test_size=0.2,random_state=42)
#恢復分割後的索引
for i in [Xtrain, Xtest, Ytrain, Ytest]:
    i.index = range(i.shape[0])

爲了提高成功率,我們可以隨時在中途查看進展的結果,以下給出幾個常用的查看函數和屬性:

# 查看X的結構特徵
X.shape
# 查看X的每一列的數值類型等信息
X.info()
# 查看缺失值的缺失情況
Xtrain.isnull().mean()
# 查看每一列的數據類型
Xtrain.dtypes
# 查看頭幾行數據(默認是5)
Xtrain.head()

多說無益,這些函數的功能自己親自試試就一目瞭然了。
數據預處理:
這裏我的處理思路是將數據分成分類型數據和連續型數據分別進行處理(切記測試集的數據也需要同樣的數據預處理
分類型數據需要進行缺失值填補與變量編碼
連續型數據需要進行缺失值填補與無量綱化

#找出分類型特徵都有哪些
cate = Xtrain.columns[Xtrain.dtypes == "object"].tolist()
#對於分類型特徵,我們使用衆數來進行填補
from sklearn.impute import SimpleImputer
si = SimpleImputer(missing_values=np.nan,strategy="most_frequent")
#注意,我們使用訓練集數據來訓練我們的填補器,本質是在生成訓練集中的衆數
si.fit(Xtrain.loc[:,cate])
#然後我們用訓練集中的衆數來同時填補訓練集和測試集
Xtrain.loc[:,cate] = si.transform(Xtrain.loc[:,cate])
Xtest.loc[:,cate] = si.transform(Xtest.loc[:,cate])
#將所有的分類型變量編碼爲數字,一個類別是一個數字
from sklearn.preprocessing import OrdinalEncoder
oe = OrdinalEncoder()
#利用訓練集進行fit
oe = oe.fit(Xtrain.loc[:,cate])
#用訓練集的編碼結果來編碼訓練和測試特徵矩陣
#在這裏如果測試特徵矩陣報錯,就說明測試集中出現了訓練集中從未見過的類別,此時需要重新分割數據集
Xtrain.loc[:,cate] = oe.transform(Xtrain.loc[:,cate])
Xtest.loc[:,cate] = oe.transform(Xtest.loc[:,cate])
col = Xtrain.columns.tolist()
for i in cate:
    col.remove(i)
#實例化模型,填補策略爲"mean"表示均值
impmean = SimpleImputer(missing_values=np.nan,strategy = "mean")
#用訓練集來fit模型
impmean = impmean.fit(Xtrain.loc[:,col])
#分別在訓練集和測試集上進行均值填補
Xtrain.loc[:,col] = impmean.transform(Xtrain.loc[:,col])
Xtest.loc[:,col] = impmean.transform(Xtest.loc[:,col])
# 數據無量綱化
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
ss = ss.fit(Xtrain.loc[:,col])
Xtrain.loc[:,col] = ss.transform(Xtrain.loc[:,col])
Xtest.loc[:,col] = ss.transform(Xtest.loc[:,col])

建模與評估:

from sklearn.svm import SVR
import matplotlib.pyplot as plt
from sklearn.metrics import r2_score
# 重新調整Ytrain與Ytest維度
Ytrain = Ytrain.iloc[:,0].ravel()
Ytest = Ytest.iloc[:,0].ravel()
kernels = ['linear','poly','rbf','sigmoid']
for kernel in kernels:
    svr = SVR(kernel=kernel).fit(Xtrain,Ytrain)
    Ypredict = svr.predict(Xtest)
    print(kernel+"核函數支持向量機的默認評估值爲:", svr.score(Xtest, Ytest))
    print(kernel+"核函數支持向量機的R_squared值爲:", r2_score(Ytest, Ypredict ))

結果如下:
在這裏插入圖片描述
顯然,這四個核函數效果最好的是rbf。後面,我們還能調整懲罰參數C和重要參數epsilon來進一步優化模型,甚至也可以使用混合核函數來進行模型優化等等。

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