为什么 R 和 Python 之间得到不同的 RandomForest 结果?

2024-01-16

我正在尝试比较使用 R 和使用 Python 的随机森林模型的结果。我要比较的模型性能的关键衡量指标是 AUC(ROC 曲线下面积)。原因是 AUC 值代表预测值(即概率)的分布。我确实发现 R 和 Python 之间的 AUC 值存在一些显着差异。我确实阅读了 Stack Overflow 上有关 R 和 Python 之间差异的一些相关问题和答案。但是,我觉得我的问题应该与那些不同。

我尝试在 R 和 Python 中保持一些关键的超参数相同。他们是:

  1. Set ntree在 R 中等于n_estimators在Python中
  2. Set mtry在 R 中等于max_features在Python中
  3. Set nodesize在 R 中等于min_samples_leaf在Python中
  4. 将类别权重设置为 R 和 Python 中的默认值。在 R 中,默认值为NULL。在Python中,默认值是None.
  5. 将 R 中的样本大小设置为训练数据中的总行数,这是 Python 中的默认设置。
  6. Set replace在 R 中等于bootstrap在Python中,即两者都是True或者两者都是False.

该问题是一个二分类问题,有 86 个预测变量。每个预测变量都是连续变量或布尔变量。 R 中没有使用因子类型预测器。训练数据中有 2008 个观测值,测试数据中有 335 个观测值。两个数据的响应率相同,即 79.7%。

结果如下:

R 中的模型 1 结果
training_auc=0.9249080, test_auc=0.6308934

R 中的模型 2 结果
training_auc=0.9245665, test_auc=0.6364838

Python 中的模型 1 结果
training_auc=0.80515863, test_auc=0.62194316

Python 中的模型 2 结果
training_auc=0.86075733, test_auc=0.61522362

您可以发现,R 和 Python 之间的模型 2(非引导采样)中的 AUC 值差异小于模型 1(引导采样)中的 AUC 值,尤其是在训练数据上的 AUC 值。

即使我在 R 和 Python 中设置相同的超参数,为什么训练数据上的 AUC 会有如此巨大的差异?我错过了什么重要参数吗?或者我的 R 或 Python 代码有什么错误吗?

随机森林模型的 R 代码

library(randomForest)
library(glmnet)
setwd("D:/Project Files2/Python Efficiency/test RF using another dataset")

#read in data for training and data for testing
X_train01 <- read.csv("X_train_0.csv",header=FALSE)
y_train01 <- read.csv("y_train_0.csv",header=FALSE)
colnames(y_train01) <- "response"

X_test01 <- read.csv("X_test_0.csv",header=FALSE)
y_test01 <- read.csv("y_test_0.csv", header=FALSE)
colnames(y_test01) <- "response"

#define a function for RF
run_quick_rf4 <- function(X_train01,y_train01, X_test01, y_test01, ntree, mtry, nodesize, maxnodes=NULL, replace=TRUE, classwt=NULL, rnd_seed= 12345){
  
  set.seed(rnd_seed)
  rf_model <- randomForest(x=X_train01,y=as.factor(y_train01[,1]),
                           ntree=ntree,
                           mtry= mtry,
                           nodesize= nodesize,
                           maxnodes= maxnodes,
                           replace = replace,
                           sampsize = nrow(X_train01),
                           classwt = classwt
  )
  train01_pred <- predict(rf_model, X_train01, type='prob')
  train01_auc <- auc(y_train01[,1], train01_pred[,2])
  
  test01_pred <- predict(rf_model, X_test01, type='prob')
  test01_auc <- auc(y_test01[,1],test01_pred[,2])
  auc_outcome<- c(train01_auc, test01_auc)
  names(auc_outcome)<- c("training_auc", "test_auc")
  return(auc_outcome)
}
#>>>>>>>>>>>>>>>>>>>>>>>>>End of this function>>>>>>>>>>>>>>>>>>

#run random forest models with parameters set.

#Model 1
run_quick_rf4(X_train01, y_train01, X_test01, y_test01, 500, 20, 20, maxnodes=NULL, replace=TRUE, classwt=NULL, rnd_seed= 12345)

#Model 2
run_quick_rf4(X_train01, y_train01, X_test01, y_test01, 500, 20, 20, maxnodes=NULL, replace=FALSE, classwt=NULL, rnd_seed= 12345)

随机森林模型的 Python 代码

import numpy as np
from sklearn import cross_validation
from sklearn.metrics import roc_auc_score
from sklearn.ensemble import RandomForestClassifier
import datetime
import os
#change work directory
os.chdir("D:/yxue/Uplift_Gilenya/followup/Data")

# only specify sample weight
def run_quick_RF_final(file_counter, n_estimators, max_features, min_samples_leaf, max_leaf_nodes=None, class_weight={0: 1, 1: 1}, s_wt={0:1, 1:1}, bootstrap=True, random_seed=4568):
    
    x_train_file = 'X_train_%d.csv' %(file_counter)
    y_train_file = 'y_train_%d.csv' %(file_counter)
    x_test_file = 'X_test_%d.csv' %(file_counter)
    y_test_file = 'y_test_%d.csv' %(file_counter)
    
    X_train = np.loadtxt(x_train_file, delimiter=',', skiprows=0)
    y_train = np.loadtxt(y_train_file, delimiter=',', skiprows=0) 
    
    X_test = np.loadtxt(x_test_file, delimiter=',', skiprows=0)
    y_test = np.loadtxt(y_test_file, delimiter=',', skiprows=0) 
 
    rf_model = RandomForestClassifier()
    rf_model.set_params(n_estimators=n_estimators, max_features=max_features, min_samples_leaf=min_samples_leaf, max_leaf_nodes=max_leaf_nodes, class_weight=class_weight, criterion='gini', bootstrap=bootstrap, random_state=random_seed)

    if s_wt != None:
        sample_wt = np.ones((len(y_train),), dtype=np.float64)
        sample_wt[y_train == 0] = float(s_wt[0])
        sample_wt[y_train == 1] = float(s_wt[1])
    else:
        sample_wt = s_wt

    #print np.bincount(sample_wt)
    rf_model.fit(X_train, y_train, sample_weight=sample_wt)
    
    pred_train = rf_model.predict_proba(X_train)
    train_auc = roc_auc_score(y_train,pred_train[:, 1])
    
    pred_test =  rf_model.predict_proba(X_test)
    test_auc = roc_auc_score(y_test, pred_test[:, 1])
    
    auc_outcome = np.array([train_auc, test_auc])
    
    return auc_outcome
    
# run random forest model. the parameter setting is same as in R
# Model 1
run_quick_RF_final(0, 500, 20, 20, max_leaf_nodes=None, class_weight=None, s_wt=None, bootstrap=True, random_seed=4568)

# Model 2
run_quick_RF_final(0, 500, 20, 20, max_leaf_nodes=None, class_weight=None, s_wt=None, bootstrap=False, random_seed=4568)

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 R 和 Python 之间得到不同的 RandomForest 结果? 的相关文章

  • 为什么这个 R ggplot2 代码会显示一个空白的显示设备?

    虽然 SO 通常不用于帮助解决错误 但这个显示了特别简单且特别烦人的行为 如果你是一个ggplot2用户 您可以在 10 秒或更短的时间内重现它 正如这个 GitHub 问题 ggplot gtable 创建空白显示 https githu
  • dplyr:连接中的 NSE (by)

    我很难弄清楚如何使用 dplyr left join 和 NSE 连接两个表 问题是我无法为 by 提供正确的值 我想我现在已经找到了解决方案 但感觉我正在以一种额外复杂的方式来做 因此 如果您知道更简单 更优雅的解决方案 请告诉我 这就是
  • 为什么在连接两个字符串时 Python 比 C 更快?

    目前我想比较 Python 和 C 用来处理字符串的速度 我认为 C 应该比 Python 提供更好的性能 然而 我得到了完全相反的结果 这是 C 程序 include
  • 类型错误:“datetime.datetime”和“str”的实例之间不支持“>”

    我是 python 日期和时间类型的新手 我有一个日期值 date 2018 11 10 10 55 31 00 00 我需要检查该日期值是否超过 90 天 我试过 from datetime import datetime from da
  • 使用pathlib获取主目录

    翻看新的pathlib在 Python 3 4 中 我注意到没有任何简单的方法来获取用户的主目录 我能想到的获取用户主目录的唯一方法是使用旧的os path像这样的库 import pathlib from os import path p
  • 如何从hdfs读取文件[重复]

    这个问题在这里已经有答案了 我在 project1目录下的hadoop文件系统中有一个文本文件名mr txt 我需要编写 python 代码来读取文本文件的第一行 而不将 mr txt 文件下载到本地 但我无法从 hdfs 打开 mr tx
  • 设置高亮大括号的 vim 颜色主题

    如何更改突出显示大括号的 vim 配色方案 我希望实际编辑 vim 主题文件以使更改永久生效 问候 克雷格 匹配括号的自动高亮颜色称为MatchParen 您可以通过执行以下操作来更改 vimrc 中的颜色 highlight MatchP
  • 正在使用 PIL 保存损坏的图像

    我遇到一个问题 操作图像像素导致保存损坏的图像 因此 我使用 PIL 打开图像 然后将其转换为 NumPy 数组 image Image open myimage png np image np asarray image 然后 我转置图像
  • 将 window.location 传递给 Flask url_for

    我正在使用 python 在我的页面上 当匿名用户转到登录页面时 我想将一个变量传递到后端 以便它指示用户来自哪里 发送 URL 因此 当用户单击此锚链接时 a href Sign in a 我想发送用户当前所在页面的当前 URL
  • 通过 Python 循环浏览网络上的目录并显示其内容(文件和其他目录)

    同样的道理在Python中处理从源目录到目标目录的一组文件 https stackoverflow com questions 2593399 process a set of files from a source directory t
  • 类型错误:此 COM 对象无法自动执行 makepy 过程 - 请为此对象手动运行 makepy

    这是什么错误 回溯错误 C Users DELL PycharmProjects MyNew venv Scripts python exe C Users DELL PycharmProjects MyNew agaaaaain py T
  • R中IF函数的使用

    我正在短跑ifR 中的函数 但收到以下警告消息 In if runif 50 0 1 lt 0 69 the condition has length gt 1 and only the first element will be used
  • Python:在字典中查找具有唯一值的键?

    我收到一个字典作为输入 并且想要返回一个键列表 其中字典值在该字典的范围内是唯一的 我将用一个例子来澄清 假设我的输入是字典 a 构造如下 a dict a cat 1 a fish 1 a dog 2 lt unique a bat 3
  • 要在子集中显示的非数字条目的维恩图

    我有以下数据框 SET1 SET2 SET3 par1 par2 par1 par2 par3 par2 par3 par4 par5 我想制作一个维恩图 其中所有这些 parX 元素都显示在各自的子集中 即作为标签 而不仅仅是重叠元素的数
  • 为什么 Collections.counter 这么慢?

    我正在尝试解决罗莎琳德的基本问题 即计算给定序列中的核苷酸 并在列表中返回结果 对于那些不熟悉生物信息学的人来说 它只是计算字符串中 4 个不同字符 A C G T 出现的次数 我期望collections Counter是最快的方法 首先
  • Django 将 JSON 数据传递给静态 getJSON/Javascript

    我正在尝试从 models py 中获取数据并将其序列化为views py 中的 JSON 对象 模型 py class Platform models Model platformtype models CharField max len
  • 如何创建用于霍夫曼编码和解码的树?

    对于我的作业 我将对霍夫曼树进行编码和解码 我在创建树时遇到问题 并且陷入困境 不要介意打印语句 它们只是让我测试并查看函数运行时的输出是什么 对于第一个 for 循环 我从主块中用于测试的文本文件中获取了所有值和索引 在第二个 for 循
  • Python 读取未格式化的直接访问 Fortran 90 给出不正确的输出

    这是数据的写入方式 它是一个二维浮点矩阵 我不确定大小 open unit 51 file rmsd nn output form unformatted access direct status replace recl Npoints
  • 两种 ODE 求解器之间的差异

    我想知道 两者之间有什么区别ODEINT and solve ivp用于求解微分方程 它们之间有什么优点和缺点 f1 solve ivp f 0 1 y0 y0 is the initial point f2 odeint f y0 0 1
  • 基于值的 matplotlib 条形图颜色

    有没有一种方法可以根据条形图的值对条形图的条形进行着色 例如 values below 0 5 red values between 0 5 to 0 green values between 0 to 08 blue etc 我找到了一些

随机推荐

  • 跟踪嵌入的 YouTube 视频观看次数

    我在我的网站中嵌入了一些 YouTube 视频 我想使用 google Analytics 跟踪每个视频的观看次数 但我无法捕获任何 onClick 事件 因为视频是使用 iFrame 嵌入的 如何使用 iFrame 跟踪嵌入在我的网页中的
  • React-router 链接不起作用

    React router 的起步非常糟糕 看起来基本的东西不起作用 使用react router 2 0 0我的Link组件将URL更新为 about 但我的页面在那之后不会渲染About组件 入口点js var React require
  • 使用 Moq 模拟 EF DbContext

    我正在尝试使用模拟的 DbContext 为我的服务创建单元测试 我创建了一个界面IDbContext具有以下功能 public interface IDbContext IDisposable IDbSet
  • 跨浏览器 nowrap 文本区域

    我正在寻找一种跨浏览器解决方案 文本区域 文字换行only输入时 滚动条都隐藏 直到文本溢出 我已经尝试了几乎所有可以在SO中找到的东西 失败 1 textarea white space nowrap overflow auto 在 FF
  • 最好的免费测试跟踪软件是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Vuejs 和 Vue.set(),更新键/值数组

    我想弄清楚如何this set aka Vue set api 在使用它更新多维数组时起作用 Given new Vue el app data rows id 4 edit true id 5 edit false 我将如何使用 this
  • 为什么 data.tables mutate(row_number()) 失败?

    当我尝试使用时row number from dplyr在 data table 上 它会抛出错误 这是一个例子 library dplyr library data table mine lt data table a 1 10 mine
  • 通过正则表达式解析CSS

    我正在创建一个 CSS 编辑器 并尝试创建一个可以从 CSS 文档获取数据的正则表达式 如果我有一个属性 则此正则表达式有效 但无法让它适用于所有属性 我在 PHP 中使用 preg perl 语法 Regex
  • 有人使用过 __COUNTER__ 预处理器宏吗?

    The COUNTER 符号由提供VC http msdn microsoft com en us library b0084kay VS 80 aspx和GCC 并且每次使用时都会给出一个递增的非负积分值 我有兴趣了解是否有人使用过它 以
  • 如何找出当前的溢出检查上下文?

    有没有办法在 C 中做到这一点 例如 如果调用您的方法并且您想知道调用者是否已将方法调用放入已检查的块中 checked unchecked块始终是方法的本地块 关键字影响如何为块中的语句和表达式生成 IL 它不会传播到调用的方法 并且无法
  • 如何在 Google Drive 上为 Google Colab 安装 conda?

    wget https repo anaconda com miniconda Miniconda3 py37 4 8 2 Linux x86 64 sh chmod x Miniconda3 py37 4 8 2 Linux x86 64
  • Linq、表达式、NHibernate 和 Like 比较

    我试图根据确定比较类型的外部参数 通过搜索表单传递 进行类似的比较 string or string or string 我朝以下方向思考 query query Where Entity StringProperty Like Searc
  • setItemWidget 导致崩溃

    我正在尝试添加一个QLabel to a QTreeWidgetItem但Python崩溃了setItemWidget call 有什么想法为什么会崩溃吗 这是代码 from PySide import QtCore QtGui view
  • 如何使用 pyglet 显示 numpy 数组?

    我有一个尺寸为 100 100 的标签矩阵 存储为 numpy 数组 我想用 pyglet 显示该矩阵 我最初的想法是使用这个矩阵通过函数 pyglet image ImageData 形成一个新的 pyglet 图像 它需要图像数据的缓冲
  • 如何在本地加载 wasm 模块?

    我正在尝试使用 JavaScript 和 WebAssembly 制作一个简单的 独立的 只有一个 html 文件和一个 wasm 文件 离线数据可视化 但是 我在从本地文件加载 WASM 模块时遇到问题 第一个麻烦是CORS 尝试使用亲戚
  • 使用rentrez从pubmed中解析出作者和隶属关系

    我的总体目标是构建一个共同作者网络图 我有一份 PubMed ID 列表 这些是我唯一对绘制合著者网络图表感兴趣的出版物 我不知道如何使用rentrez 在查询中将作者姓名和各自的隶属关系放在一起 我可以获得这两个信息 但我的隶属关系列表比
  • 在 Python 中使用正则表达式替换除特定元素之外的所有元素

    在Python中使用正则表达式 我试图删除字符串中的所有XML类型元素 除了那些包含QUOTE的元素 例如
  • 如何包含文件上传对话框

    我获得了一些 C 图形扩展代码来上传 Excel 文件 以便导入到 购买收据 屏幕上的 分配 弹出屏幕中 未包含的是似乎用作对话框的 PXSmartPanel 任何关于如何设置 配置此智能面板以实现给定代码中的目的的帮助将不胜感激 有问题的
  • 我应该如何本地化现有的 JavaScript Web 应用程序?

    我有一项非常棘手的任务要做 有一个现有的 Web 项目 2 个 HTML 文件 一些插件和一个包含大约 2000 行代码的主要 JavaScript 文件 我现在必须对其进行本地化 毫无疑问 这应该早点考虑到 但他们只是错过了 您将如何寻找
  • 为什么 R 和 Python 之间得到不同的 RandomForest 结果?

    我正在尝试比较使用 R 和使用 Python 的随机森林模型的结果 我要比较的模型性能的关键衡量指标是 AUC ROC 曲线下面积 原因是 AUC 值代表预测值 即概率 的分布 我确实发现 R 和 Python 之间的 AUC 值存在一些显