我发现我可以从glrm_model(H2O广义低等级模型估计器glrm(对不起我不能把它放在标签中)中获得一组EigenVectors)这样:
EV = glrm_model._model_json [“output”] ['eigenvectors'])
然而,EV的类型是H2OTwoDimTable,它不是很有能力。
如果我尝试做(M是H2O数据框):
M.mult(EV)
我收到错误
AttributeError: 'H2OTwoDimTable' object has no attribute 'nrows'
如果我尝试将EV转换为numpy矩阵:
EV.as_matrix()
我收到错误:
AttributeError: 'H2OTwoDimTable' object has no attribute 'as_matrix'
我可以将EV转换为熊猫数据框,然后将其转换为numpy矩阵,这是一个额外的步骤并进行矩阵乘法
恕我直言,如果特征向量引用返回H2O数据帧会更好。
另外,如果H2OTwoDimTable能够更好地支持矩阵乘法作为左或右操作数,那将是一件好事。
并且EV.as_data_frame()没有use_pandas = False选项。
这是python代码,可以修改以更好地支持矩阵类型的东西:
https://github.com/h2oai/h2o-3/blob/master/h2o-py/h2o/two_dim_table.py
答案 0 :(得分:1)
“TwoDimTable”类用于在模型中存储轻量级表格数据。我同意你使用H2OFrames代替TwoDimTables,但它是很久以前制作的设计选择(现在无法改变)。
由于H2O框架可以包含非数字数据,因此从H2OFrame或TwoDimTable到Pandas DataFrame有一种.as_data_frame()
方法。因此,您可以将.as_data_frame().as_matrix()
链接在一起以获得矩阵(numpy.ndarray
),如果这正是您要查找的内容。这是一个例子:
import h2o
from h2o.estimators.glrm import H2OGeneralizedLowRankEstimator
h2o.init()
data = h2o.import_file("https://s3.amazonaws.com/h2o-public-test-data/smalldata/glrm_test/cancar.csv")
# Train a GLRM model with recover_svd=True to keep eigenvectors
glrm = H2OGeneralizedLowRankEstimator(k=4,
transform="NONE",
loss="Quadratic",
regularization_x="None",
regularization_y="None",
max_iterations=1000,
recover_svd=True)
glrm.train(x=data.names, training_frame=data)
# Get eigenvector TwoDimTable from the model
EV = glrm._model_json["output"]['eigenvectors']
# Convert to various formats
evdf = EV.as_data_frame() #pandas.core.frame.DataFrame
evmat = evdf.as_matrix() #numpy.ndarray
# or directly
evmat = EV.as_data_frame().as_matrix()
如果您对将.as_matrix()
方法添加到TwoDimTable类感兴趣,可以在h2o-3 repo上提交拉取请求。我认为这将是一个有用的扩展。有关如何在contributing guide中为H2O做出贡献的更多信息。