几周前,我写了一篇文章演示了随机森林分类模型。在本文中,我们将演示使用sklearn的RandomForrestRegressor()模型的随机森林回归案例。
与上一篇文章类似,我将从突出一些定义和术语开始,这些术语涉及和组成随机森林机器学习的主干。本文的目标是描述随机森林模型,并演示如何使用sklearn包应用它。我们的目标不是解决最优解,而是提供一个基本指南。
定义:决策树用于回归和分类问题。它们的可视化流程像树一样,因此得名,在回归案例中,它们从树的根开始,并根据变量结果进行拆分,直到达到叶节点并给出结果。下面是决策树的一个示例:
在这里,我们看到一个基本的决策树图,它从Var_1开始,并根据特定标准进行拆分。当‘yes’时,决策树遵循所表示的路径,当‘no’时,决策树进入另一条路径。这个过程重复进行,直到决策树达到叶节点并决定结果。对于上面的示例,a、b、c或d的值可以代表任何数字或类别值。
集成学习是使用多个模型,在相同数据上训练,平均每个模型的结果,最终找到更强大的预测/分类结果的过程。我们希望,并要求,集成学习的每个模型(在这种情况下是决策树)的错误是独立的,并且从树到树不同。
引导是在给定的迭代次数和给定的变量数量中随机采样数据集子集的过程。然后将这些结果平均在一起,以获得更强大的结果。引导是应用集成模型的一个例子。
引导随机森林算法将集成学习方法与决策树框架相结合,从数据中创建多个随机绘制的决策树,平均结果以输出通常导致强大的预测/分类的新结果。
在本文中,我将演示在Kaggle上由Austin Reese发布的美国住房数据创建的随机森林模型,该数据位于此处,这个数据的许可证是CC0 - 公共领域。该数据集提供有关出租房屋的信息和详细信息。该数据集由大约380k个观察值和20多个变量组成。我进行了相当多的EDA,但出于保持本文更多地关注实际随机森林模型的目的,我不会包括所有步骤。
随机森林回归模型:我们将使用sklearn模块训练我们的随机森林回归模型,具体来说是RandomForestRegressor函数。RandomForestRegressor文档显示我们可以选择许多不同的参数来选择我们的模型。以下是一些重要的参数:
- n_estimators - 你将在模型中运行的决策树的数量
- criterion - 此变量允许你选择用于确定模型结果的标准(损失函数)。我们可以从损失函数(例如均方误差(MSE)和平均绝对误差(MAE))中进行选择。默认值为MSE。
- max_depth - 这设置了每个树的最大可能深度
- max_features - 确定拆分时模型将考虑的最大特征数
- bootstrap - 默认值为True,这意味着模型遵循引导原则(前面已定义)
- max_samples - 此参数假定引导设置为True,如果不是,则不适用此参数。在True的情况下,此值设置每个树的每个样本的最大大小。
- 其他重要参数是min_samples_split、min_samples_leaf、n_jobs等,可以在sklearn的RandomForestRegressor文档中阅读到。
出于本文的目的,我们将首先展示一些输入随机森林回归模型的基本值,然后使用网格搜索和交叉验证来找到更优的参数集。
查看上面的基本模型,我们使用了300棵树;每棵树的max_features等于训练数据集中参数数量的平方根。每棵树的最大深度设置为5。最后,随机状态设置为18,以保持一切标准。
正如我之前的随机森林分类文章中所讨论的,当我们解决分类问题时,我们可以使用准确度、精确度、召回率等指标来查看我们的性能。在查看回归模型的性能指标时,我们可以使用诸如均方误差、均方根误差、R²、调整R²等因素。对于本文,我将专注于均方误差和均方根误差。
简要解释一下,均方误差(MSE)是实际输出值和预测输出值之间平方差的平均值。我们的目标是尽可能减少MSE。例如,如果我们有一个实际输出数组为(3、5、7、9)和预测输出为(4、5、7、7),那么我们可以计算均方误差为:((3-4)² + (5-5)² + (7-7)² + (9-7)²)/4 = (1+0+0+4)/4 = 5/4 = 1.25
均方根误差(RMSE)就是均方误差的平方根,所以在这种情况下,RMSE = 1.25^0.5 = 1.12。使用这些性能指标,我们可以运行以下代码来计算我们的模型的MSE和RMSE:
prediction = rf.predict(x_test)mse = mean_squared_error(y_test, prediction)
rmse = mse**.5print(mse)
print(rmse)
作者提供的图片
总的来说,我们的基本随机森林模型表现并不好。鉴于我们数据集中的大多数值在1000-2000之间,515的RMSE值相当高。展望未来,我们将看看调整是否有助于创建一个性能更好的模型。
在对大型数据集运行随机森林模型时,需要考虑潜在的长训练时间。例如,运行此第一个基本模型所需的时间约为30秒,这并不太糟糕,但正如我很快将演示的那样,这个时间要求可能会迅速增加。
现在,我们已经完成了基本的随机森林回归,我们将寻找更好的参数选择,并利用GridSearchCV sklearn方法来完成这个过程。
## Define Grid
grid = {
'n_estimators': [200,300,400,500],
'max_features': ['sqrt','log2'],
'max_depth' : [3,4,5,6,7],
'random_state' : [18]
}## show start time
print(datetime.now())## Grid Search function
CV_rfr = GridSearchCV(estimator=RandomForestRegressor(), param_grid=grid1, cv= 5)
CV_frf.fit(x_train, y_train)## show end time
print(datetime.now())
作者提供的图片
正如你在上面的代码中注意到的那样,我包括了两个打印语句,它们将显示当前日期时间,这样我们就可以跟踪函数的开始和结束时间,以衡量运行时间。正如我们在上面的图像中看到的那样,这个函数需要超过2个小时来训练/调整,这不是一个不重要的时间,比我们早期看到的基本模型的30秒要大得多。
进一步扩展,我们的数据集有大约380k个观测值,这仍然相对较小,特别是与专业应用程序或学术研究使用的观测值可能在数百万或数十亿范围内相比。在考虑使用哪种模型和权衡性能与时间时,需要考虑这些时间限制。
通过网格搜索找到的最佳参数在下面的代码部分中。使用这些参数,并在相同的数据上测试它们,我们得到以下结果。
{'max_depth': 7,
'max_features': 'sqrt',
'n_estimators': 300,
'random_state': 18}# Create and train model
rf = RandomForestRegressor(n_estimators = 300, max_features = 'sqrt', max_depth = 7, random_state = 18)
rf.fit(x_train, y_train)# Predict on test data
prediction = rf.predict(x_test)# Compute mean squared error
mse = mean_squared_error(y_test, prediction)# Print results
print(mse)
print(mse^.5)
作者提供的图片
这个均方误差结果比我们的基本模型低,这是很好的,但总的来说,我仍然认为这个性能是不充分的。504的均方根误差意味着每个估计的平均误差与实际租金价格相差$504。这种表现不佳的原因可能有几个:
- 没有使用某些变量和/或使用不必要的变量
- EDA和数据整理不佳
- 未能正确处理分类或文本变量
在我看来,表现不佳的主要原因可以归结为上述第一点。话虽如此,本文的目的不是为了产生最佳结果,而是为了演示如何应用sklearn的随机森林回归模型,并提供一些随机森林模型运作的背景信息。对于本文的目的,我认为我们能够实现我们的目标。
结论: 在本文中,我们演示了随机森林模型的一些基础知识,更具体地介绍了如何应用sklearn的随机森林回归算法。我们指出了随机森林模型的一些好处,以及一些潜在的缺点。
感谢你抽出时间阅读本文!我希望你享受阅读并学到更多关于随机森林回归的知识。我将继续撰写文章,更新这里部署的方法,以及其他方法和数据科学相关主题。
译自:https://towardsdatascience.com/random-forest-regression-5f605132d19d
评论(0)