这个例子展示了如何为一个给定的训练数据集建立多个分类模型,使用贝叶斯优化优化它们的超参数,并选择在测试数据集上表现最好的模型。
训练几个模型并调优它们的超参数通常需要几天或几周的时间。创建一个脚本来自动开发和比较多个模型会快得多。您还可以使用贝叶斯优化来加快这个过程。不是使用不同的超参数集训练每个模型,而是选择几个不同的模型,并使用贝叶斯优化调优它们的默认超参数。贝叶斯优化通过最小化模型的目标函数来为给定的模型找到最优的超参数集。该优化算法在每次迭代中战略性地选择新的超参数,通常比简单的网格搜索更快地得到最优的超参数集。您可以使用本例中的脚本对给定的训练数据集使用贝叶斯优化来训练几个分类模型,并确定在测试数据集上表现最好的模型。
或者,要自动选择分类模型,跨各种分类器类型和超参数值,使用FitCauto.
.例如,请参见自动分类器选择贝叶斯和ASHA优化.
此示例使用1994年存储的人口普查数据census1994.mat
.该数据集由美国人口普查局(US Census Bureau)的人口统计数据组成,用来预测一个人的年收入是否超过5万美元。分类任务是拟合一个模型,根据年龄、工人阶级、教育水平、婚姻状况、种族等因素预测人们的工资类别。
加载示例数据census1994
并在数据集中显示变量。
负载census1994谁是
名称大小字节类属性描述20x74 2960 char adultdata 32561x15 1872567 table adulttest 16281x15 944467 table
census1994
包含培训数据集adultdata
和测试数据集成人
.对于此示例,从原始表中减少运行时间,每个训练和测试观察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
每一行代表一个成年人的属性,如年龄、教育和职业。最后一列薪水
显示一个人是否有薪水小于或等于每年50,000美元或每年大于50,000美元。
Statistics and Machine Learning Toolbox™提供了几种分类选项,包括分类树、判别分析、朴素贝叶斯、最近邻、支持向量机(svm)和分类集成。金宝app有关算法的完整列表,请参见分类.
在为你的问题选择算法之前,检查你的数据集。人口普查数据有几个值得注意的特点:
数据是表格,包含数字和分类变量。
数据包含缺失值。
响应变量(薪水
)有两个课程(二进制分类)。
在不制定任何假设或使用您希望在您的数据上运行的算法的先验知识,您只需培训支持表格数据和二进制分类的所有算法。金宝app纠错输出代码(ECOC)模型用于具有两个以上类的数据。判别分析和最近的邻居算法不会分析包含数字和分类变量的数据。因此,适合于该示例的算法是SVM,决策树,决策树的集合和朴素的贝叶斯模型。
为了加快进程,自定义超参数优化选项。指定“ShowPlots”
作为假
和“详细”
作为0分别禁用绘图和消息显示。另外,指定'使用指惯'
作为真正的
并行运行贝叶斯优化,这需要并行计算工具箱™。由于并行时序的不可递容性,并行贝叶斯优化不一定产生可重复的结果。
hypopts =结构(“ShowPlots”假的,“详细”,0,'使用指惯',真的);
启动并行池。
poolobj = gcp;
您可以通过调用每个拟合函数来容易地拟合培训数据集和调谐参数并设置其“OptimizeHyperparameters”
的名称-值对参数'汽车'
.创建分类模型。
支持向量机:多项式核支持向量机和高斯核支持向量机mdls {1} = fitcsvm (adultdata,“工资”那“KernelFunction”那多项式的那“标准化”那“上”那......“OptimizeHyperparameters”那'汽车'那“HyperparameterOptimizationOptions”,低管);MDLS {2} = FITCSVM(Adultiandata,“工资”那“KernelFunction”那'高斯'那“标准化”那“上”那......“OptimizeHyperparameters”那'汽车'那“HyperparameterOptimizationOptions”,低管);%决策树mdls {3} = fitctree (adultdata,“工资”那......“OptimizeHyperparameters”那'汽车'那“HyperparameterOptimizationOptions”,低管);决策树的%集合mdls {4} = fitcensemble (adultdata,“工资”那'学习者'那“树”那......“OptimizeHyperparameters”那'汽车'那“HyperparameterOptimizationOptions”,低管);%朴素贝叶斯mdls {5} = fitcnb(Adultiandata,“工资”那......“OptimizeHyperparameters”那'汽车'那“HyperparameterOptimizationOptions”,低管);
警告:建议您在优化朴素贝叶斯“宽度”参数时首先标准化所有数值预测器。如果您已经这样做了,请忽略此警告。
从每个模型中提取贝叶斯优化结果,并在超参数优化的每一次迭代中绘制出每个模型目标函数的最小观测值。目标函数值对应于使用训练数据集进行五次交叉验证所测得的误分类率。该图比较了每个模型的性能。
图保存在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);结束
方法获取每个测试观察的最可能的类预测
各模型的功能。然后利用预测类和测试数据集的已知(真)类计算混淆矩阵困惑的园林
函数。
图c = cell(N,1);为c{i} = confusionchart(adulttest.salary,label{i});标题(名字{我})结束
对角线元素指示给定类的正确归类实例的数量。非对角线元素是错误分类观察的情况。
通过绘制每个分类器的ROC曲线更紧密地检查分类器性能。使用perfcurve
函数来获取X
和y
ROC曲线的坐标和计算的曲线下的区域(AUC)值X
和y
.
绘制ROC曲线对于与标签对应的分数值'<= 50k'
,检查从中返回的分数值的列顺序预测
函数。列顺序与训练数据集中响应变量的类别顺序相同。显示类别顺序。
C =类别(AdultData.Salary)
c =2×1细胞{' < = 50 k '} {' > 50 k '}
绘制ROC曲线。
图保存在AUC = 0 (1, N);为i = 1:n [x,y,〜,auc(i)] = perfcurve(成立.salary,score {i}(:,1),'<= 50k');情节(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 {i} .ObjectiveminimumTrace,“标记”那“o”那“MarkerSize”5)结束标题(“带有简历的贝叶斯优化”)包含(的迭代次数) ylabel (“最低客观价值”)({传奇'svm-polynomial'那“SVM-Gaussian”那“Ensemble-Trees”},“位置”那'东北'的)
前30次迭代对应第一轮贝叶斯优化。接下来的30次迭代对应于恢复
函数。恢复优化是有用的,因为在前30次迭代之后损失会进一步减少。
困惑的园林
|perfcurve
|恢复
|BayesianOptimization