Hi,大家好,我是半亩花海。本专栏主要是基于 MATLAB在线学习网站MATLAB Home (mathworks.com)的机器学习入门之旅,详情可见使用 MATLAB 进行机器学习 - MATLAB & Simulink (mathworks.cn)该网站的有关在线学习课程,感觉是新手的入门利器。
目录
1.机器学习概述
欢迎大家一起加入机器学习入门之旅!
在传统建模中,我们必须根据系统的工作原理来自己找出方法,但许多现实问题过于复杂而无法通过上述方式解决。使用机器学习,我们可以改为基于数据构建模型,将机器学习算法应用于真实数据,并让机器从这些示例中学习如何输入映射到期望的输出。
本课程主要是通过字迹识别示例来了解整个分类工作流——导入数据-清理数据-提取信息-构建模型-评估模型。
让我们一起从入门到轻松实战吧!
如下是 MATLAB在线网站MATLAB Home (mathworks.com) 的页面:
以及使用 MATLAB 进行机器学习 - MATLAB & Simulink (mathworks.cn)在线学习课程的网站页面:
2.分类工作流
2.1 概览
以下是分类工作流概述。
2.2 导入数据
任务 1
背景
您可以使用 readtable
函数从电子表格或文本文件导入表格数据,并将结果以表的形式存储。
data = readtable("myfile.xlsx");
这将从电子表格 myfile.xlsx
中导入数据,并将其存储在名为 data
的表中。
任务
将存储在文件 "J.txt"
中的数据读入名为 letter
的变量。
letter = readtable("J.txt");
结果
任务 2
您可以使用圆点表示法来引用表中的任何单个变量
x = mytable.Xdata;
y = mytable.Ydata;
这样可以从表 mytable
中提取变量 Xdata
并将结果存储在名为 x
的新变量中。同样,变量 Ydata
也会被提取后存储到 y
中。
任务
通过在水平轴上绘制 letter
的 X
变量和在垂直轴上绘制 Y
变量来可视化字母。
plot(letter.X,letter.Y)
结果
任务 3
默认轴范围会使字母的纵横比失真。您可以使用 axis
命令强制轴保持数据的纵横比。
任务
使用命令 axis equal
修正绘图的纵横比。
axis equal
结果
任务 4
任务
对文件 M.txt
中的数据重复执行相同的导入和绘制任务。
letter = readtable("M.txt")
plot(letter.X,letter.Y)
axis equal
结果
2.3 处理数据
任务 1
背景
您可以使用圆点表示法来提取、修改表中的变量并对其重新赋值,就像处理任何变量一样。
x = x + 3;
data.XVal = data.XVal + 3;
任务
将表 letter
的变量 X
中的值乘以纵横比 1.5。将结果重新赋给 X
,使 letter
包含修正后的数据。
letter.X = 1.5*letter.X;
% View the result
plot(letter.X,letter.Y)
axis equal
结果
任务 2
背景
您可以像对任意变量一样对表中的变量进行索引。
finalX = data.XVal(end);
任务
通过从所有元素中减去第一个值,对表 letter
的 Time
变量进行偏移以从 0 开始。将结果除以 1000 以转换为秒。将结果重新赋给 Time
,使 letter
包含调整后的数据。
letter.Time = (letter.Time-letter.Time(1)) / 1000;
% View the result
plot(letter.Time,letter.X)
plot(letter.Time,letter.Y)
结果
2.4 提取特征(计算特征)
任务 1
背景
特征仅仅是根据信号计算的值,例如其持续时间。
任务
通过提取 letter.Time
的最后一个值并将结果存储在名为 dur
的变量中,来计算书写该字母所需的时间。
% Do not edit. This code loads and preprocesses the data.
letter = readtable("M.txt");
letter.X = letter.X*1.5;
letter.Time = (letter.Time - letter.Time(1))/1000
plot(letter.X,letter.Y)
axis equal
dur = letter.Time(end)
结果
任务 2
range
函数返回数组中值的极差。即 range(x)
等效于 max(x) - min(x)
。
任务
使用 range
函数通过将 letter.Y
的值极差除以 letter.X
的值极差来计算字母的纵横比。将结果赋给名为 aratio
的变量。
aratio = range(letter.Y)/range(letter.X)
结果
2.5 提取特征(查看特征)
任务 1
MAT 文件 featuredata.mat
包含一个表,其中包含由不同人书写的 470 个字母的提取特征。表 features
有三个变量:AspectRatio
和 Duration
(在上一节中计算的两个特征)以及 Character
(已知字母)。
任务
使用 scatter
函数绘制提取的特征,水平轴上为纵横比,垂直轴上为持续时间。
% Do not edit. This code loads the data.
load featuredata.mat
features
scatter(features.AspectRatio,features.Duration)
结果
任务 2
尚不清楚这些特征是否足以区分数据集中的三个字母(J、M 和 V)。gscatter
函数生成一个分组散点图——即根据分组变量对点进行着色的散点图。
gscatter(x,y,g)
任务
使用 gscatter
函数创建与之前相同的散点图,但根据字母进行着色,字母存储在表 features
的 Character
变量中。
gscatter(features.AspectRatio,features.Duration,features.Character)
结果
2.6 建立模型
以下代码加载数据。
load featuredata.mat
features
任务 1
背景
一个简单模型是将一个观测值与最邻近的已知示例划分为相同的类。这称为 k 最近邻 (kNN) 模型。您可以通过将数据表传递给 fitcknn
函数来拟合 kNN 模型。
mdl = fitcknn(data,"ResponseVariable");
第二个输入是表中响应变量的名称(即模型要预测的类)。输出是包含拟合模型的变量。
470 个已知示例的特征和类存储在表 features
中,该表存储在 featuredata.mat
中。
任务
使用 fitcknn
函数对 features
中存储的数据进行模型拟合。已知的类存储在名为 Character
的变量中。将生成的模型存储在名为 knnmodel
的变量中。
knnmodel = fitcknn(features,"Character")
结果
任务 2
背景
predict
函数用于确定新观测值的预测类。
predClass = predict(model,newdata)
输入是经过训练的模型和新观测值。输出是 newdata
中每个观测值的预测类的分类数组。
通常情况下,新观测值以表的形式出现,其预测变量与用于训练模型的预测变量相同。然而,在本例中,模型使用了两个数值特征(纵横比和持续时间),因此观测值也能以具有两列的数值数组形式出现。
任务
使用 predict
函数和经过训练的模型 knnmodel
对纵横比为 4、持续时间为 1.2 的一个字母进行分类。将预测存储在名为 predicted
的变量中。以二元素行向量形式提供字母特征。
predicted = predict(knnmodel,[4,1.2])
结果
任务 3
背景
通过在调用 fitcknn
时设置 "NumNeighbors"
属性,可以在 kNN 模型中指定 k 的值。
mdl = fitcknn(data,"ResponseVariable",...
"NumNeighbors",10);
任务
重复前两个任务中的命令,但使用 "NumNeighbors"
选项将模型中的邻点数更改为 5。
knnmodel = fitcknn(features,"Character","NumNeighbors",5)
predicted = predict(knnmodel,[4,1.2])
结果
2.7 评估模型
任务 1
kNN 模型的性能如何?您可以使用该模型进行预测,但这些预测的性能如何?通常,您需要让模型对已知正确分类的观测值进行预测,以此来测试模型。
文件 featuredata.mat
包含表 testdata
,该表具有与 features
相同的变量,包括测试观测值的已知所属类。不过,features
并不包含testdata
中的观测值。您可以使用 predict
函数来获得 kNN 模型对 testdata
中的观测值的预测,然后将预测情况与已知类进行比较,以评估该模型对新数据的处理效果。
请注意,使用模型执行预测时,predict
函数将忽略 Character
变量。
任务
使用 predict
函数和经过训练的模型 knnmodel
对表 testdata
中的字母进行分类。将预测存储在名为 predictions
的变量中。
% Do not edit. This code loads the data.
load featuredata.mat
knnmodel = fitcknn(features,"Character","NumNeighbors",5);
testdata
predictions = predict(knnmodel,testdata)
结果
任务 2
测试观测值的已知所属类存储在表 testdata
的变量 Character
中。
任务
使用 ==
运算符将 predictions
与已知类进行比较。将结果存储在名为 iscorrect
的变量中。
iscorrect = predictions == testdata.Character
结果
任务 3
任务
将正确预测数除以预测总数,计算出正确预测的比例。将结果存储在名为 accuracy
的变量中。您可以使用 sum
函数确定正确预测数,使用 numel
函数来确定预测总数。
accuracy = sum(iscorrect)/numel(predictions)
结果
任务 4
常用的评估模型指标是误分类率(不正确预测的比例),而不是准确度(正确预测的比例)。
任务
使用 ~=
运算符确定误分类率。将结果存储在名为 misclassrate
的变量中。
iswrong = predictions ~= testdata.Character
misclassrate = sum(iswrong)/numel(predictions)
结果
任务 5
准确度和误分类率使用单个值来描述模型的整体性能,但进一步细分模型混淆了哪些类可能会很有用。混淆矩阵显示真实类和预测类的每个组合的观测值数目。
混淆矩阵通常根据元素的值给元素着色来实现可视化。通常,对角线元素(正确分类)用同一种颜色着色,其他元素(不正确分类)用另一种颜色着色。您可以使用 confusionchart
函数来可视化混淆矩阵。
confusionchart(ytrue,ypred);
其中 ytrue
是已知类的向量,ypred
是预测类的向量。
任务
使用 confusionchart
函数将 predictions
与已知标签(存储在表 testdata
的变量 Character
中)进行比较。
confusionchart(testdata.Character,predictions)
结果
2.8 复习
任务 1
背景
MAT 文件 featuredata13letters.mat
包含表 (features
),其中的特征与之前的相同。然而,现在的数据包括 13 个不同字母的采样。
任务
使用 gscatter
函数对 features
中的观测值绘图,水平轴为纵横比,垂直轴为持续时间,按类着色(存储在 Character
变量中)。
不会评估坐标轴范围,但您可能希望用这些范围进行试验,以放大大部分观测值。
% Do not edit. This code loads the data.
load featuredata13letters.mat
features
testdata
gscatter(features.AspectRatio,features.Duration,features.Character)
xlim([0 10])
结果
任务 2
任务
使用 fitcknn
函数对数据进行模型拟合。将 "NumNeighbors"
属性设置为 5。将模型存储在名为 knnmodel
的变量中。使用模型预测 testdata
中存储的观测值的类。将预测存储在名为 predictions
的变量中。
knnmodel = fitcknn(features,"Character","NumNeighbors",5);
predictions = predict(knnmodel,testdata);
结果
任务 3
表 testdata
包含变量 Character
中的已知类。
任务
计算模型的误分类率,创建一个混淆矩阵图。将误分类率存储在名为 misclass
的变量中。
misclass = sum(predictions ~= testdata.Character)/numel(predictions)
confusionchart(testdata.Character,predictions);
结果
✨写作不易,还希望各位大佬支持一下
👍 点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!