Matlab利用分位数误差和贝叶斯优化调整随机森林

简介

本示例说明如何使用分位数误差实现贝叶斯优化以调整回归树的随机森林的超参数。 如果计划使用模型来预测条件分位数而不是条件均值,则使用分位数误差而不是均方误差来调整模型是合适的。查找关于树复杂性和要使用贝叶斯优化在每个节点上采样的预测变量数量,实现最小,受罚的袋外分位数误差的模型。 将期望的改进加功能指定为获取功能。

加载和预处理数据

加载carsmall数据集。 假设一个模型,该模型根据加速度、汽缸数、发动机排量、马力、制造商、年和重量来预测汽车的平均燃油经济性。 将Cylinders,Mfg和Model_Year视为类别变量。

例子

clc
clear all
close all

load carsmall
% 将Cylinders、Mfg和Model_Year视为类别变量
Cylinders = categorical(Cylinders);
Mfg = categorical(cellstr(Mfg));
Model_Year = categorical(Model_Year);
X = table(Acceleration,Cylinders,Displacement,Horsepower,Mfg,...
    Model_Year,Weight,MPG);
rng('default'); % For reproducibility

% 调整参数,考虑调整:
% 森林中树木的复杂程度(深度)。 深树倾向于过度拟合,而浅树倾向于欠拟合。 因此,指定每片叶子的最少观察数为20% 生长树木时,在每个节点上采样的预测变量的数量。 指定从1到所有预测变量的采样。
maxMinLS = 20;
minLS = optimizableVariable('minLS',[1,maxMinLS],'Type','integer');
numPTS = optimizableVariable('numPTS',[1,size(X,2)-1],'Type','integer');
hyperparametersRF = [minLS; numPTS];

% bayesopt是实现贝叶斯优化的函数,要求您将这些规范作为optimizableVariable对象传递。
% hyperparametersRF是OptimizableVariable对象的21数组。
% 还应该考虑调整集合中的树数。 bayesopt倾向于选择包含许多树木的随机森林,因为会更准确。 
% 如果考虑到可用的计算资源,并且您希望使用较少的树,则可以考虑与其他参数分开调整树的数量,或者对包含许多学习者的模型进行惩罚。
% 结果是一个BayesianOptimization对象,该对象除其他外包含目标函数的最小值和优化的超参数值。
% 显示观察到的目标函数最小值和优化的超参数值。
results = bayesopt(@(params)oobErrRF(params,X),hyperparametersRF,...
    'AcquisitionFunctionName','expected-improvement-plus','Verbose',0);

bestOOBErr = results.MinObjective
bestHyperparameters = results.XAtMinObjective
% 使用优化的超参数训练模型
% 使用整个数据集和优化的超参数值训练随机森林。
% Mdl是针对中位数预测优化的TreeBagger对象。 
% 您可以通过将Mdl和新数据传递给QuantilePredict,在给定预测器数据的情况下预测平均燃油经济性。
Mdl = TreeBagger(300,X,'MPG','Method','regression',...
    'MinLeafSize',bestHyperparameters.minLS,...
    'NumPredictorstoSample',bestHyperparameters.numPTS);

% 定义目标函数
% 为贝叶斯优化算法定义目标函数以进行优化。 该功能应:
% 接受要调谐的参数作为输入。
% 使用TreeBagger训练一个随机森林。 在TreeBagger调用中,指定要调整的参数,并指定返回袋外索引。
% 根据中位数估算袋外分位数误差。
% 返回袋外分位数误差。
% oobErrRF训练随机森林并估计袋外分位数误差oobErr使用X中的预测变量数据和参数中的参数指定来训练300个回归树的随机森林,
% 然后根据中位数返回袋外分位数误差 。 X是一个表,params是一个OptimizableVariable对象的数组,对应于最小叶子大小和要在每个节点上采样的预测变量数量。
function oobErr = oobErrRF(params,X)
randomForest = TreeBagger(300,X,'MPG','Method','regression',...
    'OOBPrediction','on','MinLeafSize',params.minLS,...
    'NumPredictorstoSample',params.numPTS);
oobErr = oobQuantileError(randomForest);
end

贝叶斯优化是一种基于贝叶斯定理的优化方法,它通过构建高斯过程模型来估计目标函数的未知部分,并选择最有可能提高目标函数的参数进行优化。在优化随机森林模型时,可以使用贝叶斯优化来选择最佳的超参数,例如树的数量、最大深度和最小叶节点数等。以下是一个利用贝叶斯优化优化随机森林模型的示例代码: ```python from skopt import gp_minimize from skopt.space import Real, Integer from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import load_breast_cancer from sklearn.model_selection import cross_val_score # 加载数据集 data = load_breast_cancer() X, y = data.data, data.target # 定义目标函数,即交叉验证得分 def objective(params): n_estimators = params[0] max_depth = params[1] min_samples_leaf = params[2] clf = RandomForestClassifier(n_estimators=n_estimators, max_depth=max_depth, min_samples_leaf=min_samples_leaf) return -np.mean(cross_val_score(clf, X, y, cv=5, n_jobs=-1, scoring="accuracy")) # 定义超参数空间 space = [Integer(10, 100, name='n_estimators'), Integer(2, 20, name='max_depth'), Integer(1, 10, name='min_samples_leaf')] # 运行贝叶斯优化 res_gp = gp_minimize(objective, space, n_calls=50, random_state=0) # 输出最佳超参数 print("Best score: {:.4f}".format(-res_gp.fun)) print("Best parameters: n_estimators={}, max_depth={}, min_samples_leaf={}".format(res_gp.x[0], res_gp.x[1], res_gp.x[2])) ``` 在上面的示例代码中,我们使用了scikit-learn中的RandomForestClassifier作为模型,并使用交叉验证得分作为目标函数。我们定义了三个超参数:树的数量、最大深度和最小叶节点数,并通过贝叶斯优化选择最佳超参数。最后,我们输出了最佳超参数和对应的交叉验证得分。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值