【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期”**可获取下载链接。

相关文章
|
2月前
|
机器学习/深度学习 存储 算法
决策树和随机森林在机器学习中的应用
在机器学习领域,决策树(Decision Tree)和随机森林(Random Forest)是两种非常流行且强大的分类和回归算法。它们通过模拟人类决策过程,将复杂的数据集分割成易于理解和处理的子集,从而实现对新数据的准确预测。
99 10
|
1月前
|
机器学习/深度学习 计算机视觉 Python
模型预测笔记(三):通过交叉验证网格搜索机器学习的最优参数
本文介绍了网格搜索(Grid Search)在机器学习中用于优化模型超参数的方法,包括定义超参数范围、创建参数网格、选择评估指标、构建模型和交叉验证策略、执行网格搜索、选择最佳超参数组合,并使用这些参数重新训练模型。文中还讨论了GridSearchCV的参数和不同机器学习问题适用的评分指标。最后提供了使用决策树分类器进行网格搜索的Python代码示例。
57 1
|
1月前
|
机器学习/深度学习 算法 Python
探索机器学习中的决策树算法:从理论到实践
【10月更文挑战第5天】本文旨在通过浅显易懂的语言,带领读者了解并实现一个基础的决策树模型。我们将从决策树的基本概念出发,逐步深入其构建过程,包括特征选择、树的生成与剪枝等关键技术点,并以一个简单的例子演示如何用Python代码实现一个决策树分类器。文章不仅注重理论阐述,更侧重于实际操作,以期帮助初学者快速入门并在真实数据上应用这一算法。
|
14天前
|
机器学习/深度学习 人工智能 算法
探索机器学习中的决策树算法
【10月更文挑战第29天】本文将深入浅出地介绍决策树算法,一种在机器学习中广泛使用的分类和回归方法。我们将从基础概念出发,逐步深入到算法的实际应用,最后通过一个代码示例来直观展示如何利用决策树解决实际问题。无论你是机器学习的初学者还是希望深化理解的开发者,这篇文章都将为你提供有价值的见解和指导。
|
1月前
|
算法 决策智能
基于禁忌搜索算法的VRP问题求解matlab仿真,带GUI界面,可设置参数
该程序基于禁忌搜索算法求解车辆路径问题(VRP),使用MATLAB2022a版本实现,并带有GUI界面。用户可通过界面设置参数并查看结果。禁忌搜索算法通过迭代改进当前解,并利用记忆机制避免陷入局部最优。程序包含初始化、定义邻域结构、设置禁忌列表等步骤,最终输出最优路径和相关数据图表。
|
2月前
|
机器学习/深度学习 数据采集 监控
探索机器学习:从数据到决策
【9月更文挑战第18天】在这篇文章中,我们将一起踏上一段激动人心的旅程,穿越机器学习的世界。我们将探讨如何通过收集和处理数据,利用算法的力量来预测未来的趋势,并做出更加明智的决策。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和思考方式。
|
2月前
|
机器学习/深度学习 算法 数据挖掘
决策树算法大揭秘:Python让你秒懂分支逻辑,精准分类不再难
【9月更文挑战第12天】决策树算法作为机器学习领域的一颗明珠,凭借其直观易懂和强大的解释能力,在分类与回归任务中表现出色。相比传统统计方法,决策树通过简单的分支逻辑实现了数据的精准分类。本文将借助Python和scikit-learn库,以鸢尾花数据集为例,展示如何使用决策树进行分类,并探讨其优势与局限。通过构建一系列条件判断,决策树不仅模拟了人类决策过程,还确保了结果的可追溯性和可解释性。无论您是新手还是专家,都能轻松上手,享受机器学习的乐趣。
47 9
|
1月前
|
机器学习/深度学习 人工智能 算法
【机器学习】决策树算法
【机器学习】决策树算法
|
2月前
|
机器学习/深度学习 算法 Python
从菜鸟到大师:一棵决策树如何引领你的Python机器学习之旅
【9月更文挑战第9天】在数据科学领域,机器学习如同璀璨明珠,吸引无数探索者。尤其对于新手而言,纷繁复杂的算法常让人感到迷茫。本文将以决策树为切入点,带您从Python机器学习的新手逐步成长为高手。决策树以其直观易懂的特点成为入门利器。通过构建决策树分类器并应用到鸢尾花数据集上,我们展示了其基本用法及效果。掌握决策树后,还需深入理解其工作原理,调整参数,并探索集成学习方法,最终将所学应用于实际问题解决中,不断提升技能。愿这棵智慧之树助您成为独当一面的大师。
44 3
|
2月前
|
机器学习/深度学习 算法 Python
决策树下的智慧果实:Python机器学习实战,轻松摘取数据洞察的果实
【9月更文挑战第7天】当我们身处数据海洋,如何提炼出有价值的洞察?决策树作为一种直观且强大的机器学习算法,宛如智慧之树,引领我们在繁复的数据中找到答案。通过Python的scikit-learn库,我们可以轻松实现决策树模型,对数据进行分类或回归分析。本教程将带领大家从零开始,通过实际案例掌握决策树的原理与应用,探索数据中的秘密。
47 1