2017-07-19 3 views
1

j'ai découvert que je peux obtenir une collection de vecteurs propres de glrm_model (H2O Généralisée bas Rang Modèle Estimateor GLRM (Désolé je ne peux pas mettre cela dans les tags)) de cette façon:H2OTwoDimTable semble manquer fonctionnalité

EV = glrm_model._model_json ["output"] ['eigenvectors'])

Cependant, le type de EV est H2OTwoDimTable qui n'est pas très performant.

Si je tente de faire (où M est un cadre de données H2O):

M.mult(EV) 

Je reçois l'erreur

AttributeError: 'H2OTwoDimTable' object has no attribute 'nrows' 

Si je tente de convertir EV à une matrice numpy:

EV.as_matrix() 

Je reçois l'erreur:

AttributeError: 'H2OTwoDimTable' object has no attribute 'as_matrix' 

Je peux convertir EV à une trame de données de panda et puis le convertir en une matrice numpy, qui est une étape supplémentaire et faire la multiplication de la matrice

à mon humble avis, il serait préférable que la référence vecteur propre retour une donnée H2O Cadre.

En outre, il serait bon que H2OTwoDimTable puisse mieux prendre en charge la multiplication matricielle en tant qu'opérande gauche ou droit.

Et EV.as_data_frame() n'a pas d'option use_pandas = False.

Voici le code python qui pourrait être modifié pour mieux les choses de type matrice de support:

https://github.com/h2oai/h2o-3/blob/master/h2o-py/h2o/two_dim_table.py

+1

Si la documentation est très mauvaise, essayez dir (EV) pour voir les attributs ... Si quelque chose n'est pas documenté, les développeurs de la bibliothèque pourraient le changer dans la prochaine version. Vérifiez toujours la documentation après avoir essayé dir (EV). –

Répondre

1

La classe « TwoDimTable » est utilisé pour stocker des données tabulaires légers dans un modèle. Je suis d'accord avec vous sur l'utilisation de H2OFrames au lieu de TwoDimTables, mais c'est un choix de conception qui a été fait il y a longtemps (ne peut pas le changer maintenant).

Étant donné que H2OFrames peut contenir des données non numériques, il existe une méthode .as_data_frame() permettant de passer d'un fichier H2OFrame ou TwoDimTable à un fichier Pandas DataFrame. Vous pouvez donc chaîner .as_data_frame().as_matrix() pour obtenir une matrice (numpy.ndarray) si c'est ce que vous cherchez. Voici un exemple:

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() 

Si vous êtes intéressé par l'ajout d'une méthode .as_matrix() à la classe TwoDimTable, vous pouvez soumettre une demande de traction sur le h2o-3 repo pour cela. Je pense que ce serait une extension utile. Il y a plus d'informations sur la façon de contribuer à H2O dans notre contributing guide.