基于CFS特征选择与10折交叉验证的SVM分类器subset参数使用问询
如何在SVM分类器中使用CFS特征选择的特征子集?
首先得澄清一个容易混淆的点:大部分机器学习函数(包括e1071::svm和caret::train)里的subset参数是用来筛选样本行的,不是用来选特征列的。我们用CFS得到的是「特征子集」,需要通过提取特征列的方式传入SVM,下面结合你的代码场景一步步说明:
第一步:先完成CFS特征选择,得到最优特征列表
你的代码里没写完CFS的部分,先补全这一步,以iris数据集为例(原代码中Cardio1M是笔误,换成iris的分类目标Species):
library(caret) library(e1071) library(FSelector) # 加载数据,修正分类目标列名 data <- iris target_col <- "Species" # 10折交叉验证拆分数据(原代码中目标列修正为Species) trainIndex <- createDataPartition(data[[target_col]], p=0.7, list=FALSE) data_train <- data[trainIndex,] data_test <- data[-trainIndex,] # 用CFS进行特征选择 cfs_features <- cfs(paste(target_col, "~ ."), data = data_train) cat("CFS选中的特征:", paste(cfs_features, collapse = ", "), "\n")
场景一:用e1071::svm直接训练模型
这里的subset参数是用来筛选样本的(比如只训练某类样本),而特征子集需要通过构造新数据集来传入:
# 构造仅包含选中特征和目标列的训练/测试集 train_subset <- data_train[, c(cfs_features, target_col)] test_subset <- data_test[, c(cfs_features, target_col)] # 训练SVM:如果不需要筛选样本,subset参数设为NULL即可 svm_model <- svm(Species ~ ., data = train_subset, subset = NULL) # 示例:若只训练setosa和versicolor,可写subset = Species != "virginica" # 评估模型 predictions <- predict(svm_model, test_subset[, cfs_features]) confusionMatrix(predictions, test_subset[[target_col]])
场景二:用caret::train封装SVM做10折交叉验证
caret的train函数的subset参数同样是筛选样本行的,我们可以通过构造特征子集的公式来使用CFS结果:
# 构造只包含CFS特征的公式 svm_formula <- as.formula(paste(target_col, paste(cfs_features, collapse = " + "), sep = " ~ ")) # 设置10折交叉验证参数 train_ctrl <- trainControl(method = "cv", number = 10) # 训练SVM模型 svm_caret_model <- train(svm_formula, data = data_train, method = "svmRadial", # 这里用径向核SVM,也可以选"svmLinear"等 trControl = train_ctrl) # 测试模型 predictions_caret <- predict(svm_caret_model, data_test[, cfs_features]) confusionMatrix(predictions_caret, data_test[[target_col]])
关键总结
- 不要把「CFS特征子集」和函数的
subset参数混淆:前者是选特征列,后者是选样本行。 - 使用CFS特征的核心是:只把选中的特征列传入SVM模型训练,可以通过构造新数据集或定制公式实现。
内容的提问来源于stack exchange,提问作者Aymen Trabelsi
相关产品推荐
相关产品推荐

