机器学习的分类模型
分类模型将特征空间划分为多个区域,每个区域用一个合适的输出类别进行标注,是通过训练数据并应用给定的过程(即机器学习方法)得到的。
机器:一台遵循方法的计算机
学习:得到的模型是取决于使用的训练数据
机器学习工具箱
- 可视化:
使用箱线图是一种可视化多个分布的简单方法。
boxplot(x,c)
这将创建一个箱线图,它的箱子表示 c 中每个类的 x 值的分布。如果各个类的 x 值显著不同,则 x 可以作为区分这些类的特征。能够区分不同类的特征越多,就越有可能根据完整数据集来构建准确的分类模型。
- 执行预测
predict 函数来获得模型对新数据的预测。
preds = predict(model,newdata)
使用 ~= 运算符确定误分类率(不正确预测数除以预测总数)。将结果存储在名为 misclassrate 的变量中。
iswrong = predLetter~=testdata.Character
misclassrate = sum(iswrong)/numel(iswrong)
在训练或测试数据中,响应类不总是均匀分布的。损失是一种更合理的误分类度量,它包含每个类的概率(基于数据中的分布)。
loss(model,testdata)
计算已知正确类的任何数据集的损失。尝试确定原始训练数据 (traindata) 的损失。这称为再代入损失(当训练数据“再代入”模型时的损失)。可以直接用 resubLoss(knnmodel) 计算再代入损失。
- 识别误分类
生成混淆图时,您可以通过分别添加行或列汇总来补充关于每个类的假负和假正率的信息。
confusionchart(...,"RowSummary","row-normalized");
行汇总显示每个类的假负率。这会显示 kNN 模型最难识别的字母(即模型最容易识别为其他字母的字母)。有些混淆似乎是合理的,如 U/V 或 H/N。有些混淆则更出乎意料,如 U/K。确定感兴趣的误分类后,可能希望查看一些特定的数据采样,以了解误分类的原因。
falseneg 的逻辑数组,该数组能标识将字母 U 误分类为其他字母的测试数据实例。即,真实类 (testdata.Character) 是“U”而预测类 (predLetter) 不是“U”的元素。
使用逻辑数组 falseneg 作为 testfiles 的索引来确定被不正确分类为字母 U 的观测值的文件名。
使用 falseneg 作为 predLetter 的索引来确定相关联的预测字母。
使用 readtable 函数将 fnfiles 的第四个元素中的数据导入名为 badU 的表中。通过绘制 Y 对 X 的图来可视化字母。
falseneg = (testdata.Character == "U") & (predLetter ~= "U")
fnfiles = testfiles(falseneg)
fnpred = predLetter(falseneg)
badU = readtable(fnfiles(3))
plot(badU.X,badU.Y)
title("Prediction: "+string(fnpred(3)))
- 调查误分类
对于任一响应类 X,您可以将一个机器学习模型的预测分为四个组:
真正- 预测为 X 且实际为 X
真负- 预测不为 X 且实际不为 X
假正- 预测为 X 但实际不为 X
假负- 预测不为 X 但实际为 X
提取特征数据
- 使用逻辑索引仅提取字母 N 和 U 的训练数据
- 提取其中字母 U 被误分类(即 U 的假负)的测试数据
idx = (traindata.Character == "U") | (traindata.Character == "N")
UorN = traindata(idx,:)
falidx = (testdata.Character == "U") & (predLetter ~= "U") %U的假负
fnU = testdata(falidx,:)
清理
分类变量保存着可能类的完整列表,即使有时数据中只存在部分类。当研究部分类时,重新定义可能类的集,将其限定于数据中包含的类,这样会很有用。removecats 函数删除未使用的类别。
```matlab
cmin = removecats(cfull)
提取特征
可以使用花括号 ({ }) 将数据从表中提取到单一类型的数组中。
datamatrix = datatable{1:10,4:6}
这将提取变量 4、5 和 6 的前 10 个元素。如果这些变量为数值类型,datamatrix 将是一个 10×3 双精度数组。
绘制
平行坐标图将每个观测值的特征值(或“坐标”)显示为一条线。
要比较不同类的特征值,请使用 "Group" 选项
parallelcoords(UorNfeat,"Group",UorN.Character)
通过分类学习器可以轻松地使用不同模型进行试验。也可以尝试其他方式,例如,对于 kNN 模型,可以更改邻点的数量、基于距离的邻点的权重以及距离的定义方式。
一些分类方法对训练数据高度敏感,这意味着使用基于不同数据子集训练的不同模型,获得的预测可能差异很大。我们可以利用这一点来建立一个集成模型,将其转化为优势,集成模型使用训练数据的不同排列来训练大量所谓的弱学习器,并使用各个预测的分布来进行最终预测。
在字迹示例中,一些字母对组(例如 N 和 V)具有许多相似的特征,只能通过一个或两个关键特征来区分。这意味着基于距离的方法(如 kNN)可能难以处理这些对组。另一种方法是使用名为纠错输出编码 (ECOC) 的集成方法,用多个模型来区分不同的二类对组。也就是说,用一个模型区分 N 和 V,用另一本模型区分 N 和 E,再用一个模型区分 E 和 V,依此类推。