【MATLAB第42期】基于MATLAB的贝叶斯优化决策树分类算法与网格搜索、随机搜索对比,含对机器学习模型的评估度量介绍

简介: 【MATLAB第42期】基于MATLAB的贝叶斯优化决策树分类算法与网格搜索、随机搜索对比,含对机器学习模型的评估度量介绍

【MATLAB第42期】基于MATLAB的贝叶斯优化决策树分类算法与网格搜索、随机搜索对比,含对机器学习模型的评估度量介绍


网格搜索、随机搜索和贝叶斯优化是寻找机器学习模型参数最佳组合、交叉验证每个参数并确定哪一个参数具有最佳性能的常用方法。


一、 评估指标

1、分类

1.1 准确性

1.2 精度

1.3 召回

1.4 F1值

1.5 F0.5值

1.6 F2值

1.7 计算评估指标的功能

2、回归

2.1 平均绝对误差

2.2 均方误差

2.3 均方根误差

二、 基于F1值执行网格搜索的多循环

三、 fitctree优化选项中的网格搜索(不能将目标函数更改为f1值)

四、 fitctree优化选项中的随机搜索(不能将目标函数更改为f1值)

五、 基于F1值的贝叶斯优化

六、代码获取


在讨论这些方法之前,我想先谈谈评估指标。这是因为从不同的超参数组合中选择最佳模型将是我们的性能指标。


一、 评估指标


这里将讨论不同的评估指标:准确度、精密度、召回率、F1值、F0.5值、F2值、平均绝对误差、均方误差、均方根误差。


1、分类


例如,假设我们的实际标签和预测代码如下:

Actual = {'hi','hi','No hi','hi','No hi','hi','hi','hi','No hi','hi','No hi'};
Prediction = {'hi','No hi','hi','hi','No hi','hi','hi','hi','No hi','No hi','No hi'};
confusionchart(Actual,Prediction);

假设“No hi”对我们来说更重要,因此,我们的评估指标(召回率、精度、F1、F2、F0.5)将集中在“No hi“类上。


1.1 准确性


Accuracy = (3+5)/(3+5+2+1)
%Accuracy =0.72727


1.2 精度


Precision = 3 / (3+2)
%Precision = 0.6


1.3 召回


Recall = 3 / (3+1)
%Recall = 0.75


1.4 F1值


F1 = 2*(Precision*Recall)/(Precision+Recall)
%F1=0.6666667


1.5 F0.5值


权重比召回更注重准确性

F05 = (1+0.5^2)*(Precision*Recall)/((0.5^2)*Precision+Recall)
%F05=0.625


1.6 F2值


权重更强调召回而非准确性

F2 = (1+2^2)*(Precision*Recall)/((2^2)*Precision+Recall)
%F2=0.71429


1.7 计算评估指标的功能


您可以下载下面的函数,通过您的输入(实际和预测)在单行中计算所有评估指标

https://www.mathworks.com/matlabcentral/fileexchange/70978-summary_confusion?s_tid=prof_contriblnk


2、回归


例如,假设我们的预测结果是:

X = randn(100,5);
Actual = X*[1;0;3;0;-1] + randn(100,1);
mdl = fitlm(X,Actual);
Predicted=predict(mdl,X);
plot(X,Actual,'bo','MarkerSize',2)
hold on
plot(X,Predicted,'ko','MarkerSize',2)
title('Actual Vs Predicted')
grid on
set(gca,'Color',[1 0 1])
hold off


2.1 平均绝对误差MAE


MAE = sum(Actual-Predicted)/numel(Actual)
MAE =1.0214e-16


2.2 均方误差MSE


MSE = sum((Actual-Predicted).^2)/numel(Actual)
MSE =0.90475

2.3 均方根误差RMSE


 RMSE = sqrt(sum((Actual-Predicted).^2)/numel(Actual))
RMSE = 0.95118


二、 基于F1值执行网格搜索的多循环


例如,我们将训练具有不同超参数组合的决策树模型。

我们的数据集中有两个类别“b”和“g”,假设类“b”对我们更重要,因此我们将计算b的F1。

超参数的不同组合:

MaxNumSplit : 7,8,9,10

Minimun Leaf : 5,10,15

%导入数据
display(categories(categorical(Y)))
rng(2); % 固定算子
MdlDefault = fitctree(X,Y,'CrossVal','on');
i=1; %初始数量
for MaxNumSplit = 7:1:10
    for MinLeaf = 5:5:15
        Model = fitctree(X,Y,'MaxNumSplits',MaxNumSplit,'MinLeafSize',MinLeaf);        
        %计算每个组合的F1
        Predicted=predict(Model,X);
        confMat=confusionmat(Y,Predicted);   
        recall=confMat(1,1)/sum(confMat(1,:));
        precision=confMat(1,1)/sum(confMat(:,1));
        F1(i) = 2*recall*precision/(recall+precision);
        %记录当前的MaxNumSplit和Min LeafSize
        MaxNumSplit_r(i) = MaxNumSplit;
        MinLeafSize_r(i) = MinLeaf;
        %下一次循环
        i=i+1;
    end
end
%寻找最佳F1值
Best=Final_Result(Final_Result.F1Score==max(Final_Result.F1Score),:)
% 训练当前模型
Model = fitctree(X,Y,'MaxNumSplits',Best.MaxNumSplit,'MinLeafSize',Best.MinLeafSize); 
%绘图展示
view(Model,'mode','graph') 


三、 fitctree优化选项中的网格搜索(不能将目标函数更改为f1值)


据我所知,不能改变fitctree中的目标函数

如果您想详细了解fitctree的参数,可以参考以下文档:

https://www.mathworks.com/help/stats/fitctree.html

默认的目标函数是样本误差或交叉验证误差(准确度=1-误差),因此,如果您想将目标函数更改为F1,我建议您使用上面的循环方法。


我用同样的例子来演示如何在fitctree的优化选项中使用网格搜索。

rng(3);%固定算子
%优化变量及其范围
MaxNumSplit = optimizableVariable('MaxNumSplit',[7,10],'Type','integer');
MinLeaf = optimizableVariable('MinLeaf',[5,15],'Type','integer');
hyperparamtersRF = [MaxNumSplit;MinLeaf];
% 执行网格搜索以找到最佳组合
% verbose=1将显示表中的优化结果
Model = fitctree(X,Y,'OptimizeHyperparameters',hyperparamtersRF,'HyperparameterOptimizationOptions',opts);
Accuracy = 1-min(Model.HyperparameterOptimizationResults.Objective)

因此,从上表的结果中,我们可以注意到最佳组合是4号(MaxNumSplit=8,MinLeaf=14)。这是网格搜索后选定的模型。


四、 fitctree优化选项中的随机搜索(不能将目标函数更改为f1值)


它与网格搜索相同,不能更改目标函数,默认目标函数基于错误(精度=1-错误)。

因此,您可以考虑基于F1分数进行随机搜索的多循环方法。

如果你想在优化选项中使用随机搜索,你只需要将上面的网格搜索改为随机搜索。

rng(3);%固定算子
% 优化变量及范围
MaxNumSplit = optimizableVariable('MaxNumSplit',[7,10],'Type','integer');
MinLeaf = optimizableVariable('MinLeaf',[5,15],'Type','integer');
hyperparamtersRF = [MaxNumSplit;MinLeaf];
%执行网格搜索以找到最佳组合
opts = struct('Optimizer','randomsearch','ShowPlots',true,'AcquisitionFunctionName','expected-improvement-plus','verbose',1);
Model = fitctree(X,Y,'OptimizeHyperparameters',hyperparamtersRF,'HyperparameterOptimizationOptions',opts);
Accuracy = 1-min(Model.HyperparameterOptimizationResults.Objective)


五、 基于F1值的贝叶斯优化


本部分展示了如何实现贝叶斯优化,以使用F1值调整决策树的超参数。它还让您了解如何为贝叶斯优化创建目标函数,因此,您可以根据需要更改任何评估矩阵(准确性、精确度、召回率、F1、F2、F0.5)。

rng(3) %固定算子
% 优化变量及范围
MaxNumSplit = optimizableVariable('MaxNumSplit',[7,10],'Type','integer');
MinLeaf = optimizableVariable('MinLeaf',[5,15],'Type','integer');
hyperparamtersRF = [MaxNumSplit;MinLeaf];
%目标功能在辅助功能部分(如下)
%用贝叶斯优化器优化变量
results = bayesopt(@(params)f1_objective(params,X,Y),hyperparamtersRF,...
    'AcquisitionFunctionName','expected-improvement-plus','Verbose',1);


六、代码获取


后台**私信回复“42期”**可获取下载链接。

相关文章
|
12天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。
|
18天前
|
机器学习/深度学习 算法 Serverless
基于WOA-SVM的乳腺癌数据分类识别算法matlab仿真,对比BP神经网络和SVM
本项目利用鲸鱼优化算法(WOA)优化支持向量机(SVM)参数,针对乳腺癌早期诊断问题,通过MATLAB 2022a实现。核心代码包括参数初始化、目标函数计算、位置更新等步骤,并附有详细中文注释及操作视频。实验结果显示,WOA-SVM在提高分类精度和泛化能力方面表现出色,为乳腺癌的早期诊断提供了有效的技术支持。
|
6天前
|
存储 算法
基于HMM隐马尔可夫模型的金融数据预测算法matlab仿真
本项目基于HMM模型实现金融数据预测,包括模型训练与预测两部分。在MATLAB2022A上运行,通过计算状态转移和观测概率预测未来值,并绘制了预测值、真实值及预测误差的对比图。HMM模型适用于金融市场的时间序列分析,能够有效捕捉隐藏状态及其转换规律,为金融预测提供有力工具。
|
6天前
|
机器学习/深度学习 算法 信息无障碍
基于GoogleNet深度学习网络的手语识别算法matlab仿真
本项目展示了基于GoogleNet的深度学习手语识别算法,使用Matlab2022a实现。通过卷积神经网络(CNN)识别手语手势,如"How are you"、"I am fine"、"I love you"等。核心在于Inception模块,通过多尺度处理和1x1卷积减少计算量,提高效率。项目附带完整代码及操作视频。
|
14天前
|
算法
基于GA遗传算法的PID控制器参数优化matlab建模与仿真
本项目基于遗传算法(GA)优化PID控制器参数,通过空间状态方程构建控制对象,自定义GA的选择、交叉、变异过程,以提高PID控制性能。与使用通用GA工具箱相比,此方法更灵活、针对性强。MATLAB2022A环境下测试,展示了GA优化前后PID控制效果的显著差异。核心代码实现了遗传算法的迭代优化过程,最终通过适应度函数评估并选择了最优PID参数,显著提升了系统响应速度和稳定性。
|
12天前
|
算法
基于WOA鲸鱼优化的购售电收益与风险评估算法matlab仿真
本研究提出了一种基于鲸鱼优化算法(WOA)的购售电收益与风险评估算法。通过将售电公司购售电收益风险计算公式作为WOA的目标函数,经过迭代优化计算出最优购电策略。实验结果表明,在迭代次数超过10次后,风险价值收益优化值达到1715.1万元的最大值。WOA还确定了中长期市场、现货市场及可再生能源等不同市场的最优购电量,验证了算法的有效性。核心程序使用MATLAB2022a实现,通过多次迭代优化,实现了售电公司收益最大化和风险最小化的目标。
|
15天前
|
算法
通过matlab分别对比PSO,反向学习PSO,多策略改进反向学习PSO三种优化算法
本项目使用MATLAB2022A版本,对比分析了PSO、反向学习PSO及多策略改进反向学习PSO三种优化算法的性能,主要通过优化收敛曲线进行直观展示。核心代码实现了标准PSO算法流程,加入反向学习机制及多种改进策略,以提升算法跳出局部最优的能力,增强全局搜索效率。
|
9天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于深度学习网络的宝石类型识别算法matlab仿真
本项目利用GoogLeNet深度学习网络进行宝石类型识别,实验包括收集多类宝石图像数据集并按7:1:2比例划分。使用Matlab2022a实现算法,提供含中文注释的完整代码及操作视频。GoogLeNet通过其独特的Inception模块,结合数据增强、学习率调整和正则化等优化手段,有效提升了宝石识别的准确性和效率。
|
14天前
|
算法 5G 数据安全/隐私保护
基于MIMO系统的PE-AltMin混合预编码算法matlab性能仿真
本文介绍了基于交替最小化(AltMin)算法的混合预编码技术在MIMO系统中的应用。通过Matlab 2022a仿真,展示了该算法在不同信噪比下的性能表现。核心程序实现了对预编码器和组合器的优化,有效降低了硬件复杂度,同时保持了接近全数字预编码的性能。仿真结果表明,该方法具有良好的鲁棒性和收敛性。
31 8
|
15天前
|
算法
基于大爆炸优化算法的PID控制器参数寻优matlab仿真
本研究基于大爆炸优化算法对PID控制器参数进行寻优,并通过Matlab仿真对比优化前后PID控制效果。使用MATLAB2022a实现核心程序,展示了算法迭代过程及最优PID参数的求解。大爆炸优化算法通过模拟宇宙大爆炸和大收缩过程,在搜索空间中迭代寻找全局最优解,特别适用于PID参数优化,提升控制系统性能。