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!
鹏城实验室人工智能中心