使用 rpy2 将 randomForest 对象列表传回 R
Passing a list of randomForest objects back to R with rpy2
我正在尝试使用 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)
当我尝试 combine
R 中的 RF 模型时
RFall = r.combine(RF)
Returns错误:
Error in (function (...) :
Argument must be a list of randomForest objects
我查看了 robjects
中的其他函数,但找不到合适的函数。
错误消息源自 R,预期的列表是 R 列表。
尝试使用:
RFl = robjects.vectors.ListVector([('X%i' % i, x) for i, x in enumerate(RF)])
编辑: ListVector 的构造函数需要列表元素的名称
** 第二次编辑:** 但是,解决方案的真正途径是注意您没有正确调用 combine()
并且调用 combine()
时返回的错误消息具有误导性。你想要的(ed)是
RFall = r.combine(*RF)
我正在尝试使用 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)
当我尝试 combine
R 中的 RF 模型时
RFall = r.combine(RF)
Returns错误:
Error in (function (...) :
Argument must be a list of randomForest objects
我查看了 robjects
中的其他函数,但找不到合适的函数。
错误消息源自 R,预期的列表是 R 列表。
尝试使用:
RFl = robjects.vectors.ListVector([('X%i' % i, x) for i, x in enumerate(RF)])
编辑: ListVector 的构造函数需要列表元素的名称
** 第二次编辑:** 但是,解决方案的真正途径是注意您没有正确调用 combine()
并且调用 combine()
时返回的错误消息具有误导性。你想要的(ed)是
RFall = r.combine(*RF)