【问题标题】:Passing a list of randomForest objects back to R with rpy2使用 rpy2 将 randomForest 对象列表传递回 R
【发布时间】:2015-04-30 01:51:06
【问题描述】:

我正在尝试使用 rpy2 组合多个随机森林模型。 R 中的 combine 命令看起来相当简单,但我不确定如何将 RF 对象从 python 传递到 R。

简单示例:

import pandas as pd
import numpy as np
import sys
if sys.version_info[0] < 3:
    from string import lowercase
else:
    from string import ascii_lowercase as lowercase
import rpy2.robjects as robjects
from rpy2.robjects import pandas2ri
pandas2ri.activate()
r = robjects.r

r.library("randomForest")

df = pd.DataFrame(data=np.random.random(size=(100, 10)), columns=[a for a in lowercase[:10]])
cols = df.columns
RF = []

for _ in range(5):
    df['train'] = np.random.random(size=100) < .75
    rf = r.randomForest(robjects.Formula('a~.'), data=df[df.train][cols])
    RF.append(rf)

当我尝试在 R 中使用 combine 射频模型时

RFall = r.combine(RF)

返回错误:

Error in (function (...)  : 
  Argument must be a list of randomForest objects

我查看了robjects 中的其他函数,但找不到可以执行此操作的函数。

【问题讨论】:

    标签: python r random-forest rpy2


    【解决方案1】:

    错误消息来自 R,预期的列表是 R 列表。

    尝试使用:

    RFl = robjects.vectors.ListVector([('X%i' % i, x) for i, x in enumerate(RF)])
    

    编辑: ListVector 的构造函数需要列表元素的名称

    ** 第二次编辑:** 然而,解决方案的真正途径是注意到您没有正确调用combine(),并且调用combine() 时返回的错误消息非常具有误导性。你想要的(ed)是

    RFall = r.combine(*RF)
    

    【讨论】:

    • 对不起@Igautier,我认为这是可行的。但我刚刚又试了一次,却收到ValueError: too many values to unpack 错误
    • 我可能会错过一些东西,但它应该可以工作。你能确保问题中的代码示例可以复制吗?
    • @Igautier 代码示例重现错误,我已经在几个不同的 Python 安装上尝试过
    • @kungphil :我的意思是,该示例最好使用复制/粘贴(这里似乎找不到 lowercase ......直到人们意识到 Python 2 可能已经包含它string)
    • @kungphil : 我打电话给ListVector() 的方式有点小问题。答案已被编辑。
    猜你喜欢
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    相关资源
    最近更新 更多