支持向量机回归(Support Vector Regression,SVR)是一种基于支持向量机(Support Vector Machine,SVM)的回归方法。与传统的回归方法不同,SVR的目标不是直接拟合数据,而是通过在特征空间中找到一个超平面,使得样本点尽可能地位于该超平面附近,并且在容忍范围内允许一定的误差。
本文介绍了如何用支持向量机回归预测出我们所需要的暴露数据,并未去深入探讨自变量与因变量的关系。
✳支持向量机回归SVR算法的优缺点:
优点:
缺点:
一、安装并加载分析所需要的R包
install.packages('e1071')
library('e1071')
library('data.table')
library('caret')
二、数据的读取和预处理
#读入数据(用于训练模型的数据集)
data<-read.csv("D:\\path\\filename.csv", header=T, stringsAsFactors = FALSE, fileEncoding = 'GBK'
#确保data中无缺失值,若有,可用缺失值的前一天的污染物浓度和后一天的污染物浓度的平均值填充。
#读入待预测的个体数据集ready
ready <- fread("D:\\path\\filename.csv")
ready[is.na(ready)]=0
※data数据集(用于训练模型)中的变量:它们包括用于预测的变量如气象数据、经济人口数据和土地数据等,也包括大气污染物如PM2.5浓度等。
※ready数据集(用于输入训练好的模型从而预测对应的PM2.5浓度)中的变量:包括用于预测的变量如气象数据、经济人口数据和土地数据等。
data部分数据:
ready部分数据:
三、通过交叉验证选择并训练模型
※此处我们使用径向基核函数建模,其计算量较少,性能相对较好,实际建模中可以多选择几个模型进行验证。
参数sigma:较小的 sigma 会使核函数更尖锐,数据点之间的相似度更高;而较大的 sigma 会使核函数更平滑,数据点之间的相似度更低.
参数C:C 越大,模型对误差的惩罚越严格,会更倾向于拟合所有数据点,可能导致过拟合;而 C 越小,模型对误差的容忍度越高,可能导致欠拟合
#随机数种子
set.seed(123)
#将数据集分为训练集train和测试集test
ind <- sample(2, nrow(data), replace = TRUE, prob = c(0.7, 0.3))
train <- data[ind == 1, ]
test <- data[ind == 2, ]
#对大气污染物PM2.5建模
# 创建一个网格,定义不同的参数组合,一般sigma取值范围为0.1~10,C的取值范围为0.1~100
param_grid <- expand.grid(
sigma = c( 0.1, 1, 10),
C = c(0.1, 1, 10,100)
)
# 使用 train 函数进行模型训练和参数调优
svm_model <- train(
PM2_5 ~ .,
data = train,
method = "svmRadial", #指定为径向基核函数
trControl = trainControl(method = "cv", number = 5),
tuneGrid = param_grid,
svmRadial = list(type = "eps-regression")#指定为SVR回归
)
# 输出最佳模型的参数
print(svm_model$bestTune)
# 输出模型评估结果
print(svm_model)
# 使用测试数据集进行预测
predictions <- predict(svm_model, newdata =test)
# 计算模型的性能指标
performance <- postResample(predictions, test$mean.PM2_5)
print(performance)
结果解读
#选择RMSE最小对应的sigma和C值即为最佳的模型参数
#根据模型的性能指标中决定系数为0.93,表明模型的拟合效果较好。
四、模型预测
##预测PM2.5
ready1<-subset(ready,select=c("id","date","Latitude","Longitude","popden1300","GDP1300","cropland","water","living","tem","airst_rain","hum","height","roadlength","mean.PM2_5","time_y"))
ready1$prePM2_5<-predict(svm_model,newdata=ready)
#查看所预测数据集的结果
summary(ready1$prePM2_5)
可以查看预测后所得的PM2.5浓度的最小值、中位数等:
ready1<-ready1[is.na(ready1$prePM2_5)==F,] %>%
subset(select=c("id","date","prePM2_5"))
五、将所预测的PM2.5数据导出
fwrite(ready1,"D:\\path\\filename.csv")
✳注意:SVR非常不适用于大规模的数据集,这种数据集会导致模型训练和预测的时间非常长从而难以获取数据。