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

本文涉及的产品
交互式建模 PAI-DSW,5000CU*H 3个月
简介: 交叉验证和超参数调整:如何优化你的机器学习模型

准确预测Fitbit的睡眠得分

在本文的前两部分中,我获取了Fitbit的睡眠数据并对其进行预处理,将这些数据分为训练集、验证集和测试集,除此之外,我还训练了三种不同的机器学习模型并比较了它们的性能。

在第2部分中,我们看到使用随机森林和xgboost默认超参数,并在验证集上评估模型性能会导致多元线性回归表现最佳,而随机森林和xgboost回归的表现稍差一些。

在本文的这一部分中,我将讨论只使用一个验证集的缺点。除此之外,我们还会谈到如何解决这些缺点以及如何调优模型超参数以提高性能。就让我们一探究竟吧。

交叉验证

简单训练、验证和测试分割的缺点

在本文的第2部分中,我们将数据分为训练、验证和测试集,在训练集上训练我们的模型并在验证集上对模型进行评估。我们还没有接触到测试集,因为它是保留集,它代表的是从未见过的数据,一旦我们觉得机器学习模型有能力进行最终测试,这些数据将用于评估它们的泛化程度。

因为我们只将数据分成了一组训练数据和一组验证数据,所以模型的性能指标高度依赖于这两组数据。机器学习模型只进行一次训练和评估,因此它的性能就取决于那一次评估。而且在对同一数据的不同子集进行训练和评估时,学习模型的表现可能会非常不同,这仅仅是因为选取的子集不同。

如果我们把这个过程分解为多次训练和验证测试,每次训练和评估我们的模型都是在不同的数据子集上,最后在多次评估中观察模型的平均表现会怎么样呢?这就是K-fold交叉验证背后的想法。

K-fold交叉验证

在K-fold交叉验证(CV)中,我们仍然要先从需要被处理的数据集中分离出一个测试/保留集,以用于模型的最终评估。剩下的数据,即除测试集之外的所有数据,将被分割成K个折叠数(子集)。然后交叉验证迭代这些折叠,在每次迭代中使用一个K折叠作为验证集,同时使用所有剩余的折叠作为训练集。重复这个过程,直到每个折叠都被用作验证集。以下是5折交叉验证的流程:

640.png

将模型在同一个训练数据的不同子集进行K次训练和测试,我们可以更准确地表示我们的模型在它以前没有见过的数据上的表现。在K-fold CV中,我们在每次迭代后对模型进行评分,并计算所有评分的平均值。这样就可以更好地表示该方法与只使用一个训练和验证集相比,模型的表现是怎样的。

Python中的K-fold交叉验证

因为Fitbit睡眠数据集相对较小,所以我将使用4折交叉验证,并将目前使用的多元线性回归、随机森林和xgboost回归这三种模型进行比较。

请注意,4CV可以很好地与第2部分中分离出来的训练数据和验证数据进行比较,因为我们将数据分割为75%的训练数据和25%的验证数据。一个4CV本质上也是如此,只是四次,每次使用不同的子集。我创建了一个函数,它将我们想要比较的模型列表,特征数据,目标变量数据以及我们想要创建的折叠数作为输入。该函数计算我们之前使用的性能度量并返回一个表格,其中包含所有模型的平均值以及每种度量类型的每一页的得分,以备我们进一步研究。函数如下:

#DefineafunctionthatcomparestheCVperfromanceofasetofpredetrminedmodelsdefcv_comparison(models, X, y, cv):
#InitiateaDataFramefortheaveragesandalistforallmeasurescv_accuracies=pd.DataFrame()
maes= []
mses= []
r2s= []
accs= []
#Loopthroughthemodels, runaCV, addtheaveragescorestotheDataFrameandthescoresof#allCVstothelistformodelinmodels:
mae=-np.round(cross_val_score(model, X, y, scoring='neg_mean_absolute_error', cv=cv), 4)
maes.append(mae)
mae_avg=round(mae.mean(), 4)
mse=-np.round(cross_val_score(model, X, y, scoring='neg_mean_squared_error', cv=cv), 4)
mses.append(mse)
mse_avg=round(mse.mean(), 4)
r2=np.round(cross_val_score(model, X, y, scoring='r2', cv=cv), 4)
r2s.append(r2)
r2_avg=round(r2.mean(), 4)
acc=np.round((100- (100* (mae*len(X))) /sum(y)), 4)
accs.append(acc)
acc_avg=round(acc.mean(), 4)
cv_accuracies[str(model)] = [mae_avg, mse_avg, r2_avg, acc_avg]
cv_accuracies.index= ['Mean Absolute Error', 'Mean Squared Error', 'R^2', 'Accuracy']
returncv_accuracies, maes, mses, r2s, accs


现在我们可以创建一个将要使用的模型列表,并通过4次交叉验证调用上面的函数:

#Createthemodelstobetestedmlr_reg=LinearRegression()
rf_reg=RandomForestRegressor(random_state=42)
xgb_reg=xgb_regressor=XGBRegressor(random_state=42)
#PutthemodelsinalisttobeusedforCross-Validationmodels= [mlr_reg, rf_reg, xgb_reg]
#RuntheCross-Validationcomparisonwiththemodelsusedinthisanalysiscomp, maes, mses, r2s, accs=cv_comparison(models, X_train_temp,     y_train_temp, 4)


得到的结果对比表如下所示:

640.png

使用4CV,随机森林回归模型在所有性能指标上都优于其他两个模型。但是在第2部分中,我们看到多元线性回归具有最好的性能指标,为什么会发生变化呢?

为了理解为什么交叉验证得到的分数与第2部分中简单的训练和验证不同,我们需要仔细看看模型在每个折叠上是如何执行的。上面的cv_compare()函数返回每个折叠中每个不同模型的所有分数的列表。让我们看看三种模型在每次折叠时的r平方是如何比较的。为了得到表格格式的结果,让我们也快速将其转换为数据帧:

#CreateDataFrameforallR^2sr2_comp=pd.DataFrame(r2s, index=comp.columns, columns=['1st Fold', '2nd Fold', '3rd Fold',
'4th Fold'])
#Addacolumnfortheaveragesr2_comp['Average'] =np.round(r2_comp.mean(axis=1),4)

640.png

上表说明了4CV与训练集和验证集得分不同的原因。R-squared在不同的折叠中差异很大,特别是在xgboost和多元线性回归中。这也说明了为什么使用交叉验证如此重要,特别是对于小数据集,如果你只依赖于一个简单的训练集和验证集,你的结果可能会有很大的不同,这个结果就取决于你最终得到的数据分割是什么样子的。

现在我们知道了交叉验证是什么以及它为什么重要,让我们看看是否可以通过调优超参数从我们的模型中获得更多。

超参数调优

模型参数是在模型训练时学习的,不能任意设置。与模型参数不同,超参数是用户在训练机器学习模型前可以设置的参数。随机森林中超参数的例子有:森林中拥有的决策树的数量、每次分割时需要考虑的最大特征数量,或者树的最大深度。

正如我前面提到的,没有一种万能的方法可以找到最优超参数。一组超参数可能在一个机器学习问题上表现良好,但在另一个机器学习问题上可能表现不佳。那么我们怎么得到最优超参数呢?

一种可能的方法是使用有根据的猜测作为起点,手动调整优超参数,更改一些超参数,然后训练模型并评估该模型的性能。一直重复这些步骤,直到我们对性能满意为止。这听起来像是一个不必要的乏味的方法,但的确如此。

比较超参数调整和吉他调弦。你可以选择用你的耳朵来给吉他调音,这种方式需要大量的练习和耐心,而且你可能永远不会得到一个最佳的结果,特别是如果你是一个初学者。但幸运的是,有电子吉他调音器可以帮助你找到正确的音调,它可以解释你吉他弦的声波并显示它所读取的内容。虽然你仍然需要使用机器头来调音琴弦,但过程会快得多,电动调音器会确保你的调音接近最佳状态。那么机器学习和电吉他调音师有什么相同的地方呢?

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
20天前
|
机器学习/深度学习 数据采集 人工智能
构建高效机器学习模型的五大技巧
【4月更文挑战第7天】 在数据科学迅猛发展的今天,机器学习已成为解决复杂问题的重要工具。然而,构建一个既精确又高效的机器学习模型并非易事。本文将分享五种提升机器学习模型性能的有效技巧,包括数据预处理、特征工程、模型选择、超参数调优以及交叉验证。这些方法不仅能帮助初学者快速提高模型准确度,也为经验丰富的数据科学家提供了进一步提升模型性能的思路。
|
19天前
|
机器学习/深度学习 自然语言处理 搜索推荐
【机器学习】揭秘!机器学习如何助力我们高效优化文本?
【机器学习】揭秘!机器学习如何助力我们高效优化文本?
28 0
|
4天前
|
机器学习/深度学习 数据采集 人工智能
构建高效机器学习模型的最佳实践
【4月更文挑战第23天】在数据驱动的时代,机器学习已成为创新的核心动力。本文深入探讨了构建高效机器学习模型的关键步骤,包括数据预处理、特征工程、模型选择、训练技巧以及性能评估。通过实例分析与经验总结,旨在为从业者提供一套实用的技术指南,帮助他们在复杂数据环境中提升模型的准确性和泛化能力。
|
1天前
|
机器学习/深度学习 数据可视化 计算机视觉
【视频】机器学习交叉验证CV原理及R语言主成分PCA回归分析犯罪率|数据共享
【视频】机器学习交叉验证CV原理及R语言主成分PCA回归分析犯罪率|数据共享
|
1天前
|
机器学习/深度学习 存储 数据采集
利用机器学习优化数据中心冷却系统
【4月更文挑战第26天】 在数据中心管理和运营中,冷却系统的能效是关键成本因素之一。随着能源价格的上涨和对环境可持续性的关注增加,开发智能、高效的冷却策略显得尤为重要。本文将探讨如何应用机器学习(ML)技术来优化数据中心的冷却系统。通过收集和分析温度、湿度、服务器负载等多维数据,我们构建了预测模型来动态调整冷却需求,实现节能并保持最佳的操作条件。实验结果表明,使用ML优化后的冷却系统能够在不牺牲性能的前提下显著降低能耗。
|
2天前
|
机器学习/深度学习 数据采集 监控
构建高效机器学习模型的最佳实践
【4月更文挑战第25天】 在数据驱动的时代,机器学习已成为创新和效率提升的关键工具。本文将探讨一系列实用的策略和技术,旨在帮助读者构建出更高效、更精确的机器学习模型。我们将从数据处理开始,讨论特征选择的重要性以及如何避免过拟合,接着深入到模型选择与优化,最后讨论模型部署和维护的实践要点。通过遵循这些最佳实践,读者能够提升其机器学习项目的成功率并实现更好的业务成果。
|
2天前
|
机器学习/深度学习 存储 监控
利用机器学习优化数据中心冷却效率
【4月更文挑战第25天】在数据中心的运营成本中,冷却系统占据了一大块。随着能源价格的不断攀升以及环保意识的增强,如何降低冷却系统的能耗成为了一个亟待解决的问题。本文提出了一种基于机器学习的方法来优化数据中心的冷却效率,通过实时监控和数据分析,动态调整冷却设备的工作状态,以达到节能的目的。实验结果表明,该方法可以显著降低数据中心的能耗,同时保证服务器的正常运行。
|
3天前
|
机器学习/深度学习 数据挖掘 数据中心
利用机器学习优化数据中心能效的策略研究
【4月更文挑战第24天】在数据中心管理和运营中,能效优化是一个长期存在的挑战,它直接关系到成本控制和环境影响的减轻。随着人工智能技术的不断进步,特别是机器学习(ML)方法的广泛应用,为解决数据中心能效问题提供了新的途径。本文旨在探讨如何通过机器学习技术对数据中心的能源消耗进行建模、预测和优化,以实现更高的能效。我们首先分析了数据中心能耗的主要组成部分,然后提出了一种基于机器学习的能效优化框架,并详细阐述了关键技术和方法。最后,通过实验验证了所提出策略的有效性,并讨论了未来的研究方向。
|
3天前
|
机器学习/深度学习 算法 搜索推荐
Python用机器学习算法进行因果推断与增量、增益模型Uplift Modeling智能营销模型
Python用机器学习算法进行因果推断与增量、增益模型Uplift Modeling智能营销模型
30 12
|
8天前
|
机器学习/深度学习 运维 监控
利用机器学习优化数据中心能效的研究
【4月更文挑战第19天】在数据中心的运营成本中,能源消耗占据了显著比例。随着能源价格的不断攀升与环境保护意识的加强,如何降低数据中心的能耗已成为研究的热点。本文提出了一种基于机器学习的方法来优化数据中心的能效。通过分析历史运行数据,构建预测模型,并结合实时监控,动态调整资源分配策略以达到节能目的。实验结果表明,该方法能有效减少能源开销,同时保证服务质量。

相关产品

  • 人工智能平台 PAI