开始调节新的参数

from sklearn.ensemble import RandomForestRegressor

rf = RandomForestRegressor(random_state = 42)

from pprint import pprint

# 打印所有参数
pprint(rf.get_params())

开始尝试各种参数吧

调参路漫漫,参数的可能组合结果实在太多了,我们还得有章可循,首先登场的是:RandomizedSearchCV(),这个函数可以帮助我们在候选集组合中,不断的随机选择一组合适的参数来建模,并且求其交叉验证后的评估结果。为什么要不断随机的选择呢?按顺序一个个来不是更靠谱嘛,假设咱们有5个参数待定,每个参数都有10种候选值,那一共有多少种可能性呢?这个数字就很大了吧,由于建立模型所花的时间并不少,当数据量大的时候,几小时能完成一次建模就已经不错了,所以我们很难遍历到所有的可能,随机变成了一种策略,让我们大致能得到比较合适的参数组合,该函数所需的所有参数解释都在API文档中有详细说明.

from sklearn.model_selection import RandomizedSearchCV

# 建立树的个数
n_estimators = [int(x) for x in np.linspace(start = 200, stop = 2000, num = 10)]
# 最大特征的选择方式
max_features = ['auto', 'sqrt']
# 树的最大深度
max_depth = [int(x) for x in np.linspace(10, 20, num = 2)]
max_depth.append(None)
# 节点最小分裂所需样本个数
min_samples_split = [2, 5, 10]
# 叶子节点最小样本数,任何分裂不能让其子节点样本数少于此值
min_samples_leaf = [1, 2, 4]
# 样本采样方法
bootstrap = [True, False]

# Random grid
random_grid = {'n_estimators': n_estimators,
               'max_features': max_features,
               'max_depth': max_depth,
               'min_samples_split': min_samples_split,
               'min_samples_leaf': min_samples_leaf,
               'bootstrap': bootstrap}

在这个任务中,我们只给大家举例来进行说明,考虑到时间问题,所选的参数的候选值并没有给出太多。这里值得注意的是每一个候选参数的参数空间需要我们好好把控,因为如果这个取值范围给定的不恰当,最好的结果肯定也不会太好,这里可以参考一些经验值或者不断通过实验结果来改变参数空间,这是一个反复的过程,并不是说我们机器学习建模任务就是从前往后的进行,有了实验结果之后,都需要再回过头来反复来对比不同参数,不同预处理方案的。

# 随机选择最合适的参数组合
rf = RandomForestRegressor()

rf_random = RandomizedSearchCV(estimator=rf, param_distributions=random_grid,
                              n_iter = 100, scoring='neg_mean_absolute_error',
                              cv = 3, verbose=2, random_state=42, n_jobs=-1)

# 执行寻找操作
rf_random.fit(train_features, train_labels)

rf_random.best_params_

这里给大家解释一下RandomizedSearchCV中常用的参数,其实在API文档中都给出了说明,还是建议大家养成这个查阅文档的习惯。

  • Estimator:RandomizedSearchCV这个方法是一个通用的,并不是专为随机森林设计的,所以我们需要指定选择的算法模型是什么。
  • Distributions:参数的候选空间,我们之间已经用字典格式给出了所需的参数分布。
  • n_iter:随机寻找参数组合的个数,比如在这里我们赋值了100代表接下来要随机找100组参数的组合,在其中找到最好的一个。
  • Scoring:评估方法,按照该方法去找到最好的参数组合
  • Cv:交叉验证,咱们之前已经唠过了。
  • Verbose:打印信息的数量,看自己的需求了。
  • random_state:随机种子,为了使得咱们的结果能够一致,排除掉随机成分的干扰,一般我们都会指定成一个值,用你自己的幸运数字就好。
  • n_jobs:多线程来跑这个程序,如果是-1就会用所有的,但是可能会有点卡。

即便我把n_jobs设置成了-1,程序运行的还是很慢,因为我们建立100次模型来选择参数,并且还是带有3折交叉验证的,那就相当于300个任务了,结果如下图所示:

评估函数

接下来就对比一下,经过调参后的结果和用默认参数结果的差异,所有默认参数在API中都有说明,比如n_estimators : integer, optional (default=10),这里就说明在随机森林模型中,默认要建立树的个数是10个。先给出评估标准:

def evaluate(model, test_features, test_labels):
    predictions = model.predict(test_features)
    errors = abs(predictions - test_labels)
    mape = 100 * np.mean(errors / test_labels)
    accuracy = 100 - mape

print('平均气温误差.',np.mean(errors))
    print('Accuracy = {:0.2f}%.'.format(accuracy))

base_model = RandomForestRegressor( random_state = 42)
base_model.fit(train_features, train_labels)
evaluate(base_model, test_features, test_labels)

老模型

新配方(最好的参数)

best_random = rf_random.best_estimator_
evaluate(best_random, test_features, test_labels)

Grid Search ,之前不是找到差不多的方案了嘛,再来微调!

可以看到模型的效果提升了一些,但是这已经是上限了嘛?还有没有可以进步的空间了呢?接下来我们又要介绍下位参选选手了:GridSearchCV(),它的意思是进行网络搜索,说白了就是一个一个的遍历,就像我们之前说的组合有多少种,就全部走一遍,其所需的参数都是类似的,没记住的话赶紧先翻一遍API文档:

from sklearn.model_selection import GridSearchCV

# 网络搜索
param_grid = {
    'bootstrap': [True],
    'max_depth': [8,10,12],
    'max_features': ['auto'],
    'min_samples_leaf': [2,3, 4, 5,6],
    'min_samples_split': [3, 5, 7],
    'n_estimators': [800, 900, 1000, 1200]
}

# 选择基本算法模型
rf = RandomForestRegressor()

# 网络搜索
grid_search = GridSearchCV(estimator = rf, param_grid = param_grid,
                           scoring = 'neg_mean_absolute_error', cv = 3,
                           n_jobs = -1, verbose = 2)

# 执行搜索
grid_search.fit(train_features, train_labels)

grid_search.best_params_

best_grid = grid_search.best_estimator_
evaluate(best_grid, test_features, test_labels)

另一组参赛选手 Grid Search

经过了再调整之后我们的算法模型效果又有了一点提升,虽然只是一小点,但是把每一小步累计在一次就是一个大成绩了。再用网络搜索的时候,遍历的次数太多,我们通常并不把所有的可能性都放进去,而是分成不同的组来分别执行,下面我们再来看看另外一组网络搜索的参赛选手:

param_grid = {
    'bootstrap': [True],
    'max_depth': [12, 15, None],
    'max_features': [3, 4,'auto'],
    'min_samples_leaf': [5, 6, 7],
    'min_samples_split': [7,10,13],
    'n_estimators': [900, 1000, 1200]
}

# 选择算法模型
rf = RandomForestRegressor()

# 继续寻找
grid_search_ad = GridSearchCV(estimator = rf, param_grid = param_grid,
                           scoring = 'neg_mean_absolute_error', cv = 3,
                           n_jobs = -1, verbose = 2)

grid_search_ad.fit(train_features, train_labels)

grid_search_ad.best_params_

best_grid_ad = grid_search_ad.best_estimator_
evaluate(best_grid_ad, test_features, test_labels)

看起来第二组选手要比第一组强一些,经过了这一番折腾之后我们可以把最终选定的所有参数都列出来了,93.82%相当于我们到此最优的一个结果了

最终模型¶

print('最终模型参数:\n')
pprint(best_grid_ad.get_params())

来总结一下我们的调参任务吧:

  • 1.参数空间是非常重要的,它会对结果产生决定性影响,所以在开始任务之前,得选择大致一个合适区间,可以参考一些相同任务论文的经验值。
  • 2.随机搜索可以更节约时间,尤其是在任务开始阶段,我们并不知道哪一个参数在哪一个位置效果能更好,这样我们可以把参数间隔设置的更大一些,先用随机搜索确定一些大致位置。
  • 3.网络搜索相当于地毯式搜索了,当我们得到了大致位置之后,想在这里寻找到最优参数的时候就派上用场了,可以把随机和网络搜索当做一套组合拳,搭配使用。
  • 4.最后调参的方法其实还有很多的,比如贝叶斯优化,这个还是蛮有意思的,跟大家简单说一下,想一想我们之前的调参方式,是不是每一个都是独立的进行不会对之后的结果产生任何影响,贝叶斯优化的基本思想在于每一个优化都是在不断积累经验,这样我会慢慢得到最终的解应当在的位置,相当于前一步结果会对后面产生影响了,如果大家对贝叶斯优化感兴趣,可以参考下Hyperopt工具包,用起来也很简便:

Python 机器学习 随机森林 天气最高温度预测任务(三)相关推荐

  1. Python 机器学习 随机森林 天气最高温度预测任务(二)

    更多的数据效果会不会更好呢? # 导入工具包 import pandas as pd# 读取数据 features = pd.read_csv('data/temps_extended.csv') f ...

  2. python基于随机森林模型的预测概率和标签信息可视化ROC曲线

    python基于随机森林模型的预测概率和标签信息可视化ROC曲线 目录 python基于随机森林模型的预测概率和标签信息可视化ROC曲线

  3. [python] 机器学习 随机森林算法RandomForestRegressor

    前言 随机森林Python版本有很可以调用的库,使用随机森林非常方便,主要用到以下的库 sklearn Scikit learn 也简称 sklearn, 是机器学习领域当中最知名的 python 模 ...

  4. Python使用随机森林预测泰坦尼克号生存

    tags: 随机森林 kaggle 数据挖掘 categories: 数据挖掘 mathjax: true 文章目录 前言: 1 数据预处理 1.1 读入数据 1.2 训练集与数据集 1.2.1 查看 ...

  5. 【Python】随机森林预测

    文章目录 前言 一.为什么要使用RF 1.优点: 2.缺点: 二.使用步骤 1.引入库 2.读入数据 3.缺失值数据处理 4.哑变量数据的处理 5.特征变量 6.建模 7.验证集结果输出对比 8.决策 ...

  6. 【python3】基于随机森林的气温预测

    前言 这个项目实战系列主要是跟着网络上的教程来做的,主要参考<跟着迪哥学习机器学习>中的思路和具体实现代码,但是书中使用到的应该是python2的版本,有一些代码也有问题,有的是省略了一些 ...

  7. Python中随机森林的实现与解释

    使用像Scikit-Learn这样的库,现在很容易在Python中实现数百种机器学习算法.这很容易,我们通常不需要任何关于模型如何工作的潜在知识来使用它.虽然不需要了解所有细节,但了解机器学习模型是如 ...

  8. r与python做随机森林_随机森林算法入门(python)

    昨天收到yhat推送了一篇介绍随机森林算法的邮件,感觉作为介绍和入门不错,就顺手把它翻译一下. 目录 1 什么是随机森林 1.1 集成学习 1.2 随机决策树 1.3 随机森林 1.4 投票 2 为什 ...

  9. gbdt 算法比随机森林容易_用Python实现随机森林算法

    CDA数据分析师 出品 拥有高方差使得决策树(secision tress)在处理特定训练数据集时其结果显得相对脆弱.bagging(bootstrap aggregating 的缩写)算法从训练数据 ...

最新文章

  1. 两阶段提交实际项目V1
  2. 线程撕裂者安装linux,CPU-Z 1.90发布:初步支持三代线程撕裂者
  3. php 使用压缩css文件,PHP-使用GZIP压缩静态CSS文件
  4. es6变量赋值重命名
  5. php打印模板插件,smarty的插件功能是smarty模板的精华
  6. spring 基于xml方式配置aop
  7. 华为推出业界首个分布式云原生产品:华为云UCS,持续创新,深耕数字化
  8. 怎么用nuget程序包管理器安装jquery_Nuget服务器
  9. 2018-09-25 参考博客Hadoop
  10. 第二阶段团队站立会议02
  11. 脚本语言和编程语言的比较
  12. 服务器上删掉的数据如何找回,在服务器数据丢失情况下如何恢复数据
  13. 解决jQuery(e).addclass(‘xxx‘)始终不生效的问题 - $(...).addclass is not a function
  14. 2021:Check it again:Progressive Visual Question Answering via Visual Entailment通过视觉暗示进行渐进式视觉问答
  15. 安装MikTex并成功编译中文PPT模板详细过程
  16. ubuntu18.04桌面卡住鼠标可以动 键盘失效
  17. 今天分享一个用Python来爬取小说的小脚本!(附源码)
  18. 人大金仓数据库-表的定义
  19. 适合户外运动的蓝牙耳机品牌有哪些呀?户外运动耳机排行榜
  20. 基于c语言实现的个人理财系统,基于Android的个人理财系统—设计和实现-论文最终版.doc...

热门文章

  1. 在VS2005中打造自己的Starter Kits
  2. mysql 统一字符编码
  3. 使用集成SOA网关的PL / SQL中的REST
  4. python计算蛋白质的质量
  5. 修改ECSHOP后台的商品列表里显示该商品品牌
  6. 关于DevExpress的心得
  7. DBGridEh导出Excel等格式文件
  8. python+selenium方法大全
  9. 08-02 性能测试--负载模型与压力来源
  10. python中对象的特性_Python深入学习之对象的属性