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.
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_wid | class |
5.1 | 3.5 | 1.4 | 0.2 | Iris-setosa |
4.9 | 3 | 1.4 | 0.2 | Iris-setosa |
4.7 | 3.2 | 1.3 | 0.2 | Iris-setosa |
4.6 | 3.1 | 1.5 | 0.2 | Iris-setosa |
5 | 3.6 | 1.4 | 0.2 | Iris-setosa |
5.4 | 3.9 | 1.7 | 0.4 | Iris-setosa |
4.6 | 3.4 | 1.4 | 0.3 | Iris-setosa |
5 | 3.4 | 1.5 | 0.2 | Iris-setosa |
4.4 | 2.9 | 1.4 | 0.2 | Iris-setosa |
4.9 | 3.1 | 1.5 | 0.1 | Iris-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:
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 |
k |
hit_ratio |
1 |
0.9818182 |
2 |
1.0 |
3 |
1.0 |
|
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 |
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.
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 |
k |
hit_ratio |
1 |
0.9818182 |
2 |
1.0 |
3 |
1.0 |
|
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 |
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.
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-setosa | Iris-setosa |
Iris-setosa | Iris-setosa |
Iris-setosa | Iris-setosa |
Iris-setosa | Iris-setosa |
Iris-setosa | Iris-setosa |
Iris-setosa | Iris-setosa |
Iris-setosa | Iris-setosa |
Iris-setosa | Iris-setosa |
Iris-setosa | Iris-setosa |
Iris-setosa | Iris-setosa |
La matriz de confusión se puede obtener de la siguiente manera:
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 |
k |
hit_ratio |
1 |
0.9818182 |
2 |
1.0 |
3 |
1.0 |
|
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 |
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()
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 |
k |
hit_ratio |
1 |
0.95 |
2 |
1.0 |
3 |
1.0 |