了解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:我附加的数据。
谢谢!
2的评论
卡洛斯·门多萨
卡洛斯·门多萨 2020年8月31日
我没有忘记。我认为代码就足够了。可能是一个错误。

登录置评。

答案(1)

Xingwang勇
Xingwang勇 2020年9月29日
也许 kfoldLoss使用不同的损失比你的定义。你的定义是1精准。
//www.tatmou.com/help/stats/classreg.learning.partition.regressionpartitionedkernel.kfoldloss.html?s_tid=srchtitle
2的评论
Xingwang勇
Xingwang勇 2020年10月3日
class_error = error_count / n_trials;
= (n_trials - correct_count) / n_trials
= 1 - correct_count / n_trials
= 1 -准确性
那是你的损失的定义。

登录置评。

下载188bet金宝搏


释放

R2019b

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!