随机森林实现及调参

  • 一、R语言
    • 方法一、手动调参
    • 方法二、网格调参
  • 二、python

注:本博客数据仍采用决策树调参的泰坦尼克号数据,前奏(数据预处理)请参考☞
决策树R&Python调参对比☜

一、R语言

方法一、手动调参

PS.仅使用常规包:randomForest和循环编写。
1-建模

set.seed(6)
rf <- randomForest(Survived~.,data=train,ntree=100)
y_pred <- predict(rf,test)A <- as.matrix(table(y_pred,test$Survived))
acc <- sum(diag(A))/sum(A);acc

未做任何处理时模型精度达到0.8345865。(甚至超过决策树python调参后的结果)
2-1调参——特征数

err <- as.numeric()
for(i in 1:(ncol(train)-1)){set.seed(6)mtry_n <- randomForest(Survived~.,data=train,mtry=i)err <- append(err,mean(mtry_n$err.rate))
}
print(err)
mtry <- which.min(err);mtry

2-2调参——树的个数

set.seed(6)
ntree_fit <- randomForest(Survived~.,data=train,mtry=mtry,ntree=400)
plot(ntree_fit)
set.seed(0219)
fold <- createFolds(y = data$Survived, k=10)
right <- as.numeric()
for (i in 40:100){accuracy <- as.numeric()for(j in 1:10){fold_test <- data[fold[[j]],]fold_train <- data[-fold[[j]],]set.seed(1234)fold_fit <- randomForest(Survived~.,data=fold_train,mtry=mtry,ntree=i)fold_pred <- predict(fold_fit,fold_test)confumat <- as.matrix(table(fold_pred,fold_test$Survived))acc <- sum(diag(confumat))/sum(confumat)accuracy = append(accuracy,acc)}right <- append(right,mean(accuracy))
}
print(max(right))
print(which.max(right)+40)

本段结合交叉验证的随机森林树个数的调参为博主自行编写,若有问题请私信讨论,转摘请注明出处,谢谢!
3-最优模型预测

set.seed(6)
rf_best <- randomForest(Survived~.,data=train,mtry=3,ntree=58)
pred <- predict(rf_best,test)
A <- as.matrix(table(pred,test$Survived))
acc <- sum(diag(A))/sum(A);acc

特征数和基分类器的个数调整后模型精度达到0.8609023!!!比未调整结果提高约2.5%!!!

方法二、网格调参

PS.使用强大的caret包和trainControl、tunegrid函数。
但随机森林网格调参只有一个参数mtry,且为随机调整.

library(caret)
metric = "Accuracy"
control <- trainControl(method = "repeatedcv", number = 10, repeats = 10)
set.seed(6)
rf_carte <- train(Survived~.,data=train,method = "rf",metric = "Accuracy", trControl = control,search = "random")
modelLookup(model = "rf")rf_carte
y <- predict(rf_carte,test#,type = "prob"
)
A <- as.matrix(table(y,test$Survived))
acc <- sum(diag(A))/sum(A);acc   # 0.8345865

特征数减少,模型泛化效果变差,此时模型误差上升,出现过拟合。
PS.若小伙伴有关于随机森林网格调参更好的办法或更多关于caret包的资料,欢迎一起学习讨论!

二、python

0-导入所需库(决策树调参已导入的不再导入)

from sklearn.ensemble import RandomForestClassifier

1-建模

rf = RandomForestClassifier(n_estimators=100,random_state=19)
rf.cv = cross_val_score(rf,x,y,cv=10).mean()
print(rf.cv)rf0 = rf.fit(xtrain,ytrain)
score = rf0.score(xtest,ytest)
print(score)

2-调参
2-1 n_estimators

best_ntree = []
for i in range(1,201,10):rf = RandomForestClassifier(n_estimators=i,n_jobs=-1,random_state = 19)score = cross_val_score(rf,x,y,cv=10).mean()best_ntree.append(score)
print(max(best_ntree),np.argmax(best_ntree)*10)
plt.figure()
plt.plot(range(1,201,10),best_ntree)
plt.show()

# 缩短区间查看:
ntree = []
for i in range(30,60):rf = RandomForestClassifier(n_estimators=i,random_state=19,n_jobs=-1)score = cross_val_score(rf,x,y,cv=10).mean()ntree.append(score)
print(max(ntree),np.argmax(ntree)+30)  # ntree = 55plt.plot(range(30,60),ntree)
plt.show()


6-调参(2)max_depth

from sklearn.model_selection import GridSearchCV
param_grid = {'max_depth':[*range(1, 9)]}   # 设置参数rf = RandomForestClassifier(n_estimators=55,random_state=19)
GS = GridSearchCV(rf,param_grid,cv=10)
GS.fit(x,y)
GS.best_score_     # 0.8335208098987626
GS.best_params_     # max_depth=8

6-调参(3)max_features

param_grid = {'max_features':[*range(1,4)]}
rf = RandomForestClassifier(n_estimators=55,random_state=19,max_depth=8)
GS = GridSearchCV(rf,param_grid,cv=10)
GS.fit(x,y)
GS.best_score_     # 0.8335208098987626
GS.best_params_     # max_features=3

6-调参(4)min_samples_leaf,min_samples_split

param_grid = {'min_samples_leaf':[*range(1,11)],'min_samples_split':[*range(2,22)]}
rf = RandomForestClassifier(n_estimators=55,random_state=19,max_depth=8,max_features=3)
GS = GridSearchCV(rf,param_grid,cv=10)
GS.fit(x,y)
GS.best_score_    # 0.8368953880764904
GS.best_params_    # min_samples_leaf=1,min_samples_split=4

本人也试了所有参数整体调参,但费时很长,有兴趣的小伙伴可以试试。

# 整体调参
param_grid = {'max_depth':[*range(1,9)],'max_features':[*range(1,9)],'min_samples_leaf':[*range(1,11)],'min_samples_split':[*range(2,22)]}
rf = RandomForestClassifier(n_estimators=55,random_state=19)
GS = GridSearchCV(rf,param_grid,cv=10)
GS.fit(x,y)
GS.best_score_     # 0.8402699662542182

综上,此时单独调参的训练结果得到的最优模型交叉验证的准确率约为0.8369;
整体调参可达到约0.8403。
R网格调参结果约为:0.8346;
R手动调参结果约为:0.8609,R手动调参结果最优,而网格调参可调整的参数有限仅能达到0.8346低于python网格调参,python的sklearn库调参可操作空间大。
PS.R语言中重要参数(需要调节的)为ntree和mtry,分别为所建森林中树的个数和建立每棵树需要的特征数。Python中的重要参数为:n_estimators、max_depths和max_features。R中没有树的最大深度我猜想是因为默认让每棵树最大限度生长,但是mtry同样可以限制树的深度,试想,若mtry控制的小,即使树完全生长,它的深度也不会很大的!因此python中的控制树过拟合的剪枝参数都是相互有联系的,也可以只调节某一些即可。

随机森林实现及调参的R与Python对比——以泰坦尼克幸存者数据为例相关推荐

  1. 决策树实现及调参的R与python方法对比——以泰坦尼克幸存者数据为例

    R&python的决策树实现及调参 R实现 python实现 注:本文不涉及决策树理论部分,若有兴趣请移步☞https://blog.csdn.net/weixin_43462348/arti ...

  2. 机器学习(10)-随机森林案例(调参)之公共自行车使用量预测

    随机森林案例之公共自行车使用量预测 1. 前言 1.1 背景介绍 1.2 任务类型 1.3 数据文件说明 1.4 数据变量说明 1.5 评估方法 2. 数据预处理 2.1 观察数据有没有缺失值 2.2 ...

  3. 调参1——随机森林贝叶斯调参

    贝叶斯调参教程请参考:https://blog.csdn.net/weixin_35757704/article/details/118480135 安装贝叶斯调参: pip install baye ...

  4. matlab 随机森林算法_(六)如何利用Python从头开始实现随机森林算法

    博客地址:https://blog.csdn.net/CoderPai/article/details/96499505 点击阅读原文,更好的阅读体验 CoderPai 是一个专注于人工智能在量化交易 ...

  5. 在R、Python和Julia中常用的数据可视化技术

    俗话说"一图胜千言".通过各种图片和图形化展示,我们可以更清晰地表达很多抽象概念.理论.数据模式或某些想法.在本章中,我们首先解释为什么应该关心数据可视化.然后,我们将讨论几种在R ...

  6. 随机森林算法(Random Forest)R语言实现

    随机森林 1. 使用Boston数据集进行随机森林模型构建 2. 数据集划分 3.构建自变量与因变量之间的公式 4. 模型训练 5. 寻找合适的ntree 6. 查看变量重要性并绘图展示 7. 偏依赖 ...

  7. sklearn实现决策树,随机森林,逻辑回归,KNN,贝叶斯,SVM,以葡萄干数据集为例

    数据集介绍 本次使用的数据集为葡萄干数据集,来源于UCI中: https://archive.ics.uci.edu/ml/datasets/Raisin+Dataset 介绍为: Images of ...

  8. 【R和Python对比】matplotlib和ggplot(一)

    接下来几天对比下R和py的作图功能. R的ggplot可以说是各方面都很优秀的作图包,具有优雅的语法结构.多参数可变的调整和丰富的作图模式,然而ggplot学习起来较为复杂,而且在画图之前需要做一些繁 ...

  9. 怎样开启成功的“数据分析师”职业生涯(R、Python、机器学习、通信和数据可视化、数据直觉)

    目录 数据分析师是做什么的? 如何成为一名数据分析师:成为一名成功的数据分析师所需的技能 如何成为数据分析师:数据分析师职业的编程技能 ? R语言编程 Python 统计 数学 机器学习 在监督学习 ...

最新文章

  1. 因用了Insert into select语句,同事被开除了!
  2. spring_Spring Boot登录选项快速指南
  3. 中国最大的python社区-一个将会是国内最高品质的 Python 社区,大家一起来见证...
  4. shell脚本——expect命令
  5. 统计SQL2005中数据库中的每张表的记录数
  6. EMR Spark Runtime Filter性能优化
  7. 迁移 Docker 到其它磁盘目录
  8. mysql加载原ibd mysql8.0_MySQL 8.0 使用ibd文件恢复数据步骤
  9. 关于VFS文件系统中的superblock、inode、d_entry和file数据结构
  10. 10.24 cv方向3DMM必备环境——Windows10/11下pytorch3d[完美安装版]
  11. 计算机考研 外部排序,2021考研408数据结构基础知识点:外部排序
  12. 洛谷P5706 【深基2.例8】再分肥宅水(c ,c++混合版)
  13. 有趣的 Google command line shell
  14. centos 6.9部署svn服务器和客户端(客户端含windows、linux版本)
  15. 自然数e的故事(转)
  16. 萌新卷妹带你逃出算法无名岛第六站
  17. Windows Home Server 是什么?
  18. 【JavaEE】进入Web开发的世界-HTML
  19. 百变郁锦香,开创新典范,深化全球战略布局成就国际高端酒店品质之选
  20. Azure IoT Hub 十分钟入门系列 (2)- 使用模拟设备发送设备到云(d2c)的消息

热门文章

  1. 安全计算:AntiVir Personal Edition提供免费病毒防护
  2. mysql脏读,幻读,不可重复读以及间隙所解决幻读
  3. EasyRecovery五个步骤搞定数据恢复
  4. 简单的Django系统模板
  5. 逻辑回归 - 理论篇
  6. 安装软件总是遇到“Windows Installer 正在安装”,下载Windows Installer Clean Up安装不了
  7. mysql的char在java中表示为_Java学习篇之-Mysql中varchar门类总结_mysql
  8. 社交网站需要多大的服务器空间,社交app选多大云服务器
  9. twrp双清勾选哪两个_浅谈TWRP的作用
  10. 【洛谷P4233】— 射命丸文的笔记(竞赛图+多项式求逆)