Introducción h2o Python

Contenido

Introducción

En este apartado tomamos un primer contacto con h2o para python. Previamente se ha instalado con las instrucciones que figuran en el siguiente enlace: http://h2o-release.s3.amazonaws.com/h2o/rel-wright/2/index.html.

NOTA: Si el usuario tiene instalado ANACONDA, con el mismo también se instala colorama. En mi caso concreto, la versión de colorama que se tenía no era concordante con la instalación que se estaba haciendo con las instrucciones anteriores. Lo que se hizo fue actualizar colorama desde ANACONDA y después el proceso de instalación y ejecución no generó ningún problema.

import h2o
h2o.init()

Checking whether there is an H2O instance running at http://localhost:54321..... not found.
Attempting to start a local H2O server...
; Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
  Starting server from D:\python_Anaconda\lib\site-packages\h2o\backend\bin\h2o.jar
  Ice root: C:\Users\d47a001\AppData\Local\Temp\tmpck_zpaqz
  JVM stdout: C:\Users\d47a001\AppData\Local\Temp\tmpck_zpaqz\h2o_d47a001_started_from_python.out
  JVM stderr: C:\Users\d47a001\AppData\Local\Temp\tmpck_zpaqz\h2o_d47a001_started_from_python.err
  Server is running at http://127.0.0.1:54321
Connecting to H2O server at http://127.0.0.1:54321... successful.
H2O cluster uptime: 07 secs
H2O cluster timezone: Europe/Paris
H2O data parsing timezone: UTC
H2O cluster version: 3.20.0.2
H2O cluster version age: 2 months and 27 days
H2O cluster name: H2O_from_python_d47a001_3dbn5p
H2O cluster total nodes: 1
H2O cluster free memory: 1.755 Gb
H2O cluster total cores: 0
H2O cluster allowed cores: 0
H2O cluster status: accepting new members, healthy
H2O connection url: http://127.0.0.1:54321
H2O connection proxy: None
H2O internal security: False
H2O API Extensions: Algos, AutoML, Core V3, Core V4
Python version: 3.6.0 final


Si ahora, en un navegador en el campo de direcciones, se escribe http://127.0.0.1:54321 entonces se tiene acceso a una pantalla con funciones muy interesantes para poder trabajar con H2O.

La interface que se muestra en esta dirección se denomina Flow. En esta interface se puede ver, entre otras muchas otras cosas, las siguientes:

  • Datos que se han descargado vía un cliente ( en nuestro caso será el “data” que se mostrará más adelante).
  • Descargar datos directamente.
  • Ver modelos creados desde un cliente.
  • Crear nuevos modelos.
  • Ver predicciones que se han creado desde un cliente.
  • Ejecutar predicciones directamente desde la interface

Con las instrucciones anteriores lo que se ha hecho es abrir una conexión con h2o y las características de la conexión son las que figuran en el bloque anterior.

A continuación lo que se hace es leer un fichero ( en este caso el tan utilizado en machine learning: Iris ) y se muestra el inicio del mismo y la clase de datos que se han obtenido.

datasets = "https://raw.githubusercontent.com/DarrenCook/h2o/bk/datasets/"
data = h2o.import_file(datasets + "iris_wheader.csv")
print(type(data))
data.head
Parse progress: |█████████████████████████████████████████████████████████| 100%
<class 'h2o.frame.H2OFrame'>
sepal_len sepal_wid petal_len petal_widclass
5.1 3.5 1.4 0.2Iris-setosa
4.9 3 1.4 0.2Iris-setosa
4.7 3.2 1.3 0.2Iris-setosa
4.6 3.1 1.5 0.2Iris-setosa
5 3.6 1.4 0.2Iris-setosa
5.4 3.9 1.7 0.4Iris-setosa
4.6 3.4 1.4 0.3Iris-setosa
5 3.4 1.5 0.2Iris-setosa
4.4 2.9 1.4 0.2Iris-setosa
4.9 3.1 1.5 0.1Iris-setosa
<bound method H2OFrame.head of >

Construcción del modelo.

A continuación lo que se hace es dividir entre las variables predictoras ( features ) y la que se va a predecir ( target ).

y = "class" #Variable target
x = data.names
print(x)
x.remove(y) #Me quedo solo con el nombre de  las features
print(x)
['sepal_len', 'sepal_wid', 'petal_len', 'petal_wid', 'class']
['sepal_len', 'sepal_wid', 'petal_len', 'petal_wid']

Separo en conjuntos de tipo train test los datos con los que se va a trabajar

train, test = data.split_frame([0.8]) 

Obtengo los resultados:

m = h2o.estimators.deeplearning.H2ODeepLearningEstimator()
m.train(x, y, train)
p = m.predict(test)
deeplearning Model Build progress: |██████████████████████████████████████| 100%
deeplearning prediction progress: |███████████████████████████████████████| 100%

Detalles del modelo.

Una vez construido el modelo, se pueden ver detalles interesantes, sin más que imprimir el mismo. Esto se puede ver claro ejecutando el siguiente comendo:

print(m)
Model Details
=============
H2ODeepLearningEstimator :  Deep Learning
Model Key:  DeepLearning_model_python_1536730197870_1


ModelMetricsMultinomial: deeplearning
** Reported on train data. **

MSE: 0.013232843359628944
RMSE: 0.11503409650894357
LogLoss: 0.0450005383127653
Mean Per-Class Error: 0.015151515151515152
Confusion Matrix: Row labels: Actual class; Column labels: Predicted class
Iris-setosa Iris-versicolor Iris-virginica Error Rate
36.0 0.0 0.0 0.0 0 / 36
0.0 42.0 2.0 0.0454545 2 / 44
0.0 0.0 30.0 0.0 0 / 30
36.0 42.0 32.0 0.0181818 2 / 110
Top-3 Hit Ratios: 
k hit_ratio
1 0.9818182
2 1.0
3 1.0
Scoring History: 
timestamp duration training_speed epochs iterations samples training_rmse training_logloss training_r2 training_classification_error
2018-09-12 07:38:50 0.000 sec None 0.0 0 0.0 nan nan nan nan
2018-09-12 07:38:50 0.343 sec 635 obs/sec 1.0 1 110.0 0.3219722 0.3286570 0.8263622 0.1454545
2018-09-12 07:38:51 0.593 sec 2600 obs/sec 10.0 10 1100.0 0.1150341 0.0450005 0.9778354 0.0181818
Variable Importances: 
variable relative_importance scaled_importance percentage
petal_wid 1.0 1.0 0.2641978
petal_len 0.9526816 0.9526816 0.2516964
sepal_wid 0.9173351 0.9173351 0.2423579
sepal_len 0.9150264 0.9150264 0.2417479

En lugar de obtener toda la información del modelo, se podría obtener algún dato concreto del mismo tal y como se muestra a continuación.

print(m.mse)
Model Details
=============
H2ODeepLearningEstimator :  Deep Learning
Model Key:  DeepLearning_model_python_1536730197870_1


ModelMetricsMultinomial: deeplearning
** Reported on train data. **

MSE: 0.013232843359628944
RMSE: 0.11503409650894357
LogLoss: 0.0450005383127653
Mean Per-Class Error: 0.015151515151515152
Confusion Matrix: Row labels: Actual class; Column labels: Predicted class
Iris-setosa Iris-versicolor Iris-virginica Error Rate
36.0 0.0 0.0 0.0 0 / 36
0.0 42.0 2.0 0.0454545 2 / 44
0.0 0.0 30.0 0.0 0 / 30
36.0 42.0 32.0 0.0181818 2 / 110
Top-3 Hit Ratios: 
k hit_ratio
1 0.9818182
2 1.0
3 1.0
Scoring History: 
timestamp duration training_speed epochs iterations samples training_rmse training_logloss training_r2 training_classification_error
2018-09-12 07:38:50 0.000 sec None 0.0 0 0.0 nan nan nan nan
2018-09-12 07:38:50 0.343 sec 635 obs/sec 1.0 1 110.0 0.3219722 0.3286570 0.8263622 0.1454545
2018-09-12 07:38:51 0.593 sec 2600 obs/sec 10.0 10 1100.0 0.1150341 0.0450005 0.9778354 0.0181818
Variable Importances: 
variable relative_importance scaled_importance percentage
petal_wid 1.0 1.0 0.2641978
petal_len 0.9526816 0.9526816 0.2516964
sepal_wid 0.9173351 0.9173351 0.2423579
sepal_len 0.9150264 0.9150264 0.2417479
<bound method ModelBase.mse of >

Para las predicciones calcula para cada elemento del conjunto test, la probabilidad de que pertenezca a cada una de las clases “clasificadoras”, y entonces asigna esa observación a la clase que tiene mayor probabilidad.

En el siguiente ejemplo se puede ver esto.

print(p)
predict Iris-setosa Iris-versicolor Iris-virginica
Iris-setosa 0.999664 0.000335718 6.21933e-18
Iris-setosa 0.999645 0.000355221 8.8088e-17
Iris-setosa 0.999218 0.000781611 1.40786e-17
Iris-setosa 0.99982 0.0001797 4.97882e-17
Iris-setosa 0.999815 0.000185221 1.7065e-17
Iris-setosa 0.996649 0.00335132 9.72906e-17
Iris-setosa 0.998671 0.00132894 1.75318e-15
Iris-setosa 0.999405 0.000595341 1.24659e-17
Iris-setosa 0.999234 0.000765667 1.22268e-17
Iris-setosa 0.999769 0.000231469 1.66583e-17
import numpy as np


print(type(p['predict']))
print(type(test['class']))

print((p['predict']).describe)
print((test['class']).describe)

#Junto la predicción y los valores reales en una tabla
resultados=(p['predict']).cbind(test['class'])
print(resultados)
<class 'h2o.frame.H2OFrame'>
<class 'h2o.frame.H2OFrame'>
predict
Iris-setosa
Iris-setosa
Iris-setosa
Iris-setosa
Iris-setosa
Iris-setosa
Iris-setosa
Iris-setosa
Iris-setosa
Iris-setosa
<bound method H2OFrame.describe of >
class
Iris-setosa
Iris-setosa
Iris-setosa
Iris-setosa
Iris-setosa
Iris-setosa
Iris-setosa
Iris-setosa
Iris-setosa
Iris-setosa
<bound method H2OFrame.describe of >
predict class
Iris-setosaIris-setosa
Iris-setosaIris-setosa
Iris-setosaIris-setosa
Iris-setosaIris-setosa
Iris-setosaIris-setosa
Iris-setosaIris-setosa
Iris-setosaIris-setosa
Iris-setosaIris-setosa
Iris-setosaIris-setosa
Iris-setosaIris-setosa

La matriz de confusión se puede obtener de la siguiente manera:

m.confusion_matrix
Model Details
=============
H2ODeepLearningEstimator :  Deep Learning
Model Key:  DeepLearning_model_python_1536730197870_1


ModelMetricsMultinomial: deeplearning
** Reported on train data. **

MSE: 0.013232843359628944
RMSE: 0.11503409650894357
LogLoss: 0.0450005383127653
Mean Per-Class Error: 0.015151515151515152
Confusion Matrix: Row labels: Actual class; Column labels: Predicted class
Iris-setosa Iris-versicolor Iris-virginica Error Rate
36.0 0.0 0.0 0.0 0 / 36
0.0 42.0 2.0 0.0454545 2 / 44
0.0 0.0 30.0 0.0 0 / 30
36.0 42.0 32.0 0.0181818 2 / 110
Top-3 Hit Ratios: 
k hit_ratio
1 0.9818182
2 1.0
3 1.0
Scoring History: 
timestamp duration training_speed epochs iterations samples training_rmse training_logloss training_r2 training_classification_error
2018-09-12 07:38:50 0.000 sec None 0.0 0 0.0 nan nan nan nan
2018-09-12 07:38:50 0.343 sec 635 obs/sec 1.0 1 110.0 0.3219722 0.3286570 0.8263622 0.1454545
2018-09-12 07:38:51 0.593 sec 2600 obs/sec 10.0 10 1100.0 0.1150341 0.0450005 0.9778354 0.0181818
Variable Importances: 
variable relative_importance scaled_importance percentage
petal_wid 1.0 1.0 0.2641978
petal_len 0.9526816 0.9526816 0.2516964
sepal_wid 0.9173351 0.9173351 0.2423579
sepal_len 0.9150264 0.9150264 0.2417479
<bound method H2OMultinomialModel.confusion_matrix of >
 
p["predict"].cbind(test["class"]).as_data_frame()

predict class
0 Iris-setosa Iris-setosa
1 Iris-setosa Iris-setosa
2 Iris-setosa Iris-setosa
3 Iris-setosa Iris-setosa
4 Iris-setosa Iris-setosa
5 Iris-setosa Iris-setosa
6 Iris-setosa Iris-setosa
7 Iris-setosa Iris-setosa
8 Iris-setosa Iris-setosa
9 Iris-setosa Iris-setosa
10 Iris-setosa Iris-setosa
11 Iris-setosa Iris-setosa
12 Iris-setosa Iris-setosa
13 Iris-setosa Iris-setosa
14 Iris-versicolor Iris-versicolor
15 Iris-versicolor Iris-versicolor
16 Iris-virginica Iris-versicolor
17 Iris-versicolor Iris-versicolor
18 Iris-versicolor Iris-versicolor
19 Iris-versicolor Iris-versicolor
20 Iris-virginica Iris-virginica
21 Iris-virginica Iris-virginica
22 Iris-virginica Iris-virginica
23 Iris-virginica Iris-virginica
24 Iris-virginica Iris-virginica
25 Iris-virginica Iris-virginica
26 Iris-virginica Iris-virginica
27 Iris-virginica Iris-virginica
28 Iris-virginica Iris-virginica
29 Iris-virginica Iris-virginica
30 Iris-versicolor Iris-virginica
31 Iris-virginica Iris-virginica
32 Iris-virginica Iris-virginica
33 Iris-virginica Iris-virginica
34 Iris-virginica Iris-virginica
35 Iris-virginica Iris-virginica
36 Iris-virginica Iris-virginica
37 Iris-virginica Iris-virginica
38 Iris-virginica Iris-virginica
39 Iris-virginica Iris-virginica

Cuando se tiene pandas instalado, como es este el caso, entre otras cosas se podría mirar el porcentaje de clasificaciones correctas. Se haría de la siguiente manera.

(p["predict"] == test["class"]).mean()
[0.95]

Perfomance versus prediction.

En los apartados anteriores se ha construido un modelo y posteriormente se ha hecho una predicción con la siguiente instrucción:

p = m.predict(test)

Además del método anterior, se puede usar la propiedad perfomance para estudiar la fiabilidad que nos ofrece el modelo construido:

m.model_performance(test)
ModelMetricsMultinomial: deeplearning
** Reported on test data. **

MSE: 0.02661973313625441
RMSE: 0.16315554889814324
LogLoss: 0.07791377355567655
Mean Per-Class Error: 0.07222222222222223
Confusion Matrix: Row labels: Actual class; Column labels: Predicted class
Iris-setosa Iris-versicolor Iris-virginica Error Rate
14.0 0.0 0.0 0.0 0 / 14
0.0 5.0 1.0 0.1666667 1 / 6
0.0 1.0 19.0 0.05 1 / 20
14.0 6.0 20.0 0.05 2 / 40
Top-3 Hit Ratios: 
k hit_ratio
1 0.95
2 1.0
3 1.0

Etiquetas de este post



Ayúdame a mantener este blog