了解MatLab的内置支持向量机fitcsvm交叉验证
5视图(30天)
显示旧的评论
我有53个试验的数据集和我想做分析交叉验证的二元分类器。
我试图明确做交叉验证的支持向量机,用这个代码:
SVM_params = {“KernelFunction”,“线性”,“标准化”,真的,…
“BoxConstraint”,0.046125,“类名”class_names};
SVMModel =细胞(53岁,1);
为i_trial = 1:53
% %的火车
train_set_indices = [1: i_trial-1 i_trial + 1: n_trials);
SVMModel {i_trial} = fitcsvm (input_data (train_set_indices:)…
true_labels (train_set_indices) SVM_params {:});
% %预测
[estimated_labels (i_trial),得分]=预测(SVMModel {i_trial},…
input_data (i_trial:));
结束
error_count =总和(~ strcmp (true_labels estimated_labels));
class_error = error_count / n_trials;
它给了我
class_error
等于0.4151。
然而,如果我尝试了MatLab的内置支持向量机交叉验证
SVM_params = {“KernelFunction”,“线性”,“标准化”,真的,…
“Leaveout”,“上”,“BoxConstraint”,0.046125,“类名”class_names};
CSVM = fitcsvm (input_data、true_labels SVM_params {:});
CSVM.kfoldLoss
就等于0.3208。为什么会有这样的差异呢?我明确的交叉验证我做错了什么?
我做了相同的测试
“Standarize”,
和
“KernelScale”, 987.8107
(优化hyperparameters),不同的是更戏剧性的:
class_error = 0.4528,而CSVM.kfoldLoss = 0。
最后,我还想知道是什么培训和验证设置为每个训练模型
CSVM.Trained
。我想打电话
预测
在每个训练模型忽略时样本(试行)和比较结果
CSVM.kfoldPredict
。
更新1:我发现c。traininig和c。测试返回训练集和测试集的指标。然而,这段代码
SVM_params = {“KernelFunction”,“线性”,“标准化”,真的,“CVPartition”c…
“BoxConstraint”BoxConstraint,“类名”class_names};
estimated_labels =细胞(53);
CSVM = fitcsvm (input_data、true_labels SVM_params {:});
为2 = 1:53
estimated_labels (ii) =预测(CSVM。训练有素的{2},input_data(让(ii):, 1));
结束
error_count =总和(~ strcmp (true_labels estimated_labels));
class_error = error_count / n_trials;
给我
class_error = 0.5849
,这是不同的
CSVM.kfoldLoss(
0.3208)。为什么会有这样的差异呢?这是检查交叉验证的正确方式吗?
更新2:我附加的数据。
谢谢!
答案(1)
Xingwang勇
2020年9月29日
也许
kfoldLoss使用不同的损失比你的定义。你的定义是1精准。
//www.tatmou.com/help/stats/classreg.learning.partition.regressionpartitionedkernel.kfoldloss.html?s_tid=srchtitle
2的评论
Xingwang勇
2020年10月3日
class_error = error_count / n_trials;
= (n_trials - correct_count) / n_trials
= 1 - correct_count / n_trials
= 1 -准确性
那是你的损失的定义。