这个例子展示了如何为一个给定的训练数据集建立多个分类模型,使用贝叶斯优化优化它们的超参数,并选择在测试数据集上表现最好的模型。
训练几个模型并调优它们的超参数通常需要几天或几周的时间。创建一个脚本来自动开发和比较多个模型会快得多。您还可以使用贝叶斯优化来加快这个过程。不是使用不同的超参数集训练每个模型,而是选择几个不同的模型,并使用贝叶斯优化调优它们的默认超参数。贝叶斯优化通过最小化模型的目标函数来为给定的模型找到最优的超参数集。该优化算法在每次迭代中战略性地选择新的超参数,通常比简单的网格搜索更快地得到最优的超参数集。您可以使用本例中的脚本对给定的训练数据集使用贝叶斯优化来训练几个分类模型,并确定在测试数据集上表现最好的模型。
或者,要在选择的分类器类型和超参数值之间自动选择分类模型,请使用fitcauto
.例如,请参见基于贝叶斯优化的自动分类器选择.
该示例使用存储在census1994.mat
.该数据集由美国人口普查局(US Census Bureau)的人口统计数据组成,用来预测一个人的年收入是否超过5万美元。分类任务是拟合一个模型,根据年龄、工人阶级、教育水平、婚姻状况、种族等因素预测人们的工资类别。
加载示例数据census1994
并在数据集中显示变量。
负载census1994谁
名称大小字节类属性描述20x74 2960 char adultdata 32561x15 1872567 table adulttest 16281x15 944467 table
census1994
包含训练数据集adultdata
和测试数据集成人
.对于本例,为了减少运行时间,从原始表中分别抽取5000个训练和测试观察adultdata
和成人
,通过使用datasample
函数。(如果要使用完整的数据集,可以跳过此步骤。)
NumSamples = 5000;s = RandStream (“mlfg6331_64”);%的再现性adultdata = datasample (s adultdata NumSamples,“替换”、假);成人,成人= datasample(年代,NumSamples,“替换”、假);
预览训练数据集的前几行。
头(adultdata)
ans =8×15表年龄workClass fnlwgt教育education_num marital_status种族职业关系性capital_gain capital_loss hours_per_week native_country薪水 ___ ___________ __________ ____________ _____________ __________________ _________________ ______________ _____ ______ ____________ ____________ ______________ ______________ ______ 39个人4.91 e + 05单身汉13未婚Exec-managerial相关黑人男性45 0 0美国< = 50 k 25私人2.2022 e + 05年11日7未婚Handlers-cleaners自己孩子的白人男性45 0 0美国< = 50 k 24私人2.2761 e + 05年10 6离婚Handlers-cleaners未婚白人女性0 0 58美国< = 50 k私人1.7329 e + 05 HS-grad 519离婚的其他服务家族白人女性40 0 0美国< = 50 k 54私人2.8029 e + 05一些大学10 Married-civ-spouse销售丈夫白人男性0 0 32美国< = 50 k 53 Federal-gov 39643 HS-grad 9寡妇Exec-managerial家族白人女性0 0 58美国< = 50 k私人81859 HS-grad 9 Married-civ-spouse 52机器op-督察丈夫白人男性0 0 48美国>50K 37私人1.2429e+05一些大学10已婚公民配偶行政长官丈夫白人男性0 0 50美国<=50K
每一行代表一个成年人的属性,如年龄、教育和职业。最后一列工资
显示一个人的年薪是低于或等于5万美元还是高于5万美元。
Statistics and Machine Learning Toolbox™提供了几种分类选项,包括分类树、判别分析、朴素贝叶斯、最近邻、支持向量机(svm)和分类集成。金宝app有关算法的完整列表,请参见分类.
在为你的问题选择算法之前,检查你的数据集。人口普查数据有几个值得注意的特点:
数据是表格式的,包含数字变量和分类变量。
数据包含丢失的值。
响应变量(工资
)有两类(二进制分类)。
在不做任何假设或使用预期在数据上运行良好的算法的先验知识的情况下,只需训练所有支持表格数据和二进制分类的算法。金宝app纠错输出码(ECOC)模型用于包含两个以上类的数据。判别分析和最近邻算法不分析既包含数字变量又包含分类变量的数据。因此,适合这个例子的算法是支持向量机、决策树、决策树集合和朴素贝叶斯模型。
为了加快进程,自定义超参数优化选项。指定“ShowPlots”
作为假
和“详细”
为0,分别禁用绘图和消息显示。同时,指定“UseParallel”
作为真正的
并行运行贝叶斯优化,这需要并行计算工具箱™。由于并行时序的不可再现性,并行贝叶斯优化并不一定产生可再现的结果。
hypopts =结构(“ShowPlots”假的,“详细”0,“UseParallel”,真正的);
启动并行池。
poolobj =质量;
通过调用每个拟合函数并设置拟合函数,可以方便地拟合训练数据集和调整参数“OptimizeHyperparameters”
的名称-值对参数“汽车”
.创建分类模型。
支持向量机:多项式核支持向量机和高斯核支持向量机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 = mdl {i};结果= mdls{我}.HyperparameterOptimizationResults;情节(结果。ObjectiveMinimumTrace,“标记”,“o”,“MarkerSize”5);结束名称= {“SVM-Polynomial”,“SVM-Gaussian”,“决策树”,“Ensemble-Trees”,“天真的贝叶斯};传奇(名称,“位置”,“东北”)标题(“贝叶斯优化”)包含(的迭代次数) ylabel (“最低客观价值”)
使用贝叶斯优化来找到更好的超参数集可以在多次迭代中提高模型的性能。在这种情况下,图表明决策树集成对数据的预测精度最好。该模型在多次迭代和不同的贝叶斯优化超参数集中均表现良好。
使用混淆矩阵和受试者工作特征(ROC)曲线,用测试数据集检查分类器性能。
找到测试数据集的预测标签和评分值。
标签=细胞(N, 1);分数=细胞(N, 1);为i = 1:N [label{i},score{i}] = predict(mls {i},adulttest);结束
方法获取每个测试观察的最可能的类预测
各模型的功能。然后利用预测类和测试数据集的已知(真)类计算混淆矩阵confusionchart
函数。
图c = cell(N,1);为c{i} = confusionchart(adulttest.salary,label{i});标题(名字{我})结束
对角线元素表示给定类正确分类的实例的数量。非对角线元素是错误分类观察的实例。
通过为每个分类器绘制ROC曲线更仔细地检查分类器的性能。使用perfcurve
函数来获取X
和Y
ROC曲线的坐标和曲线下面积(AUC)值的计算X
和Y
.
绘制对应于标签的得分值的ROC曲线“< = 50 k”
,检查从中返回的分数值的列顺序预测
函数。列的顺序与训练数据集中响应变量的类别顺序相同。显示类别顺序。
c =类别(adultdata.salary)
c =2×1细胞{' < = 50 k '} {' > 50 k '}
绘制ROC曲线。
图保存在AUC = 0 (1, N);为i = 1: N [X, Y, ~, AUC (i)) = perfcurve (adulttest.salary,分数{我}(:1),“< = 50 k”);情节(X, Y)结束标题(“ROC曲线”)包含(的假阳性率) ylabel (“真阳性率”)传说(名称,“位置”,“东南”)
ROC曲线显示了分类器输出的不同阈值的真实阳性率与假阳性率(或灵敏度与1 -特异性)。
现在用条形图绘制AUC值。对于一个完美的分类器,无论阈值如何,其真实阳性率始终为1,则AUC = 1。对于随机分配观察到的类的分类器,AUC = 0.5。AUC值越大表示分类器性能越好。
图酒吧(AUC)标题(“曲线下面积”)包含(“模型”) ylabel (“AUC”) xticklabels(names) 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)结束标题(“带有简历的贝叶斯优化”)包含(的迭代次数) ylabel (“最低客观价值”)({传奇“SVM-Polynomial”,“SVM-Gaussian”,“Ensemble-Trees”},“位置”,“东北”)
前30次迭代对应第一轮贝叶斯优化。接下来的30次迭代对应于的简历
函数。恢复优化是有用的,因为在前30次迭代之后损失会进一步减少。
BayesianOptimization
|confusionchart
|perfcurve
|的简历