H2O是一个完全开源的、分布式的、具有线性可扩展性的内存的机器学习平台。

它具有以下特点:支持R和Python

支持最广泛使用的统计和机器学习的算法,包括DRF,GBM,XGBoost,DL等

具有模型解释能力

支持回归和分类任务,AutoMl的功能只支持有监督任务

自动化建立Web的交互界面,允许用户直接交互进行机器学习操作

自动进行特征工程,模型验证、调整、选择和部署

自动可视化

安装

python

python环境依赖包:grip、colorama、future、tabulate、requests和wheel

pip install h2o

or

R

install.packages("h2O")

下载软件

下载地址,可免费试用21天。

使用示例

在使用前要确保能建立H2O集群

在环境变量设置了java路径 的情况下在cmd执行以下命令:

java -jar path_to/h2o.jar

建立本地的h2o集群,通过http://localhost:54321查看,看到H2O Flow的Web界面即成功。H2O仅支持8,10,11,12版本的java。

H2O的数据特点能从HDFS、S3、NoSQL、SQL中读入数据并写入

能从本地和分布式文件系统(nfs)接收csv格式的数据

能自动解析文件的格式

H2O能将输入的数据通过import_file函数将其转换成H2O Frame,类似Pandas的DataFrame,是一种二维表。

H2O FLOW

H2O Flow是允许用户进行机器学习的交互式界面,使用者能通过简单的操作完成数据预处理、特征工程、建模和预测等功能。H2O Flow所有的功能均可使用代码实现,H2O Flow省去了用户编辑代码的时间,用python实现下列功能的教程见Tutorials

使用示例

通过执行h2o.jar建立了h2o集群后,在浏览器输入地址,看到H2o Flow的Web界面,如下图所示:

简单示例重要步骤

导入数据

将数据的路径输入即可,H2O会自行解析数据,搜索到数据文件后点击import导入数据

建模

H2O提供多种经典的 机器学习算法,如图所示:

建模过程有些参数可选,举几个例子:response_column(必选):确定预测目标

ignore_columns:要去除的特征

n_folds:n折交叉验证

Lambda_search:给模型增加正则化降低拟合度

具体参数设置和解释见H2O Flow右侧>HELP->Building Models

建模结束后平台会对数据模型等进行分析,比如特征重要性,如图所示

保存和导入模型

导航栏Model栏目有import和export model的选择。

AutoML in H2O

H2O中对特征工程和模型超参数采用了grid search(穷举)以及Stacking/Super Learning的方法搜索最优的模型。

grid search

H2O了两种类型的grid searchCartesian:搜索所有模型参数组合的模型

RandomDiscrete:随机网格搜索将在某一特定时间段(或最大模型数内)随机地采样模型参数集

简单示例

Cartesian

导入grid search包和机器学习算法,此处以GBM举例

# Import H2O Grid Search:

from h2o.grid.grid_search import H2OGridSearch


# Import H2O GBM:

from h2o.estimators.gbm import H2OGradientBoostingEstimator

确定搜索空间(网格)

# GBM hyperparameters

gbm_params1 = {'learn_rate': [0.01, 0.1],

'max_depth': [3, 5, 9],

'sample_rate': [0.8, 1.0],

'col_sample_rate': [0.2, 0.5, 1.0]}

训练和验证网格包括的所有的模型

gbm_grid1 = H2OGridSearch(model=H2OGradientBoostingEstimator,

grid_id='gbm_grid1',

hyper_params=gbm_params1)

gbm_grid1.train(x=x, y=y,

training_frame=train,

validation_frame=valid,

ntrees=100,

seed=1)

比较各个模型的性能,结果如图所示

gbm_gridperf1 = gbm_grid1.get_grid(sort_by='auc', decreasing=True)

RandomDiscrete

需要设定类型和最大model数

# Search criteria

search_criteria2 = {'strategy': 'RandomDiscrete', 'max_models': 36}

实例化grid search的时候传入搜索策略

gbm_grid2 = H2OGridSearch(model=H2OGradientBoostingEstimator,

grid_id='gbm_grid2',

hyper_params=gbm_params2,

search_criteria=search_criteria2)

Stacked Ensembles

Stacking算法是训练metalearner(比如逻辑回归)找到一些base算法的最佳组合,将他们集合在一起

算法步骤:

1.设置ensemble明确一组L个基本算法作为算法基

明确元学习算法

2.训练ensemble在训练集上训练基本算法中的所有算法

在基本算法上进行k折交叉验证并收集对应的预测值组成NXL矩阵(N代表训练集的行数),和响应向量一起组成一级数据(其实就是将各个base模型产生的预测值作为特征)

在一级数据上训练元学习算法,ensemble model里面包括了基本算法和元学习算法。

3.预测先获得各个基本算法的预测值

将这些预测值输入元学习器获得ensemble的预测值

使用示例

载入包

import h2o

from h2o.estimators.random_forest import H2ORandomForestEstimator

from h2o.estimators.gbm import H2OGradientBoostingEstimator

from h2o.estimators.stackedensemble import H2OStackedEnsembleEstimator

from h2o.grid.grid_search import H2OGridSearch

from __future__ import print_function

h2o.init()

```

数据预处理

train = h2o.import_file("https://s3.amazonaws.com/erin-data/higgs/higgs_train_10k.csv")

test = h2o.import_file("https://s3.amazonaws.com/erin-data/higgs/higgs_test_5k.csv")


# Identify predictors and response
x = train.columns
y = "response"
x.remove(y)


# For binary classification, response should be a factor

train[y] = train[y].asfactor()

test[y] = test[y].asfactor()

Stacking的方式有三种单个训练一组模型并将它们组成队列

训练一个网格(grid)的模型

训练多个网格(grid)的模型

举单个网格训练的例子

# 明确 GBM 的超参数网格

hyper_params = {"learn_rate": [0.01, 0.03],

"max_depth": [3, 4, 5, 6, 9],

"sample_rate": [0.7, 0.8, 0.9, 1.0],

"col_sample_rate": [0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8]}

search_criteria = {"strategy": "RandomDiscrete", "max_models": 3, "seed": 1}

# 训练网格

grid = H2OGridSearch(model=H2OGradientBoostingEstimator(ntrees=10,
seed=1,
nfolds=nfolds,
fold_assignment="Modulo",
keep_cross_validation_predictions=True),
hyper_params=hyper_params,
search_criteria=search_criteria,
grid_id="gbm_grid_binomial")
grid.train(x=x, y=y, training_frame=train)

# 用网格训练 ensemble 模型

ensemble = H2OStackedEnsembleEstimator(model_id="my_ensemble_gbm_grid_binomial",

base_models=grid.model_ids)

ensemble.train(x=x, y=y, training_frame=train)

# 评估 emsemble 模型的性能

perf_stack_test = ensemble.model_performance(test)

AutoML

H2O的AutoML训练和交叉验证下列算法:一个随机森林(DRF)

一个超随机森林(XRT)

一个广义线性模型的随机网格(GLM)

一个极端梯度提升的随机网格(XGBoost)

一个梯度提升的随机网格(GBM)

一个深度学习的随机网格(DeepLearning)

两个ensemble模型集成了所有的模型

集成了各种模型中性能最好的一个

使用示例

aml = H2OAutoML(max_models = 9)

aml.train(x = x, y = y, training_frame = train)

#展示结果

aml.leaderboard

#保存最好的模型

h2o.save_model(aml.leader, path = "./product_backorders_model_bin")

结果如图所示,产生了9个models(不包括ensemble模型)后停止,将性能从高到低排列。

Open for comments and suggestions!

鹏城实验室人工智能中心