这个例子说明了如何构建一个给定的训练数据集多种分类模型,使用贝叶斯优化优化其超参数,并选择模型表现最好的测试数据集。
训练几个模型并调优它们的超参数通常需要几天或几周的时间。创建一个脚本来自动开发和比较多个模型会快得多。您还可以使用贝叶斯优化来加快这个过程。不是使用不同的超参数集训练每个模型,而是选择几个不同的模型,并使用贝叶斯优化调优它们的默认超参数。贝叶斯优化通过最小化模型的目标函数来为给定的模型找到最优的超参数集。该优化算法在每次迭代中战略性地选择新的超参数,通常比简单的网格搜索更快地得到最优的超参数集。您可以使用本例中的脚本对给定的训练数据集使用贝叶斯优化来训练几个分类模型,并确定在测试数据集上表现最好的模型。
或者,要在选择的分类器类型和超参数值之间自动选择分类模型,请使用fitcauto
.例如,请参见基于贝叶斯优化的自动分类器选择.
该示例使用存储在census1994.mat
.该数据集由美国人口普查局(US Census Bureau)的人口统计数据组成,用来预测一个人的年收入是否超过5万美元。分类任务是拟合一个模型,根据年龄、工人阶级、教育水平、婚姻状况、种族等因素预测人们的工资类别。
装入样本数据census1994
并显示在数据集中的变量。
负载census1994谁
名称大小字节类属性描述20x74 2960字符adultdata 32561x15 1872567表adulttest 16281x15 944467表
census1994
包含训练数据集adultdata
和测试数据集adulttest
.对于本例,为了减少运行时间,从原始表中分别抽取5000个训练和测试观察adultdata
和adulttest
,通过使用datasample
函数。(如果您想使用完整的数据集可以跳过此步骤。)
NUMSAMPLES = 5000;S = RandStream(“mlfg6331_64”);%用于重现adultdata = datasample (s adultdata NumSamples,'代替',错误的);adulttest = datasample(S,adulttest,NUMSAMPLES,'代替',错误的);
预览训练数据集的前几行。
头(adultdata)
ans =8×15表年龄workClass fnlwgt教育education_num婚姻状况职业关系种族性别capital_gain capital_loss hours_per_week NATIVE_COUNTRY工资___ ___________ __________ ____________ _____________ __________________ _________________ ______________ _____ ______ ____________ ____________ ______________ ______________ ______ 39私人4.91e + 05 13学士学位从未结婚Exec的-管理其他相对黑色男性00 45美国 - 美国<= 50K 25私人2.2022e + 05 11 7未婚处理程序的清洁剂自己孩子的白人男性0 0 45美国 - 美国<= 50K 24私人2.2761e + 05 10 6离婚处理程序,清洁剂未婚白女0 0 58美国 - 美国<= 50K 51私人1.7329e + 05 HS-毕业生9离婚其他服务不在位家庭的白人女性0 0 40美国 - 美国<= 50K 54私人2.8029e + 05部分,大专10已婚,CIV配偶销售丈夫白男0 0 32美国 - 美国<= 50K 53联邦政务39643 HS-毕业生9丧偶Exec的-管理不在位家庭的白人女性0 0 58美国 - 美国<= 50K体52private 81859 HS-毕业生9已婚,CIV配偶机运inspct丈夫白人男性0 0 48美国 - 美国> 50K 37私人1.2429e + 05部分,大专10已婚,CIV配偶ADM-文书丈夫白人男性0 0美国50-美国<= 50K
每一行代表一个成人的属性,如年龄,学历和职业。最后一列工资
显示一个人的年薪是低于或等于5万美元还是高于5万美元。
统计和机器学习工具箱™提供了分类几个选项,包括分类树,判别分析,朴素贝叶斯,最近的邻居,支持向量机(SVM),并分类合奏。金宝app对于算法的完整列表,请参阅分类.
在为你的问题选择算法之前,检查你的数据集。人口普查数据有几个值得注意的特点:
数据是表格式的,包含数字变量和分类变量。
数据包含丢失的值。
响应变量(工资
)有两类(二进制分类)。
在不做任何假设或使用预期在数据上运行良好的算法的先验知识的情况下,只需训练所有支持表格数据和二进制分类的算法。金宝app纠错输出码(ECOC)模型用于包含两个以上类的数据。判别分析和最近邻算法不分析既包含数字变量又包含分类变量的数据。因此,适合这个例子的算法是支持向量机、决策树、决策树集合和朴素贝叶斯模型。
为了加快这一进程,定制超参数优化选项。指定'ShowPlots'
作为假
和“详细”
为0,分别禁用绘图和消息显示。同时,指定“UseParallel”
作为真的
并行运行贝叶斯优化,这需要并行计算工具箱™。由于并行时序的不可再现性,并行贝叶斯优化并不一定产生可再现的结果。
hypopts =结构('ShowPlots',错误的,“详细”0,“UseParallel”,真正的);
开始并行池。
poolobj =质量;
通过调用每个拟合函数并设置拟合函数,可以方便地拟合训练数据集和调整参数“OptimizeHyperparameters”
名称 - 值对参数“汽车”
.创建分类模型。
支持向量机%:SVM与多项式核及SVM与高斯核mdls {1} = fitcsvm (adultdata,“工资”,'KernelFunction',“多项式”,“标准化”,“上”,...“OptimizeHyperparameters”,“汽车”,“HyperparameterOptimizationOptions”, hypopts);mdls {2} = fitcsvm (adultdata,“工资”,'KernelFunction',“高斯”,“标准化”,“上”,...“OptimizeHyperparameters”,“汽车”,“HyperparameterOptimizationOptions”, hypopts);%决策树MDLS {3} = fitctree(adultdata,“工资”,...“OptimizeHyperparameters”,“汽车”,“HyperparameterOptimizationOptions”, hypopts);决策树的集合MDLS {4} = fitcensemble(adultdata,“工资”,“学习者”,'树',...“OptimizeHyperparameters”,“汽车”,“HyperparameterOptimizationOptions”, hypopts);%朴素贝叶斯mdls {5} = fitcnb (adultdata,“工资”,...“OptimizeHyperparameters”,“汽车”,“HyperparameterOptimizationOptions”, hypopts);
警告:建议您优化朴素贝叶斯“宽度”参数时,第一个标准化的所有数字预测。如果你这样做,是忽略此警告。
从每个模型中提取贝叶斯优化结果,并在超参数优化的每一次迭代中绘制出每个模型目标函数的最小观测值。目标函数值对应于使用训练数据集进行五次交叉验证所测得的误分类率。该图比较了每个模型的性能。
图保存在N =长度(mdls等);为I = 1:N MDL = MDLS {I};结果= MDLS {I} .HyperparameterOptimizationResults;图(results.ObjectiveMinimumTrace,“标记”,“o”,'MarkerSize'5);结束名称= {“SVM-Polynomial”,“SVM-Gaussian”,“决策树”,“合奏树”,“天真的贝叶斯};传说(姓名,'地点',“东北”) 标题(“贝叶斯优化”)xlabel(“迭代次数”)ylabel(“最低客观价值”)
使用贝叶斯优化来找到更好的超参数集可以在多次迭代中提高模型的性能。在这种情况下,图表明决策树集成对数据的预测精度最好。该模型在多次迭代和不同的贝叶斯优化超参数集中均表现良好。
使用混淆矩阵和受试者工作特征(ROC)曲线,用测试数据集检查分类器性能。
找到预测标签和测试数据集的得分值。
标记=细胞(N,1);得分=细胞(N,1);为I = 1:N [标号{I},得分{I}] =预测(MDLS {I},adulttest);结束
方法获取每个测试观察的最可能的类预测
各模型的功能。然后利用预测类和测试数据集的已知(真)类计算混淆矩阵confusionchart
函数。
图c = cell(N,1);为I = 1:N副区(2,3,i)的13 C {I} = confusionchart(adulttest.salary,标签{I});标题(名称{I})结束
对角线元素表示给定类正确分类的实例的数量。非对角线元素是错误分类观察的实例。
通过为每个分类器绘制ROC曲线更仔细地检查分类器的性能。使用perfcurve
函数来获取X
和Y
ROC曲线的坐标和曲线下面积(AUC)值的计算X
和Y
.
绘制对应于标签的得分值的ROC曲线“< = 50 k”
,检查从中返回的分数值的列顺序预测
函数。列的顺序与训练数据集中响应变量的类别顺序相同。显示类别顺序。
c =类别(adultdata.salary)
C =2×1细胞{ '<= 50K'} { '> 50K'}
绘制ROC曲线。
图保存在AUC =零(1,N);为i = 1: N [X, Y, ~, AUC (i)) = perfcurve (adulttest.salary,分数{我}(:1),“< = 50 k”);图(X,Y)结束标题(“ROC曲线”)xlabel(的假阳性率)ylabel(“真阳性率”)传说(名称,'地点','东南')
ROC曲线显示了分类器输出的不同阈值的真实阳性率与假阳性率(或灵敏度与1 -特异性)。
现在用条形图绘制AUC值。对于一个完美的分类器,无论阈值如何,其真实阳性率始终为1,则AUC = 1。对于随机分配观察到的类的分类器,AUC = 0.5。AUC值越大表示分类器性能越好。
图酒吧(AUC)标题(“曲线下面积”)xlabel('模型')ylabel(“AUC”)xticklabels(地名)xtickangle(30)ylim([0.85,0.925])
基于混淆矩阵和AUC柱状图,决策树和支持向量机模型的集成比决策树和朴素贝叶斯模型的精度更高。
在所有模型上运行贝叶斯优化以进行进一步的迭代,在计算上可能会非常昂贵。相反,选择一个迄今为止运行良好的模型子集,并通过使用的简历
函数。绘制每一次贝叶斯优化迭代的目标函数的最小观测值。
图保存在selectedMdls = MDLS([1,2,4]);newresults =细胞(1,长度(selectedMdls));为newresults{i} = resume(selectedmls {i}. result = 1);HyperparameterOptimizationResults,“MaxObjectiveEvaluations”, 30);情节(newresults{}。ObjectiveMinimumTrace,“标记”,“o”,'MarkerSize',5)结束标题(“贝叶斯优化与简历”)xlabel(“迭代次数”)ylabel(“最低客观价值”) 传奇({“SVM-Polynomial”,“SVM-Gaussian”,“合奏树”},'地点',“东北”)
前30次迭代对应第一轮贝叶斯优化。接下来的30次迭代对应于的简历
函数。恢复优化是有用的,因为在前30次迭代之后损失会进一步减少。
BayesianOptimization
|confusionchart
|perfcurve
|的简历