交叉验证和超参数调整:如何优化你的机器学习模型(下)

简介: 交叉验证和超参数调整:如何优化你的机器学习模型

随机网格搜索交叉验证

优化机器学习超参数最流行的方法之一是scikiti-learn中的RandomizedSearchCV()。让我们仔细分析一下是什么意思。

在随机网格搜索交叉验证中,我们首先创建一个超参数网格,我们想通过尝试优化这些超参数的值,让我们看一个随机森林回归器的超参数网格示例,并看看是如何设置它的:

#NumberoftreesinRandomForestrf_n_estimators= [int(x) forxinnp.linspace(200, 1000, 5)]
rf_n_estimators.append(1500)
rf_n_estimators.append(2000)
#Maximumnumberoflevelsintreerf_max_depth= [int(x) forxinnp.linspace(5, 55, 11)]
#Addthedefaultasapossiblevaluerf_max_depth.append(None)
#Numberoffeaturestoconsiderateverysplitrf_max_features= ['auto', 'sqrt', 'log2']
#Criteriontosplitonrf_criterion= ['mse', 'mae']
#Minimumnumberofsamplesrequiredtosplitanoderf_min_samples_split= [int(x) forxinnp.linspace(2, 10, 9)]
#Minimumdecreaseinimpurityrequiredforsplittohappenrf_min_impurity_decrease= [0.0, 0.05, 0.1]
#Methodofselectingsamplesfortrainingeachtreerf_bootstrap= [True, False]
#Createthegridrf_grid= {'n_estimators': rf_n_estimators,
'max_depth': rf_max_depth,
'max_features': rf_max_features,
'criterion': rf_criterion,
'min_samples_split': rf_min_samples_split,
'min_impurity_decrease': rf_min_impurity_decrease,
'bootstrap': rf_bootstrap}


首先,我们为要优化的每个超参数创建一个可能的取值列表,然后使用上面所示的带有键值对的字典来设置网格。为了找到和理解机器学习模型的超参数,你可以查阅模型的官方文档。

生成的网格如下所示:

640.png

顾名思义,随机网格搜索交叉验证使用交叉验证来评估模型性能。随机搜索意味着算法不是尝试所有可能的超参数组合(在我们的例子中是27216个组合),而是随机从网格中为每个超参数选择一个值,并使用这些超参数的随机组合来评估模型。

用计算机将所有可能的组合都尝试一遍是非常昂贵的,而且需要很长时间。随机选择超参数可以显著地加快这个过程,并且通常为尝试所有可能的组合提供了一个类似的好的解决方案。让我们看看随机网格搜索交叉验证是如何使用的。

随机森林的超参数整定

使用先前创建的网格,我们可以为我们的随机森林回归器找到最佳的超参数。因为数据集相对较小,我将使用3的CV并运行200个随机组合。因此,随机网格搜索CV总共将要训练和评估600个模型(200个组合的3倍)。由于与其他机器学习模型(如xgboost)相比,随机森林的计算速度较慢,运行这些模型需要几分钟时间。一旦这个过程完成,我们就可以得到最佳的超参数。

以下展示了如何使用RandomizedSearchCV():

#Createthemodeltobetunedrf_base=RandomForestRegressor()
#CreatetherandomsearchRandomForestrf_random=RandomizedSearchCV(estimator=rf_base, param_distributions=rf_grid,
n_iter=200, cv=3, verbose=2, random_state=42,
n_jobs=-1)
#Fittherandomsearchmodelrf_random.fit(X_train_temp, y_train_temp)
#Viewthebestparametersfromtherandomsearchrf_random.best_params_

640.png

我们将在最终模型中使用这些超参数,并在测试集上对模型进行测试。

xgboost的超参数整定

对于我们的xgboost回归,过程基本上与随机森林相同。由于模型的性质,我们试图优化的超参数有一些是相同的,有一些是不同的。您可以在这里找到xgb回归器超参数的完整列表和解释。我们再次创建网格:

#Numberoftreestobeusedxgb_n_estimators= [int(x) forxinnp.linspace(200, 2000, 10)]
#Maximumnumberoflevelsintreexgb_max_depth= [int(x) forxinnp.linspace(2, 20, 10)]
#Minimumnumberofinstacesneededineachnodexgb_min_child_weight= [int(x) forxinnp.linspace(1, 10, 10)]
#TreeconstructionalgorithmusedinXGBoostxgb_tree_method= ['auto', 'exact', 'approx', 'hist', 'gpu_hist']
#Learningratexgb_eta= [xforxinnp.linspace(0.1, 0.6, 6)]
#Minimumlossreductionrequiredtomakefurtherpartitionxgb_gamma= [int(x) forxinnp.linspace(0, 0.5, 6)]
#Learningobjectiveusedxgb_objective= ['reg:squarederror', 'reg:squaredlogerror']
#Createthegridxgb_grid= {'n_estimators': xgb_n_estimators,
'max_depth': xgb_max_depth,
'min_child_weight': xgb_min_child_weight,
'tree_method': xgb_tree_method,
'eta': xgb_eta,
'gamma': xgb_gamma,
'objective': xgb_objective}


生成的网格如下所示:

640.png

为了使性能评估具有可比性,我还将使用具有200个组合的3CV来进行xgboost:

#Createthemodeltobetunedxgb_base=XGBRegressor()
#CreatetherandomsearchRandomForestxgb_random=RandomizedSearchCV(estimator=xgb_base, param_distributions=xgb_grid,
n_iter=200, cv=3, verbose=2,
random_state=420, n_jobs=-1)
#Fittherandomsearchmodelxgb_random.fit(X_train_temp, y_train_temp)
#Gettheoptimalparametersxgb_random.best_params_

最优超参数如下:

640.png

同样的,这些将在最终的模型中使用。

虽然对有些人来说这可能是显而易见的,但我只是想在这里提一下:我们为什么不为多元线性回归做超参数优化是因为模型中没有超参数需要调整,它只是一个多元线性回归。

现在我们已经获得了最佳的超参数(至少在交叉验证方面),我们终于可以在测试数据上评估我们的模型了,我们就可以根据我们从一开始就持有的测试数据来评估我们的模型了!

最终模型的评估

在评估了我们的机器学习模型的性能并找到了最佳超参数之后,是时候对模型进行最后的测试了。

我们对模型进行了训练,这些数据是我们用于进行评估的数据的80%,即除了测试集之外的所有数据。我们使用上一部分中找到的超参数,然后比较模型在测试集上的表现。

让我们创建和训练我们的模型:

#CreatethefinalMultipleLinearRegressionmlr_final=LinearRegression()
#CreatethefinalRandomForestrf_final=RandomForestRegressor(n_estimators=200,
min_samples_split=6,
min_impurity_decrease=0.0,
max_features='sqrt',
max_depth=25,
criterion='mae',
bootstrap=True,
random_state=42)
#CreatethefnalExtremeGradientBoosterxgb_final=XGBRegressor(tree_method='exact',
objective='reg:squarederror',
n_estimators=1600,
min_child_weight=6,
max_depth=8,
gamma=0,
eta=0.1,
random_state=42)
#Trainthemodelsusing80%oftheoriginaldatamlr_final.fit(X_train_temp, y_train_temp)
rf_final.fit(X_train_temp, y_train_temp)
xgb_final.fit(X_train_temp, y_train_temp)

我定义了一个函数,该函数对所有最终模型进行评分,并创建了一个更容易比较的数据帧:

#Defineafunctionthatcomparesallfinalmodelsdeffinal_comparison(models, test_features, test_labels):
scores=pd.DataFrame()
formodelinmodels:
predictions=model.predict(test_features)
mae=round(mean_absolute_error(test_labels, predictions), 4)
mse=round(mean_squared_error(test_labels, predictions), 4)
r2=round(r2_score(test_labels, predictions), 4)
errors=abs(predictions-test_labels)
mape=100*np.mean(errors/test_labels)
accuracy=round(100-mape, 4)
scores[str(model)] = [mae, mse, r2, accuracy]
scores.index= ['Mean Absolute Error', 'Mean Squared Error', 'R^2', 'Accuracy']
returnscores


使用我们的三个最终模型调用该函数并调整列标题将会得到以下最终计算结果:

#Callthecomparisonfunctionwiththethreefinalmodelsfinal_scores=final_comparison([mlr_final, rf_final, xgb_final], X_test, y_test)
#Adjustthecolumnheadersfinal_scores.columns= ['Linear Regression', 'Random Forest', 'Extreme Gradient Boosting']

640.png


获胜者是:随机森林回归!

随机森林的R-squared达到80%,测试集的准确率为97.6%,这意味着它的预测平均只有2.4%的偏差。这是个不错的结果!

在此分析中,多元线性回归的表现并不逊色,但xgboost并没有达到其所宣传的效果。


总结评论

整个分析过程和实际操作过程都很有趣。我一直在研究Fitbit是如何计算睡眠分数的,现在我很高兴能更好地理解它。最重要的是,我建立了一个机器学习模型,可以非常准确地预测睡眠分数。话虽如此,我还是想强调几件事:


  1. 正如我在第2部分中提到的,对多元线性回归系数的解释可能不准确,因为特征之间存在高度的多重共线性。
  2. 我用于分析的数据集相当小,因为它依赖于从Fitbit获得的286个数据点。这限制了结果的可推广性,需要更大的数据集才能训练出更健壮的模型。
  3. 该分析仅使用了Fitbit的一个人的睡眠数据,因此可能不能很好地推广到其他睡眠模式、心率等不同的人。

我希望你喜欢这篇关于如何使用机器学习来预测Fitbit睡眠分数的全面分析,并且了解了不同睡眠阶段的重要性以及睡眠过程中所花费的时间。

目录
相关文章
|
11月前
|
人工智能 自然语言处理 IDE
模型微调不再被代码难住!PAI和Qwen3-Coder加速AI开发新体验
通义千问 AI 编程大模型 Qwen3-Coder 正式开源,阿里云人工智能平台 PAI 支持云上一键部署 Qwen3-Coder 模型,并可在交互式建模环境中使用 Qwen3-Coder 模型。
1525 109
|
人工智能 自然语言处理 运维
【新模型速递】PAI-Model Gallery云上一键部署Kimi K2模型
月之暗面发布开源模型Kimi K2,采用MoE架构,参数达1T,激活参数32B,具备强代码能力及Agent任务处理优势。在编程、工具调用、数学推理测试中表现优异。阿里云PAI-Model Gallery已支持云端部署,提供企业级方案。
682 0
【新模型速递】PAI-Model Gallery云上一键部署Kimi K2模型
|
人工智能 JSON 算法
【解决方案】DistilQwen2.5-DS3-0324蒸馏小模型在PAI-ModelGallery的训练、评测、压缩及部署实践
DistilQwen 系列是阿里云人工智能平台 PAI 推出的蒸馏语言模型系列,包括 DistilQwen2、DistilQwen2.5、DistilQwen2.5-R1 等。本文详细介绍DistilQwen2.5-DS3-0324蒸馏小模型在PAI-ModelGallery的训练、评测、压缩及部署实践。
|
人工智能 运维 API
PAI-Model Gallery云上一键部署阶跃星辰新模型Step1X-Edit
4月27日,阶跃星辰正式发布并开源图像编辑大模型 Step1X-Edit,性能达到开源 SOTA。Step1X-Edit模型总参数量为19B,实现 MLLM 与 DiT 的深度融合,在编辑精度与图像保真度上实现大幅提升,具备语义精准解析、身份一致性保持、高精度区域级控制三项关键能力;支持文字替换、风格迁移等11 类高频图像编辑任务类型。在最新发布的图像编辑基准 GEdit-Bench 中,Step1X-Edit 在语义一致性、图像质量与综合得分三项指标上全面领先现有开源模型,比肩 GPT-4o 与 Gemin。PAI-ModelGallery 支持Step1X-Edit一键部署方案。
|
机器学习/深度学习 算法 安全
差分隐私机器学习:通过添加噪声让模型更安全,也更智能
本文探讨在敏感数据上应用差分隐私(DP)进行机器学习的挑战与实践。通过模拟DP-SGD算法,在模型训练中注入噪声以保护个人隐私。实验表明,该方法在保持71%准确率和0.79 AUC的同时,具备良好泛化能力,但也带来少数类预测精度下降的问题。研究强调差分隐私应作为模型设计的核心考量,而非事后补救,并提出在参数调优、扰动策略选择和隐私预算管理等方面的优化路径。
808 3
差分隐私机器学习:通过添加噪声让模型更安全,也更智能
|
人工智能 自然语言处理 运维
【新模型速递】PAI-Model Gallery云上一键部署gpt-oss系列模型
阿里云 PAI-Model Gallery 已同步接入 gpt-oss 系列模型,提供企业级部署方案。
|
机器学习/深度学习 人工智能 算法
Post-Training on PAI (4):模型微调SFT、DPO、GRPO
阿里云人工智能平台 PAI 提供了完整的模型微调产品能力,支持 监督微调(SFT)、偏好对齐(DPO)、强化学习微调(GRPO) 等业界常用模型微调训练方式。根据客户需求及代码能力层级,分别提供了 PAI-Model Gallery 一键微调、PAI-DSW Notebook 编程微调、PAI-DLC 容器化任务微调的全套产品功能。
|
存储 人工智能 运维
企业级MLOps落地:基于PAI-Studio构建自动化模型迭代流水线
本文深入解析MLOps落地的核心挑战与解决方案,涵盖技术断层分析、PAI-Studio平台选型、自动化流水线设计及实战构建,全面提升模型迭代效率与稳定性。
674 6
|
存储 机器学习/深度学习 自然语言处理
避坑指南:PAI-DLC分布式训练BERT模型的3大性能优化策略
本文基于电商搜索场景下的BERT-Large模型训练优化实践,针对数据供给、通信效率与计算资源利用率三大瓶颈,提出异步IO流水线、梯度压缩+拓扑感知、算子融合+混合精度等策略。实测在128卡V100集群上训练速度提升3.2倍,GPU利用率提升至89.3%,训练成本降低70%。适用于大规模分布式深度学习任务的性能调优。
665 3

热门文章

最新文章

相关产品

  • 人工智能平台 PAI