目录
✨前言
历史回顾
1、什么是分类 ?
2、SVM(支持向量机)算法
✏️2.1代码
✏️2.2代码和原理的讲解
️2.3二分类水果
️2.4多分类水果
️2.5多分类鸢尾花
️2.6其它数据分类
3、随机森林算法
✏️3.1代码
✏️3.2算法简介
✏️3.3实现过程
️3.3二分类水果
️3.4多分类水果
️3.5多分类鸢尾花
️3.6其它数据分类
4、总结
在数学建模比赛中,分类也是我们最常见的问题之一,关于分类这块,现在最火热的垃圾分类其实也是属于我们分类模型中的一种,我们可以根据每个垃圾的一系列指标将其进行分成不同的类别,接下来就详细讲一下如何利用SVM和随机森林去解决该类问题,并对两种智能算法的用法进行区分和总结!
数学建模专栏:数学建模从0到1
数学建模入门篇 | 零基础如何入门数学建模?_小羊不会飞的博客 |
长三角实战篇 | 长三角数学建模------赛后总结_小羊不会飞的博客 |
数学建模(一):插值 | 数学建模(一):插值_小羊不会飞的博客-CSDN博客 |
数学建模(二):优化 | 数学建模(二):优化_小羊不会飞的博客-CSDN博客 |
数学建模(三):预测 | 数学建模(三):预测_小羊不会飞的博客-CSDN博客 |
分类在百度百科上的定义:“分类就是通过比较事物之间的相似性,把具有某些共同点或相似特征的事物归属于一个不确定集合的逻辑方法”。
应用到现实生活中就是我们日常的垃圾分类
%% 清空环境变量
warning off % 关闭报警信息
close all % 关闭开启的图窗
clear % 清空变量
clc % 清空命令行
res = xlsread('数据集.xlsx');
temp = randperm(357);
P_train = res(temp(1: 240), 1: 12)';
T_train = res(temp(1: 240), 13)';
M = size(P_train, 2);
P_test = res(temp(241: end), 1: 12)';
T_test = res(temp(241: end), 13)';
N = size(P_test, 2);
[p_train, ps_input] = mapminmax(P_train, 0, 1);
p_test = mapminmax('apply', P_test, ps_input );
t_train = T_train;
t_test = T_test ;
p_train = p_train'; p_test = p_test';
t_train = t_train'; t_test = t_test';
c = 10.0;
g = 0.01;
cmd = ['-t 2', '-c', num2str(c), '-g', num2str(g)];
model = svmtrain(t_train, p_train, cmd);
T_sim1 = svmpredict(t_train, p_train, model);
T_sim2 = svmpredict(t_test , p_test , model);
error1 = sum((T_sim1' == T_train)) / M * 100;
error2 = sum((T_sim2' == T_test )) / N * 100;
[T_train, index_1] = sort(T_train);
[T_test , index_2] = sort(T_test );
T_sim1 = T_sim1(index_1);
T_sim2 = T_sim2(index_2);
...........
这块内容,博主我讲的可能不太明白,参考一下其它优秀博主的文章:
SVM算法—原理讲解_测试狗一枚的博客-CSDN博客_svm算法原理
%% 清空环境变量
%warning off % 关闭报警信息
%close all % 关闭开启的图窗
%clear % 清空变量
%clc % 清空命令行
%% 导入数据
%res = xlsread('数据集.xlsx');
P_train = res(temp(1: 50), 1: 4)';
T_train = res(temp(1: 50), 5)';
M = size(P_train, 2);
P_test = res(temp(51: end), 1: 4)';
T_test = res(temp(51: end), 5)';
N = size(P_test, 2);
[p_train, ps_input] = mapminmax(P_train, 0, 1);
p_test = mapminmax('apply', P_test, ps_input );
t_train = T_train;
t_test = T_test ;
p_train = p_train'; p_test = p_test';
t_train = t_train'; t_test = t_test';
trees = 50;
leaf = 1;
OOBPrediction = 'on';
OOBPredictorImportance = 'on';
Method = 'classification';
net = TreeBagger(trees, p_train, t_train, 'OOBPredictorImportance', OOBPredictorImportance, ...
'Method', Method, 'OOBPrediction', OOBPrediction, 'minleaf', leaf);
importance = net.OOBPermutedPredictorDeltaError; % 重要性
t_sim1 = predict(net, p_train);
t_sim2 = predict(net, p_test );
T_sim1 = str2num(cell2mat(t_sim1)); %训练集的预测值
T_sim2 = str2num(cell2mat(t_sim2)); %测试集的预测值
error1 = sum((T_sim1' == T_train)) / M * 100 ;
error2 = sum((T_sim2' == T_test )) / N * 100 ;
figure
plot(1 : trees, oobError(net), 'b-', 'LineWidth', 1)
legend('误差曲线')
xlabel('决策树数目')
ylabel('误差')
xlim([1, trees])
grid
figure
bar(importance)
legend('重要性')
xlabel('特征')
ylabel('重要性')
[T_train, index_1] = sort(T_train);
[T_test , index_2] = sort(T_test );
T_sim1 = T_sim1(index_1);
T_sim2 = T_sim2(index_2);
................
随机森林顾名思义,是用随机的方式建立一个森林,森林里面有很多的决策树组成,随机森林的每一棵决策树之间是没有关联的。在得到森林之后,当有一个新的输入样本进入的时候,就让森林中的每一棵决策树分别进行一下判断,看看这个样本应该属于哪一类(对于分类算法),然后看看哪一类被选择最多,就预测这个样本为那一类。
随机森林中的每一棵分类树为二叉树,其生成遵循自顶向下的递归分裂原则,即从根节点开始依次对训练集进行划分;在二叉树中,根节点包含全部训练数据, 按照节点纯度最小原则,分裂为左节点和右节点,它们分别包含训练数据的一个子集,按照同样的规则节点继续分裂,直到满足分支停止规则而停止生长。若节点n上的分类数据全部来自于同一类别,则此节点的纯度I(n)=0,纯度度量方法是Gini准则,即假设P(Xj)是节点n上属于Xj 类样本个数占训练。
具体实现过程如下:
(1)原始训练集为N,应用bootstrap法有放回地随机抽取k个新的自助样本集,并由此构建k棵分类树,每次未被抽到的样本组成了k个袋外数据;
(2)设有mall个变量,则在每一棵树的每个节点处随机抽取mtry个变量(mtry n mall),然后在mtry中选择一个最具有分类能力的变量,变量分类的阈值通过检查每一个分类点确定;
(3)每棵树最大限度地生长, 不做任何修剪;
(4)将生成的多棵分类树组成随机森林,用随机森林分类器对新的数据进行判别与分类,分类结果按树分类器的投票多少而定。
结果分析:
随机森林分类的效果明显优于SVM(支持向量机)
1、在处理多指标分类模型的问题中,SVM(支持向量机)和随机森林都可以去解决这一系列问题,btw从上述实战中我们不难发现,随机森林的准确率达到了95%+,在跟前辈的交流中也了解到,随机森林确实比SVM更适合做多指标分类!
上述结果出现的概念:
1.混淆矩阵:[机器学习笔记] 混淆矩阵(Confusion Matrix)