赞
踩
本文借鉴了数学建模清风老师的课件与思路,可以点击查看链接查看清风老师视频讲解:清风数学建模:https://www.bilibili.com/video/BV1DW411s7wi
目录
KNN算法的简单例子:
KNN算法用于分类的流程图:
决策树=决策+树 我们定义决策树最初的问题所在的结点叫根节点,得到结论的结点叫叶节点,根节点和叶节点之间的结点叫内部节点。
我们从树的根节点开始往下面进行决策,对决策的结果进行分类,不同的类别分别对应不同的内部节点,之后又从内部节点开始往下面进行决策,对决策的结果进行分类,直至到达了树的叶节点为止。
以下面这颗决策树为例,计划将动物根据这颗决策树来区分它们是哺乳类还是非哺乳类:
当我们发现了一种新的动物,我们就可以通过这颗决策树判断它是哺乳动物还是非哺乳动物。
决策树算法的核心解决问题:
①如何从数据表中找出最佳节点和最佳分枝?
②如何让决策树停止生长,防止过拟合?
集成学习(ensemble learning)是时下非常流行的机器学习算法,它本身不是一个
单独的机器学习算法,而是通过在数据上构建多个模型,集成所有模型的建模结果。
根据个体学习器的生成方式,目前的集成学习方法大致可分为两大类:
(1) 个体学习器间存在强依赖关系、必须串行生成的序列化方法。这种方法我们称为提升法( Boosting),其代表模型有 Adboost(自适应提升算法)(MATLAB里自动选择该算法)、GBDT(梯度提升决策树)、 Xgboost(极端梯度提升算法)。
(2) 个体学习器间不存在强依赖关系、可同时生成的并行化方法。这种方法我们称为装袋法(Bagging), 另外, 大家经常听到的随机森林(Random Forest)(MATLAB里自动选择该算法)算法可以视为装袋法(Bagging) 的一种变形, 它们都是对决策树进行集成。
创建一个实时脚本后,运行程序后会直接在程序的下方得到结果。
在里面可直接添加文字,快捷键CTRL+E切换文本和代码。
若只想运行一部分代码,可快捷键CTRL+ALT+ENTER创建节,只运行该节的代码。
运行某一节代码快捷键CTRL+ENTER。
打开试图里的数据提示功能,光标落在变量那里,会显示该变量的值。
首先将原始的数据集拆分成两个Excel文件(一个为已知y的,一个为未知y的),如下图(该数据中y为种类)。
将该数据导入进MATLAB中,如下图:
导入后记得将名字改一下,如下图(data1为该数据集的名字,下面的为指标的名字,若在这里改了指标名,后面导入的数据集也应更改):
选择生成脚本,生成脚本后,在之后直接运行该脚本即可导入数据。
注:要将MATLAB的路径变更为数据集所在的路径下,也可直接调用命令(路径为自己的数据集所在路径):
cd'E:\建模清风\机器学习进阶课程配套文件\机器学习进阶课程配套文件\1.鸢尾花数据集'
生成后的脚本如下:
- %% 导入电子表格中的数据
- % 用于从以下电子表格导入数据的脚本:
- %
- % 工作簿: E:\建模清风\机器学习进阶课程配套文件\机器学习进阶课程配套文件\1.鸢尾花数据集\鸢尾花1.xlsx
- % 工作表: Sheet1
- %
- % 由 MATLAB 于 2022-07-03 14:34:01 自动生成
-
- %% 设置导入选项并导入数据
- opts = spreadsheetImportOptions("NumVariables", 5);
-
- % 指定工作表和范围
- opts.Sheet = "Sheet1";
- opts.DataRange = "A2:E145";
-
- % 指定列名称和类型
- opts.VariableNames = ["VarName1", "VarName2", "VarName3", "VarName4", "VarName5"];
- opts.VariableTypes = ["double", "double", "double", "double", "categorical"];
-
- % 指定变量属性
- opts = setvaropts(opts, "VarName5", "EmptyFieldRule", "auto");
-
- % 导入数据
- data1 = readtable("E:\建模清风\机器学习进阶课程配套文件\机器学习进阶课程配套文件\1.鸢尾花数据集\鸢尾花1.xlsx", opts, "UseExcel", false);
-
-
- %% 清除临时变量
- clear opts
导入完数据后,就可以使用分类学习器了,可以在上方的App中点击分类学习器,也可以使用下面的代码调用。
- classificationLearner
- % 调用回归学习器的命令是regressionLearner
点击 在左上角的新建会话将data1(因为data1里面有y)导入进来。
导入之后如下图:
可将所有模型都训练一遍,选择其中准确度最高的模型导出,本数据集里准确度最高为线性判别分析,如下图:
将该模型导出后,会在命令行显示如下:
- 变量已在基础工作区中创建。
- 从 分类学习器 导出了结构体 'trainedModel'。
- 要对新表 T 进行预测:
- yfit = trainedModel.predictFcn(T)
- 有关详细信息,请参阅 How to predict using an exported model。
此时直接运行下面代码,可得到data2的分类结果。
trainedModel.predictFcn(data2)
生成函数即生成代码。
生成代码后,操作以下三步:
①将代码的第一行注释
②在
inputTable = trainingData;
的前面一行添加
trainingData = data1;
③找到
trainedClassifier.predictFcn = @(x) discriminantPredictFcn(predictorExtractionFcn(x));
在代码最后另起一行,输入
trainedClassifier.predictFcn(data2)
现在运行所有的代码即可得到预测结果。
我们以决策树模型为例,对于决策树模型,我们可以使用下面的代码将它可视化(如果图上节点太多,图会非常丑,这时候就别放论文):
如果使用的导出模型:
- figure(1)
- view(trainedModel.ClassificationTree,'Mode','graph') % 根据你自己导出来的模型名称修改
如果是生成函数,在代码最后加上下面这段代码:
- figure(2)
- view(trainedClassifier.ClassificationTree,'Mode','graph')
可视化结果如下:
K 折交叉验证
图上的“平均”两个字大家可以不用管,容易给人产生误导。 我们进行交叉验证的目的是为了看我们的模型在测试集上的表现,即为了衡量模型的泛化能力。
在上面的 10 折交叉验证中,我们将这个模型训练了十次,每次的测试集都是新的,且每一个样本都会作为一次测试集,作为测试集时, MATLAB 会给我们返回它们的预测结果。
因此经过交叉验证后,我们就能得到每个样本的预测结果,又由于我们知道每个样本它们的真实的结果,因此我们可以将所有样本预测的结果和真实的结果汇总成一个完整的混淆矩阵,然后通过这个混淆矩阵来计算我们所需要衡量的指标,例如分类准确率、 f1 分数等。
随机数种子函数:rng(n) n为整数,将这个函数放在代码的最前面,运行得到的结果会固定住。因为交叉验证每次的训练集不一样,所以结果可能也会不一样,用随机数种子就可以固定住。
首先要选好正类是哪一个。 在机器学习中,我们通常将更关注的事件定义为正类事件。然后计算下面这些指标:
多分类的 F1 分数分为两种,一种叫做 micro F1 分数(micro[ˈmaɪkroʊ]表示微观的) ,另一种叫做 macro F1 分数(macro[ˈmækroʊ]表示宏观的)。
和二分类的 F1 分数不同, micro F1 分数和 macro F1 分数不需要指定正类是什么,因为它们计算的是一个综合的分数。(二分类别用这两个 F1 分数,没见过有人在二分类用过它们)
micro F1 分数: 每个类别分别作为正类时,都可以算出来一组 TP、 FP 和 FN 的值, 我们
把它们分别求和来计算所有样本的 TP、 FP 和 FN,然后再套用 F1 分数的公式。
macro F1 分数, 它有两种定义方法:
第一种: 先计算出每一类作为正类时的 F1 分数,然后对所有的 F1 分数求平均。(MATLAB和 Python 中用的都是这一种计算方法)
第二种: 先计算出每一类作为正类时的精确率 P 和召回率 R,然后分别计算 P 和 R 的平均值,再利用公式
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。