使用贝叶斯优化迈向自动化模型选择
这个例子展示了如何为给定的训练数据集构建多个分类模型,使用贝叶斯优化优化它们的超参数,并选择在测试数据集上表现最好的模型。
训练几个模型并调整它们的超参数通常需要几天或几周的时间。创建一个脚本来自动开发和比较多个模型会快得多。你也可以使用贝叶斯优化来加速这个过程。不是用不同的超参数集训练每个模型,而是选择几个不同的模型,并使用贝叶斯优化来调优它们的默认超参数。贝叶斯优化通过最小化模型的目标函数来找到给定模型的最优超参数集。该优化算法在每次迭代中策略性地选择新的超参数,通常比简单的网格搜索更快地到达最优超参数集。您可以使用本例中的脚本对给定的训练数据集使用贝叶斯优化来训练几个分类模型,并确定在测试数据集上表现最好的模型。
或者,要在选择的分类器类型和超参数值中自动选择分类模型,请使用fitcauto
.使用示例请参见基于贝叶斯和ASHA优化的自动分类器选择.
负载样本数据
中存储的1994年人口普查数据census1994.mat
.该数据集由美国人口普查局的人口统计数据组成,用于预测个人年收入是否超过5万美元。分类任务是拟合一个模型,该模型根据人们的年龄、工人阶级、教育水平、婚姻状况、种族等来预测他们的工资类别。
加载样例数据census1994
并显示数据集中的变量。
负载census1994谁
名称大小字节分类属性描述20x74 2960 char adultdata 32561x15 1872566 table adulttest 16281x15 944466表
census1994
包含训练数据集adultdata
测试数据集成人
.对于本例,为了减少运行时间,从原始表中分别抽取5000个训练和测试观察值adultdata
和成人
,使用datasample
函数。(如果想使用完整的数据集,可以跳过这一步。)
NumSamples = 5000;s = RandStream(“mlfg6331_64”);%为了重现性成人数据=数据样本(s,成人数据,NumSamples,“替换”、假);数据样本(s,成人样本,NumSamples,“替换”、假);
预览训练数据集的前几行。
头(adultdata)
年龄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从未结过婚家政工人-清洁工自己的孩子白人男性0 0 0 45美国私人单身白人女性0 0 0 58美国离婚其他服务非家庭成员白人女性0 0 0 40美国私人2 0 0 029e+05某些大学10已婚公民配偶销售丈夫白人男性0 0 0 32美国联邦政府39643 HS-grad 9丧偶行政管理非家庭成员白人女性0 0 0 58美国私人81859 HS-grad 9已婚公民-配偶机器-检查丈夫白人男性0 0 48美国bbb50 k 37私人1.2429e+05 Some-college 10已婚公民-配偶/牧师丈夫白人男性0 0 50美国<=50K
每一行表示一个成年人的属性,如年龄、教育程度和职业。最后一栏工资
显示一个人的年薪是小于等于$50,000还是大于$50,000。
理解数据并选择分类模型
统计和机器学习工具箱™提供了几种分类选项,包括分类树,判别分析,朴素贝叶斯,最近邻,支持向量机(svm)和分类集成。金宝app有关算法的完整列表,请参见分类.
在为你的问题选择算法之前,检查你的数据集。人口普查数据有几个值得注意的特点:
数据是表格式的,包含数值变量和分类变量。
数据包含缺失值。
响应变量(
工资
)有两类(二元分类)。
不做任何假设,也不使用预期在数据上能很好地工作的算法的先验知识,您只需训练支持表格数据和二元分类的所有算法。金宝app纠错输出码(ECOC)模型用于具有两个以上类的数据。判别分析和最近邻算法不分析同时包含数值变量和分类变量的数据。因此,适合这个例子的算法是支持向量机、决策树、决策树集合和朴素贝叶斯模型。其中一些模型,如决策树模型和朴素贝叶斯模型,更擅长处理缺失值的数据;也就是说,它们返回non-南
缺失值的观测值的预测分数。
构建模型和调优超参数
为了加快这个过程,定制超参数优化选项。指定“ShowPlots”
作为假
和“详细”
为0分别禁用绘图和消息显示。同时,指定“UseParallel”
作为真正的
并行运行贝叶斯优化,这需要并行计算工具箱™。由于并行时序的不可再现性,并行贝叶斯优化不一定产生可再现的结果。
假设= struct(“ShowPlots”假的,“详细”0,“UseParallel”,真正的);
启动一个并行池。
Poolobj = gcp;
使用“本地”配置文件启动并行池(parpool)…连接到并行池(工人数量:8)。
通过调用每个拟合函数并设置其值,可以很容易地拟合训练数据集并调整参数“OptimizeHyperparameters”
名称-值对参数“汽车”
.创建分类模型。
% SVM:具有多项式核的SVM和具有高斯核的SVMMdls {1} = fitcsvm(成人数据,“工资”,“KernelFunction”,多项式的,“标准化”,“上”,…“OptimizeHyperparameters”,“汽车”,“HyperparameterOptimizationOptions”, hypopts);Mdls {2} = fitcsvm(成人数据,“工资”,“KernelFunction”,“高斯”,“标准化”,“上”,…“OptimizeHyperparameters”,“汽车”,“HyperparameterOptimizationOptions”, hypopts);%决策树Mdls {3} = fitctree(成人数据,“工资”,…“OptimizeHyperparameters”,“汽车”,“HyperparameterOptimizationOptions”, hypopts);决策树集合Mdls {4} = fitcensemble(成人数据,“工资”,“学习者”,“树”,…“OptimizeHyperparameters”,“汽车”,“HyperparameterOptimizationOptions”, hypopts);%朴素贝叶斯Mdls {5} = fitcnb(成人数据,“工资”,…“OptimizeHyperparameters”,“汽车”,“HyperparameterOptimizationOptions”, hypopts);
警告:建议您在优化朴素贝叶斯“宽度”参数时首先标准化所有数字预测因子。如果您这样做了,请忽略此警告。
绘制最小目标曲线
从每个模型中提取贝叶斯优化结果,并在每次超参数优化迭代中绘制每个模型目标函数的最小观测值。目标函数值对应于使用训练数据集进行五重交叉验证测量的误分类率。该图比较了每个模型的性能。
图保存在N = length(mdls);为i = 1:N mdl = mdls{i};results = mdls{i}.HyperparameterOptimizationResults;情节(结果。ObjectiveMinimumTrace,“标记”,“o”,“MarkerSize”5);结束名称= {“SVM-Polynomial”,“SVM-Gaussian”,“决策树”,“Ensemble-Trees”,“天真的贝叶斯};传奇(名称,“位置”,“东北”)标题(“贝叶斯优化”)包含(“迭代次数”) ylabel (“最小目标值”)
使用贝叶斯优化来找到更好的超参数集,可以在多次迭代中提高模型的性能。在这种情况下,该图表明决策树的集合对数据具有最佳的预测精度。该模型在多次迭代和不同的贝叶斯优化超参数集上表现良好。
用测试集检查性能
使用混淆矩阵和接收者工作特征(ROC)曲线对测试数据集进行分类器性能检查。
找到测试数据集的预测标签和分数值。
label = cell(N,1);score = cell(N,1);为1:N [label{i},score{i}] = predict(mdls{i},adulttest);结束
混淆矩阵
方法获得每个测试观测值的最可能的类预测
各型号的功能。然后用预测类和测试数据集的已知(真实)类计算混淆矩阵confusionchart
函数。
figure c = cell(N,1);为i = 1:N subplot(2,3,i) c{i} = confusionchart(adulttest.salary,label{i});标题(名字{我})结束
对角线元素表示给定类的正确分类实例的数量。非对角线元素是错误分类观测的实例。
ROC曲线
通过绘制每个分类器的ROC曲线并计算ROC曲线下的面积(AUC)来更仔细地检查分类器的性能。ROC曲线显示了不同分类分数阈值的真阳性率与假阳性率。对于一个完美的分类器,无论阈值如何,其真阳性率始终为1,AUC = 1。对于随机将观测值分配给类的二元分类器,AUC = 0.5。AUC值大(接近1)表示分类器性能好。
计算ROC曲线的指标,并通过创建一个rocmetrics
对象对应每个分类器。绘制标签的ROC曲线“< = 50 k”
通过使用情节
的函数rocmetrics
.
图AUC = 0 (1,N);为i = 1:N rocObj = rocmetrics(adulttest.salary,score{i},mdls{i}.ClassNames);[r,g] = plot(rocObj),“类名”,“< = 50 k”);r. displayname =替换(r.)DisplayName,“< = 50 k”我,名字{});g(1)。DisplayName = join([name {i},“模范工作点”]);AUC(i) = rocObj.AUC(1);持有在结束标题(<=50K的ROC曲线)举行从
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 = cell(1,length(selectedMdls));为i = 1:length(selectedMdls) newresults{i} = resume(selectedMdls{i})HyperparameterOptimizationResults,“MaxObjectiveEvaluations”, 30);情节(newresults{}。ObjectiveMinimumTrace,“标记”,“o”,“MarkerSize”5)结束标题(“简历中的贝叶斯优化”)包含(“迭代次数”) ylabel (“最小目标值”)({传奇“SVM-Polynomial”,“SVM-Gaussian”,“Ensemble-Trees”},“位置”,“东北”)
前30次迭代对应于第一轮贝叶斯优化。接下来的30次迭代对应于重新开始
函数。恢复优化是有用的,因为在前30次迭代之后,损失继续进一步减少。
另请参阅
confusionchart
|perfcurve
|重新开始
|BayesianOptimization