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

本文涉及的产品
模型训练 PAI-DLC,5000CU*H 3个月
交互式建模 PAI-DSW,5000CU*H 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
简介: 交叉验证和超参数调整:如何优化你的机器学习模型

随机网格搜索交叉验证

优化机器学习超参数最流行的方法之一是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睡眠分数的全面分析,并且了解了不同睡眠阶段的重要性以及睡眠过程中所花费的时间。

目录
相关文章
|
1天前
|
机器学习/深度学习 算法 数据可视化
机器学习模型中特征贡献度分析:预测贡献与错误贡献
本文将探讨特征重要性与特征有效性之间的关系,并引入两个关键概念:预测贡献度和错误贡献度。
16 3
|
10天前
|
机器学习/深度学习 Python
验证集的划分方法:确保机器学习模型泛化能力的关键
本文详细介绍了机器学习中验证集的作用及其划分方法。验证集主要用于评估模型性能和调整超参数,不同于仅用于最终评估的测试集。文中描述了几种常见的划分方法,包括简单划分、交叉验证、时间序列数据划分及分层抽样划分,并提供了Python示例代码。此外,还强调了在划分数据集时应注意随机性、数据分布和多次实验的重要性。合理划分验证集有助于更准确地评估模型性能并进行有效调优。
|
10天前
|
机器学习/深度学习 人工智能 自然语言处理
机器学习模型之深度神经网络的特点
深度神经网络(Deep Neural Networks, DNNs)是一类机器学习模型,通过多个层级(层)的神经元来模拟人脑的工作方式,从而实现复杂的数据处理和模式识别任务。
14 1
|
18天前
|
机器学习/深度学习 算法 前端开发
R语言基础机器学习模型:深入探索决策树与随机森林
【9月更文挑战第2天】决策树和随机森林作为R语言中基础且强大的机器学习模型,各有其独特的优势和适用范围。了解并熟练掌握这两种模型,对于数据科学家和机器学习爱好者来说,无疑是一个重要的里程碑。希望本文能够帮助您更好地理解这两种模型,并在实际项目中灵活应用。
|
17天前
|
机器学习/深度学习 数据采集 存储
一文读懂蒙特卡洛算法:从概率模拟到机器学习模型优化的全方位解析
蒙特卡洛方法起源于1945年科学家斯坦尼斯劳·乌拉姆对纸牌游戏中概率问题的思考,与约翰·冯·诺依曼共同奠定了该方法的理论基础。该方法通过模拟大量随机场景来近似复杂问题的解,因命名灵感源自蒙特卡洛赌场。如今,蒙特卡洛方法广泛应用于机器学习领域,尤其在超参数调优、贝叶斯滤波等方面表现出色。通过随机采样超参数空间,蒙特卡洛方法能够高效地找到优质组合,适用于处理高维度、非线性问题。本文通过实例展示了蒙特卡洛方法在估算圆周率π和优化机器学习模型中的应用,并对比了其与网格搜索方法的性能。
116 1
|
20天前
|
机器学习/深度学习 存储 前端开发
实战揭秘:如何借助TensorFlow.js的强大力量,轻松将高效能的机器学习模型无缝集成到Web浏览器中,从而打造智能化的前端应用并优化用户体验
【8月更文挑战第31天】将机器学习模型集成到Web应用中,可让用户在浏览器内体验智能化功能。TensorFlow.js作为在客户端浏览器中运行的库,提供了强大支持。本文通过问答形式详细介绍如何使用TensorFlow.js将机器学习模型带入Web浏览器,并通过具体示例代码展示最佳实践。首先,需在HTML文件中引入TensorFlow.js库;接着,可通过加载预训练模型如MobileNet实现图像分类;然后,编写代码处理图像识别并显示结果;此外,还介绍了如何训练自定义模型及优化模型性能的方法,包括模型量化、剪枝和压缩等。
27 1
|
1天前
|
机器学习/深度学习 数据采集 算法
机器学习新纪元:用Scikit-learn驾驭Python,精准模型选择全攻略!
在数据爆炸时代,机器学习成为挖掘数据价值的关键技术,而Scikit-learn作为Python中最受欢迎的机器学习库之一,凭借其丰富的算法集、简洁的API和高效性能,引领着机器学习的新纪元。本文通过一个实际案例——识别垃圾邮件,展示了如何使用Scikit-learn进行精准模型选择。从数据预处理、模型训练到交叉验证和性能比较,最后选择最优模型进行部署,详细介绍了每一步的操作方法。通过这个过程,我们不仅可以看到如何利用Scikit-learn的强大功能,还能了解到模型选择与优化的重要性。希望本文能为你的机器学习之旅提供有价值的参考。
7 0
|
20天前
|
缓存 开发者 测试技术
跨平台应用开发必备秘籍:运用 Uno Platform 打造高性能与优雅设计兼备的多平台应用,全面解析从代码共享到最佳实践的每一个细节
【8月更文挑战第31天】Uno Platform 是一种强大的工具,允许开发者使用 C# 和 XAML 构建跨平台应用。本文探讨了 Uno Platform 中实现跨平台应用的最佳实践,包括代码共享、平台特定功能、性能优化及测试等方面。通过共享代码、采用 MVVM 模式、使用条件编译指令以及优化性能,开发者可以高效构建高质量应用。Uno Platform 支持多种测试方法,确保应用在各平台上的稳定性和可靠性。这使得 Uno Platform 成为个人项目和企业应用的理想选择。
25 0
|
20天前
|
API UED 开发者
如何在Uno Platform中轻松实现流畅动画效果——从基础到优化,全方位打造用户友好的动态交互体验!
【8月更文挑战第31天】在开发跨平台应用时,确保用户界面流畅且具吸引力至关重要。Uno Platform 作为多端统一的开发框架,不仅支持跨系统应用开发,还能通过优化实现流畅动画,增强用户体验。本文探讨了Uno Platform中实现流畅动画的多个方面,包括动画基础、性能优化、实践技巧及问题排查,帮助开发者掌握具体优化策略,提升应用质量与用户满意度。通过合理利用故事板、减少布局复杂性、使用硬件加速等技术,结合异步方法与预设缓存技巧,开发者能够创建美观且流畅的动画效果。
43 0
|
20天前
|
开发者 算法 虚拟化
惊爆!Uno Platform 调试与性能分析终极攻略,从工具运用到代码优化,带你攻克开发难题成就完美应用
【8月更文挑战第31天】在 Uno Platform 中,调试可通过 Visual Studio 设置断点和逐步执行代码实现,同时浏览器开发者工具有助于 Web 版本调试。性能分析则利用 Visual Studio 的性能分析器检查 CPU 和内存使用情况,还可通过记录时间戳进行简单分析。优化性能涉及代码逻辑优化、资源管理和用户界面简化,综合利用平台提供的工具和技术,确保应用高效稳定运行。
31 0

相关产品

  • 人工智能平台 PAI