MATLAB实现支持向量机鸢尾花三分类问题

本文所使用的数据集为经典的鸢尾花三分类数据集:

c111badf814f490692c942c06edf5f7f.png

该数据集有四个特征维度,最后一列为标签,标签取值范围为{'setosa','versicolor','virginica'}。显然这是个三分类问题,本文使用支持向量机模型。matlab代码如下:

% 加载数据集
data = readcell("C:\Users\27734\Desktop\Iris数据集\iris.csv");

% 分割特征和标签
X = cell2mat(data(2:end, 2:end-1)); % 特征列,排除第一列序号和最后一列标签
y = categorical(data(2:end, end)); % 标签列,将字符型标签转换为分类变量

% 随机分割数据集为训练集和测试集
cv = cvpartition(size(X, 1), 'HoldOut', 0.3); % 将数据集按照70:30的比例分割为训练集和测试集
trainIdx = training(cv); % 训练集索引
testIdx = test(cv); % 测试集索引

trainX = X(trainIdx, :); % 训练集的各个特征维度
trainY = y(trainIdx, :); % 训练集标签
testX = X(testIdx, :); % 测试集的各个特征维度
testY = y(testIdx, :); % 测试集标签

% 本文在此使用的fitcecoc函数为matlab内置函数
svmModel = fitcecoc(trainX, trainY);

% 在测试集上进行预测
predictions = predict(svmModel, testX);

% 计算准确率(查准率)
accuracy = sum(predictions == testY) / numel(testY);

% 显示准确率(查准率)
fprintf('准确率(查准率): %.2f%%\n', accuracy * 100);



下面为实验结果:

a143896ffc6c4ac7bf1e3a3f85bd42b9.png

查全率为95.56%,该支持向量机模型对鸢尾花三分类问题的准确率较高。

C = confusionmat(testY, predictions);

figure;
imagesc(C);
colorbar;

textStrings = num2str(C(:));
textStrings = strtrim(cellstr(textStrings));
[x, y] = meshgrid(1:size(C, 1), 1:size(C, 2));
hStrings = text(x(:), y(:), textStrings(:), 'HorizontalAlignment', 'center');
midValue = mean(get(gca, 'CLim'));
textColors = repmat(C(:) > midValue, 1, 3);
set(hStrings, {'Color'}, num2cell(textColors, 2));

title('混淆矩阵');
xlabel('预测标签');
ylabel('真实标签');
colormap('cool');

我们绘制出混淆矩阵,查看拟合效果:

b294da558dc243e7941d26057f6bf8ea.png

从混淆矩阵可知:本次预测只有两次错误,其他均预测正确。

 

  • 11
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
前言 尾花是机器学习中常用的数据集,它有三个类别:山尾、杂色尾和维吉尼亚尾。本文将使用Matlab基于支持向量机完成尾花数据集三分类,并对整个过程进行详细的解释。 步骤 1、数据准备 首先,我们下载尾花数据集,可以是自己手动下载,也可以使用Matlab自带的数据集导入工具下载。 代码如下: >> data = load('fisheriris.mat') 运行完毕后,我们可以看到data变量里面存储了尾花数据集中所有样本的特征值及其对应的类别标签。 2、数据预处理 在模型训练之前,我们需要对数据进行处理。首先我们将数据集分割成训练集和测试集。假设取20%的数据作为测试集,80%的数据作为训练集。同时我们也需要将类别标签转化为数值型数据。 代码如下: >> x = data.meas; >> y = cell2mat({data.species}'); >> cv = cvpartition(y,'HoldOut',0.2); >> idxTrain = training(cv); >> idxTest = test(cv); >> xTrain = x(idxTrain,:); >> yTrain = y(idxTrain,:); >> xTest = x(idxTest,:); >> yTest = y(idxTest,:); >> yTrain(yTrain=='setosa') = 1; >> yTrain(yTrain=='versicolor') = 2; >> yTrain(yTrain=='virginica') = 3; >> yTrain = str2double(yTrain); >> yTest(yTest=='setosa') = 1; >> yTest(yTest=='versicolor') = 2; >> yTest(yTest=='virginica') = 3; >> yTest = str2double(yTest); 在上述代码中我们使用了Matlab中的cvpartition函数,将数据分成了训练集和测试集,其中'HoldOut'表示我们选择了“留出法”作为数据集划分方法。 3、模型训练 支持向量机(SVM)是一种常用的统计学习方法,它通过最大化分类器的间隔来分割数据集,从而达到分类的目的。在Matlab中,我们可以使用fitcsvm函数来实现。 代码如下: >> SVMModel = fitcsvm(xTrain,yTrain,'ClassNames',{'1','2','3'},'KernelFunction','rbf','BoxConstraint',1); 在fitcsvm函数中,'ClassNames'指定分类的类别标签,'KernelFunction'指定核函数(常用的有线性核函数、多项式核函数、径向基核函数等),'BoxConstraint'指定分类器的惩罚参数(值越大则惩罚越大,分类界面的波动性越小)。 4、模型预测 训练完成后,我们需要对测试集进行预测,看看分类器的效果如何。使用predict函数对测试集进行预测,并计算预测的准确率。 代码如下: >> yTestPredict = predict(SVMModel,xTest); >> accuracy = sum(yTestPredict==yTest)/length(yTest) 其中,sum(yTestPredict==yTest)计算的是分类正确的样本个数,length(yTest)表示测试集样本总数,这两者的比值即为分类器的准确率。 5、模型优化 如果我们的分类效果并不令人满意,可以调整模型的参数,比如选择不同的核函数和惩罚参数。Matlab提供了优化函数fitcsvm自动调整参数,我们只需要将调参任务交给它就可以了。 代码如下: >> SVMModel = fitcsvm(xTrain,yTrain,'ClassNames',{'1','2','3'},'OptimizeHyperparameters','auto') 其中,'OptimizeHyperparameters'指示fitcsvm函数是否自动寻找最优的超参数,'auto'表示我们交给函数自动优化即可,'bayesopt'表示使用贝叶斯优化算法来寻找最优超参数。 总结 本文我们基于支持向量机完成了尾花数据集的三分类任务,包含数据准备、数据预处理、模型训练和模型优化等步骤。对于初学者来说,Matlab提供了非常简便的工具箱,既可以深入学习机器学习算法,又能够进行实际的应用开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值