在开始实例应用前先明确一般的操作步骤:
话不多说,我们直接开始吧!
导入数据:
# 导入需要的库函数
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来进一步优化模型,甚至也可以使用混合核函数来进行模型优化等等。