将这段代码改进,使之生成KKNN调参结果RMSEcv-k图(需要四种核函数曲线)、SVM调参结果RMSEcv-sigma图(需要不同c值对应曲线至少4个)、ANN调参结果RMSEcv-size图(需要不同decay值对应曲线至少四条)以及输出RF的mtry最优取值,且由于十折交叉验证需要生成四种机器学习算法的RMSEcv、R2cv、MAEcv值,如果可以的话生成拟合出的模型及其参数。library(ggplot2)
library(lattice)
library(caret)
library(Matrix)
library(glmnet)
library(tidyverse)
library(nnet)
library(kknn)
library(randomForest)
library(kernlab)
data <- read.csv(“E:/data/Dbaihua.csv”,header = T)
划分训练集和测试集
set.seed(123)
trainIndex <- createDataPartition(data$D, p = 0.8, list = FALSE)
trainData <- data[trainIndex, ]
testData <- data[-trainIndex, ]
人工神经网络(ANN)
model_ann <- nnet(D ~ t, data = trainData, size = 5, decay = 0.1)
K 近邻(KNN)
model_knn <- kknn(D ~ t, train = trainData, test = testData, distance = 2, k = 10)
随机森林(RF)
model_rf <- randomForest(D ~ t, data = trainData, ntree = 500, mtry = 1)
支持向量机(SVM)
model_svm <- ksvm(D ~ t, data = trainData, C = 10, sigma = 1)
使用 caret 进行 10 折交叉验证
ctrl <- trainControl(method = “cv”, number = 10)
对 ANN 进行交叉验证和调参
tuneGrid_ann <- expand.grid(size = c(2:11), decay = c(0.0001,0.001,0.01, 0.1))
model_ann_tuned <- train(D ~ t, data = trainData, method = “nnet”, trControl = ctrl, tuneGrid = tuneGrid_ann)
summary(model_ann_tuned)
对 KNN 进行交叉验证和调参
tuneGrid_knn <- expand.grid(kmax = c(3,10), distance = 2 ,kernel=c(“triangular”,“rectangular”,“epanechnikov”))
model_knn_tuned <- train(D ~ t, data = trainData, method = “kknn”, trControl = ctrl, tuneGrid = tuneGrid_knn)
summary(model_knn_tuned)
对 RF 进行交叉验证和调参
tuneGrid_rf <- expand.grid(mtry = 1)
model_rf_tuned <- train(D ~ t, data = trainData, method = “rf”, trControl = ctrl, tuneGrid = tuneGrid_rf)
summary(model_rf_tuned)
对 SVM 进行交叉验证和调参
tuneGrid_svm <- expand.grid(C = c(0.01,0.1,1,10), sigma = 1)
model_svm_tuned <- train(D ~ t, data = trainData, method = “svmRadial”, trControl = ctrl, tuneGrid = tuneGrid_svm)
summary(model_svm_tuned)
评估模型性能
rmse_ann <- RMSE(predict(model_ann_tuned, testData), testData$D)
rmse_knn <- RMSE(predict(model_knn_tuned, testData), testData$D)
rmse_rf <- RMSE(predict(model_rf_tuned, testData), testData$D)
rmse_svm <- RMSE(predict(model_svm_tuned, testData), testData$D)
选择最小 RMSEcv 对应的模型作为最终模型
min_rmse <- min(rmse_ann, rmse_knn, rmse_rf, rmse_svm)
if (min_rmse == rmse_ann) {
final_model <- model_ann_tuned
} else if (min_rmse == rmse_knn) {
final_model <- model_knn_tuned
} else if (min_rmse == rmse_rf) {
final_model <- model_rf_tuned
} else {
final_model <- model_svm_tuned
}
#计算R2
1-sum(resid(model_rf_tuned)^2)/sum((data[,“D”]-mean(data[,“D”]))^2)