H2o 简明教程
H2O - Introduction
您是否曾被要求在一个庞大的数据库上开发一个机器学习模型?通常情况下,客户会为您提供数据库,并要求您做出某些预测,例如谁将是潜在买家;是否可以早期检测到欺诈案,等。为了回答这些问题,您的任务将是开发一个机器学习算法来为客户的查询提供答案。从头开始开发机器学习算法并非易事,而且当市场上有几个可直接使用的机器学习库时,为何要这样做。
如今,您宁愿使用这些库,从这些库中应用一个经过充分测试的算法,然后再查看其性能。如果性能未达到可接受的限度,您将尝试微调当前算法或尝试一个完全不同的算法。
同样,您可以在同一数据集上尝试多个算法,然后选取最能令人满意地满足客户需求的算法。这就是 H2O 可以帮助您的地方。它是一个开源机器学习框架,其中包含了多种被广泛接受的 ML 算法的经过全面测试的实现。您只需要从其庞大的存储库中选取该算法,然后将其应用到您的数据集。它包含使用最广泛的统计和 ML 算法。
这里提到了几个,其中包括梯度提升机 (GBM)、广义线性模型 (GLM)、深度学习等等。不仅如此,它还支持 AutoML 功能,该功能将对您的数据集中的不同算法的性能进行排名,从而减少您为找到性能最佳的模型所做的努力。H2O 被全球 18,000 多家组织使用,并且能很好地与 R 和 Python 对接,方便您的开发。它是一个内存平台,提供卓越的性能。
在本教程中,您将首先学习如何在计算机上安装 H2O,同时使用 Python 和 R 选项。我们将了解如何使用命令行,以便逐行了解其工作原理。如果您是一名 Python 爱好者,您可以使用 Jupyter 或任何其他您选择的 IDE 来开发 H2O 应用程序。如果您更喜欢 R,可以使用 RStudio 进行开发。
在本教程中,我们将考虑一个示例来了解如何使用 H2O。我们还将学习如何在程序代码中更改算法,并将其性能与之前的算法进行比较。H2O 还提供了一个基于 Web 的工具来测试您数据集上的不同算法。这称为 Flow。
本教程将向您介绍 Flow 的使用。与此同时,我们将讨论 AutoML 的使用,该功能将识别您数据集上性能最佳的算法。您是不是很兴奋要学习 H2O?继续阅读!
H2O - Installation
H2O 可以按照如下列出的五种不同选项进行配置和使用:
-
Install in Python
-
Install in R
-
Web-based Flow GUI
-
Hadoop
-
Anaconda Cloud
在我们的后续部分中,您会看到根据可用选项来安装 H2O 的说明。您可能会使用其中一个选项。
Install in Python
要使用 Python 运行 H2O,安装需要一些依赖关系。因此,让我们开始安装运行 H2O 所需的最低依赖关系。
Installing Dependencies
要安装依赖关系,请执行以下 pip 命令:
$ pip install requests
打开您的控制台窗口,然后键入以上命令来安装 requests 包。以下屏幕截图显示了在我们的 Mac 机器上执行上述命令的情况:
安装 requests 后,您需要安装如下所示的另外三个包:
$ pip install tabulate
$ pip install "colorama >= 0.3.8"
$ pip install future
最新依赖项清单可在 H2O GitHub 页面获取。在撰写本文时,该页面列出了以下依赖项。
python 2. H2O — Installation
pip >= 9.0.1
setuptools
colorama >= 0.3.7
future >= 0.15.2
Installing the Latest Version
接下来,让我们使用以下命令安装最新版本的 H2O:
$ pip install -f http://h2o-release.s3.amazonaws.com/h2o/latest_stable_Py.html h2o
安装成功后,您应该在屏幕上看到以下信息显示:
Installing collected packages: h2o
Successfully installed h2o-3.26.0.1
Testing the Installation
要测试安装,我们将运行 H2O 安装中提供的一个示例应用程序。首先,通过键入以下命令启动 Python 提示符:
$ Python3
Python 解释器启动后,在 Python 命令提示符中键入以下 Python 语句:
>>>import h2o
上述命令在您的程序中导入 H2O 软件包。接下来,使用以下命令初始化 H2O 系统:
>>>h2o.init()
您的屏幕将显示集群信息,并且应该在此时显示以下内容:
现在,您可以运行示例代码。在 Python 提示符中键入以下命令并执行它。
>>>h2o.demo("glm")
该演示由一个包含一系列命令的 Python Notebook 组成。在执行每条命令后,其输出会立即显示在屏幕上,并且系统会要求您按某个键继续执行下一步。执行 Notebook 中的最后一条语语句的部分屏幕截图显示在此处:
在这个阶段,您的 Python 安装就完成了,您可以进行您自己的实验。
Install in R
为 R 开发环境安装 H2O 与为 Python 安装 H2O 非常相似,不同之处在于您将使用 R 提示符进行安装。
Starting R Console
通过单击机器上的 R 应用程序图标启动 R 控制台。控制台屏幕将如以下屏幕截图所示出现:
您的 H2O 安装将在上述 R 提示符上完成。如果您喜欢使用 RStudio,请在 R 控制台子窗口中键入命令。
Removing Older Versions
首先,在 R 提示符中使用以下命令删除旧版本:
> if ("package:h2o" %in% search()) { detach("package:h2o", unload=TRUE) }
> if ("h2o" %in% rownames(installed.packages())) { remove.packages("h2o") }
Install in R from CRAN
从 CRAN 安装 R,在 R 提示符下使用以下命令 −
> install.packages("h2o")
系统将要求你选择镜像 −
--- Please select a CRAN mirror for use in this session ---
屏幕上将显示一个对话框,其中列出了镜像网站列表。选择最近的位置或你选择的镜像。
Installing Web GUI Flow
要安装 GUI Flow,请从 H20 网站下载安装文件。将下载的文件解压到你的首选文件夹中。请注意安装中是否包含 h2o.jar 文件。使用以下命令在命令窗口中运行该文件 −
$ java -jar h2o.jar
一段时间后,控制台窗口中将显示以下内容。
07-24 16:06:37.304 192.168.1.18:54321 3294 main INFO: H2O started in 7725ms
07-24 16:06:37.304 192.168.1.18:54321 3294 main INFO:
07-24 16:06:37.305 192.168.1.18:54321 3294 main INFO: Open H2O Flow in your web browser: http://192.168.1.18:54321
07-24 16:06:37.305 192.168.1.18:54321 3294 main INFO:
要启动 Flow,请在浏览器中打开给定的 URL http://localhost:54321 。将显示以下屏幕 −
此时,你的 Flow 安装已经完成。
Install on Hadoop / Anaconda Cloud
除非你是经验丰富的开发人员,否则你不会考虑在宏观数据上使用 H2O。这里有必要说明的是,H2O 模型可以在数 TB 的海量数据库上高效运行。如果你的数据位于 Hadoop 安装中或云中,请按照 H2O 网站上给定的步骤为你的各个数据库进行安装。
既然你已在计算机上成功安装并测试了 H2O,你就可以开始进行实际开发。首先,我们将了解如何通过命令提示符进行开发。在后面的教程中,我们将学习如何在 H2O Flow 中进行模型测试。
Developing in Command Prompt
现在让我们考虑使用 H2O 对著名的鸢尾花数据集进行分类,该数据集可免费用于开发机器学习应用程序。
通过在 shell 窗口中输入以下命令启动 Python 解释器 −
$ Python3
这将启动 Python 解释器。使用以下命令导入 h2o 平台 −
>>> import h2o
我们将使用随机森林算法进行分类。这是 H2ORandomForest Estimator 包中提供的。我们使用 import 语句按如下所示导入此包 −
>>> from h2o.estimators import H2ORandomForestEstimator
我们通过调用其 init 方法来初始化 H2o 环境。
>>> h2o.init()
初始化成功后,你应该在控制台上看到以下消息以及集群信息。
Checking whether there is an H2O instance running at http://localhost:54321 . connected.
现在,我们将使用 H2O 中的 import_file 方法导入 iris 数据。
>>> data = h2o.import_file('iris.csv')
进度将按以下屏幕截图所示方式显示 −
在文件载入内存后,您可以通过显示载入表的首 10 行来验证此操作。执行此操作时,您可以使用以下 head 方法 −
>>> data.head()
您将在表格格式下看到以下输出。
表格也会显示列名。我们将使用前四列作为机器学习算法的特征,将最后一列类别指定为预测输出。我们通过首先设置以下两个变量,在对机器学习算法的调用中指定此内容。
>>> features = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']
>>> output = 'class'
接下来,我们通过调用 split_frame 方法将数据拆分成训练数据和测试数据。
>>> train, test = data.split_frame(ratios = [0.8])
数据以 80:20 的比例拆分。我们使用 80% 的数据进行训练,使用 20% 的数据进行测试。
现在,我们将内置的随机森林模型载入系统中。
>>> model = H2ORandomForestEstimator(ntrees = 50, max_depth = 20, nfolds = 10)
在上述调用中,我们将树的数量设为 50,树的最大深度设为 20,交叉验证的折叠数量设为 10。我们现在需要对模型进行训练。我们将通过以下方式调用 train 方法来完成此操作 −
>>> model.train(x = features, y = output, training_frame = train)
作为前两个参数,train 方法接收先前创建的特征和输出。训练数据集设置为 train,即完整数据集的 80%。在训练期间,您将看到进度,如下所示 −
现在,由于模型构建过程已结束,是时候测试模型了。我们通过对训练过的模型对象调用 model_performance 方法来完成此操作。
>>> performance = model.model_performance(test_data=test)
在上述方法调用中,我们发送测试数据作为参数。
现在是时候查看输出了,即模型的性能。通过简单地打印性能即可完成此操作。
>>> print (performance)
此操作会输出以下内容 −
输出会显示均方误差 (MSE)、均方根误差 (RMSE)、LogLoss 以及混淆矩阵。
Running in Jupyter
我们已从命令中看到执行情况,并已理解每行代码的用途。您可以在 Jupyter 环境中一次性运行整个代码,也可以一行一行运行。完整清单如下 −
import h2o
from h2o.estimators import H2ORandomForestEstimator
h2o.init()
data = h2o.import_file('iris.csv')
features = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']
output = 'class'
train, test = data.split_frame(ratios=[0.8])
model = H2ORandomForestEstimator(ntrees = 50, max_depth = 20, nfolds = 10)
model.train(x = features, y = output, training_frame = train)
performance = model.model_performance(test_data=test)
print (performance)
运行代码并查看输出。您现在可以意识到将随机森林算法应用于您的数据集并对其进行测试是多么容易。H20 的强大功能远远超出了此功能。如果您希望在同一数据集上尝试其他模型以查看是否可以获得更好的性能,该怎么办?我们的后续部分中将对此进行说明。
Applying a Different Algorithm
现在,我们将了解如何将梯度提升算法应用于我们之前的那个数据集,以查看其性能如何。在上述完整清单中,您仅需根据以下代码中突出显示的内容做出两个轻微更改 −
import h2o
from h2o.estimators import H2OGradientBoostingEstimator
h2o.init()
data = h2o.import_file('iris.csv')
features = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']
output = 'class'
train, test = data.split_frame(ratios = [0.8])
model = H2OGradientBoostingEstimator
(ntrees = 50, max_depth = 20, nfolds = 10)
model.train(x = features, y = output, training_frame = train)
performance = model.model_performance(test_data = test)
print (performance)
运行代码,您将获得以下输出 −
只需将 MSE、RMSE、混淆矩阵等结果与之前的输出进行比较,然后决定在实际部署中使用哪个结果。事实上,您可以应用多种不同的算法,以决定最符合您目的的那一个。
H2O - Flow
在上一课中,你学习了使用命令行界面创建基于 H2O 的机器学习模型。H2O Flow 实现了同样的目的,但使用的是基于网络的界面。
在接下来的教程中,我将向你展示如何启动 H2O Flow 和运行一个示例应用程序。
Starting H2O Flow
你先前下载的 H2O 安装包含 h2o.jar 文件。要启动 H2O Flow,首先从命令提示符运行此 jar 文件 −
$ java -jar h2o.jar
当 jar 文件运行成功后,你将在控制台上收到以下消息 −
Open H2O Flow in your web browser: http://192.168.1.10:54321
现在,打开你选择的浏览器,并键入以上 URL。你将看到 H2O 基于网络的桌面,如下所示 −
这基本上是一个类似于 Colab 或 Jupyter 的笔记本。我将在解释 Flow 中的各种功能的同时向你展示如何在笔记本中加载和运行一个示例应用程序。点击上面屏幕上的查看示例 Flow 链接以查看提供的示例列表。
我将从示例中描述航空公司延误 Flow 示例。
H2O - Running Sample Application
在示例列表中点击航空公司延误 Flow 链接,如下面的屏幕截图所示 −
在你确认之后,新的笔记本将被加载。
Clearing All Outputs
在我们解释笔记本中的代码语句之前,让我们清除所有输出,然后逐渐运行笔记本。要清除所有输出,请选择以下菜单选项 −
Flow / Clear All Cell Contents
这在以下屏幕截图中所示 −
一旦清除所有输出,我们将单独运行笔记本中的每个单元格,并检查其输出。
Running the First Cell
单击第一个单元格。左侧会出现一个红旗,表示该单元格已选中。如下图所示 −
此单元格的内容只是使用 MarkDown (MD) 语言编写的程序注释。该内容描述了加载的应用程序的功能。要运行单元格,请单击运行图标,如下图所示 −
你将在单元格下方看不到任何输出,因为当前单元格中没有可执行代码。光标现在会自动移动到下一个单元格,该单元格已准备好执行。
Importing Data
下一个单元格包含以下 Python 语句 −
importFiles ["https://s3.amazonaws.com/h2o-airlines-unpacked/allyears2k.csv"]
该语句将 allyears2k.csv 文件从 Amazon AWS 导入到系统中。当你运行该单元格时,它会导入该文件,并为你提供以下输出。
Setting Up Data Parser
现在,我们需要对数据进行解析,使其适合我们的 ML 算法。使用以下命令执行此操作–
setupParse paths: [ "https://s3.amazonaws.com/h2o-airlines-unpacked/allyears2k.csv" ]
在执行上述语句后,将出现设置配置对话框。该对话框允许您对文件的解析进行多个设置。如下图所示所示:
在此对话框中,您可以从给定的下拉列表中选择所需的解析器,并设置其他参数,如字段分隔符等。
Parsing Data
下一个语句实际使用上述配置解析数据文件,语句较长,如下所示:
parseFiles
paths: ["https://s3.amazonaws.com/h2o-airlines-unpacked/allyears2k.csv"]
destination_frame: "allyears2k.hex"
parse_type: "CSV"
separator: 44
number_columns: 31
single_quotes: false
column_names: ["Year","Month","DayofMonth","DayOfWeek","DepTime","CRSDepTime",
"ArrTime","CRSArrTime","UniqueCarrier","FlightNum","TailNum",
"ActualElapsedTime","CRSElapsedTime","AirTime","ArrDelay","DepDelay",
"Origin","Dest","Distance","TaxiIn","TaxiOut","Cancelled","CancellationCode",
"Diverted","CarrierDelay","WeatherDelay","NASDelay","SecurityDelay",
"LateAircraftDelay","IsArrDelayed","IsDepDelayed"]
column_types: ["Enum","Enum","Enum","Enum","Numeric","Numeric","Numeric"
,"Numeric","Enum","Enum","Enum","Numeric","Numeric","Numeric","Numeric",
"Numeric","Enum","Enum","Numeric","Numeric","Numeric","Enum","Enum",
"Numeric","Numeric","Numeric","Numeric","Numeric","Numeric","Enum","Enum"]
delete_on_done: true
check_header: 1
chunk_size: 4194304
请注意,您在配置框中设置的参数在上述代码中已列出。现在,运行此单元格。一段时间后,解析完成,您将看到以下输出:
Examining Dataframe
经处理后,它将生成一个数据框,可以使用以下语句对其进行检查:
getFrameSummary "allyears2k.hex"
在执行上述语句后,您将看到以下输出:
现在,您的数据已准备就绪,可以将其输入机器学习算法。
下一条语句是程序注释,表示我们将使用回归模型并指定预设正则化和 lambda 值。
Building the Model
接下来是对模型本身进行构建,这是最重要的语句。此语句指定在以下语句中:
buildModel 'glm', {
"model_id":"glm_model","training_frame":"allyears2k.hex",
"ignored_columns":[
"DayofMonth","DepTime","CRSDepTime","ArrTime","CRSArrTime","TailNum",
"ActualElapsedTime","CRSElapsedTime","AirTime","ArrDelay","DepDelay",
"TaxiIn","TaxiOut","Cancelled","CancellationCode","Diverted","CarrierDelay",
"WeatherDelay","NASDelay","SecurityDelay","LateAircraftDelay","IsArrDelayed"],
"ignore_const_cols":true,"response_column":"IsDepDelayed","family":"binomial",
"solver":"IRLSM","alpha":[0.5],"lambda":[0.00001],"lambda_search":false,
"standardize":true,"non_negative":false,"score_each_iteration":false,
"max_iterations":-1,"link":"family_default","intercept":true,
"objective_epsilon":0.00001,"beta_epsilon":0.0001,"gradient_epsilon":0.0001,
"prior":-1,"max_active_predictors":-1
}
我们使用了 glm,这是一套广义线性模型,其族类型设置为二项式。您可以在上述语句中看到这些内容突出显示。在我们的示例中,预期输出是二进制的,因此我们使用二项式类型。您可以自己检查其他参数;例如,查看我们之前指定的 alpha 和 lambda。参考 GLM 模型文档以获取所有参数的说明。
现在,运行此语句。执行后,将生成以下输出:
当然,在您的机器上,执行时间会有所不同。现在,来到此示例代码中最有趣的部分。
Examining Output
我们仅使用以下语句输出了我们已经构建的模型:
getModel "glm_model"
请注意,glm_model 是我们在上一个语句中构建模型时指定为 model_id 参数的模型 ID。这为我们提供了详细的结果输出,其中包含多个不同的参数。下图中显示了报告的部分输出:
如您在输出中所见,它表示这是在您的数据集上运行广义线性建模算法的结果。
在 SCORING HISTORY 正上方,您会看到 MODEL PARAMETERS 标记,展开该标记,您将看到构建模型时使用所有参数的列表。在下图中显示了这一点。
同样,每个标记都会提供特定类型的详细输出。展开各个标记以研究不同种类的输出。
Building Another Model
接下来,我们将在我们数据框上构建一个深度学习模型。示例代码中的下一行语句只是一个程序注释。下一条语句实际上是一个模型构建命令。如下所示:
buildModel 'deeplearning', {
"model_id":"deeplearning_model","training_frame":"allyear
s2k.hex","ignored_columns":[
"DepTime","CRSDepTime","ArrTime","CRSArrTime","FlightNum","TailNum",
"ActualElapsedTime","CRSElapsedTime","AirTime","ArrDelay","DepDelay",
"TaxiIn","TaxiOut","Cancelled","CancellationCode","Diverted",
"CarrierDelay","WeatherDelay","NASDelay","SecurityDelay",
"LateAircraftDelay","IsArrDelayed"],
"ignore_const_cols":true,"res ponse_column":"IsDepDelayed",
"activation":"Rectifier","hidden":[200,200],"epochs":"100",
"variable_importances":false,"balance_classes":false,
"checkpoint":"","use_all_factor_levels":true,
"train_samples_per_iteration":-2,"adaptive_rate":true,
"input_dropout_ratio":0,"l1":0,"l2":0,"loss":"Automatic","score_interval":5,
"score_training_samples":10000,"score_duty_cycle":0.1,"autoencoder":false,
"overwrite_with_best_model":true,"target_ratio_comm_to_comp":0.02,
"seed":6765686131094811000,"rho":0.99,"epsilon":1e-8,"max_w2":"Infinity",
"initial_weight_distribution":"UniformAdaptive","classification_stop":0,
"diagnostics":true,"fast_mode":true,"force_load_balance":true,
"single_node_mode":false,"shuffle_training_data":false,"missing_values_handling":
"MeanImputation","quiet_mode":false,"sparse":false,"col_major":false,
"average_activation":0,"sparsity_beta":0,"max_categorical_features":2147483647,
"reproducible":false,"export_weights_and_biases":false
}
如您在上方的代码中看到的那样,我们指定对相应的数值设定几个参数来使用 deeplearning 构建模型,如 deeplearning 模型文档中指定的那样。当您运行此语句时,它将比 GLM 模型构建需要更多时间。您将在模型构建完成后看到以下输出,尽管时间不同。
H2O - AutoML
要使用 AutoML,请启动一个新的 Jupyter 笔记本,并遵循如下步骤。
Preparing Dataset
我们需要决定特征和预测列。我们使用前例中相同的特征和预测列。使用以下两个语句设定特征和输出列:
features = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']
output = 'class'
以 80:20 的比例将数据分为训练集和测试集:
train, test = data.split_frame(ratios=[0.8])
Applying AutoML
现在,我们已准备就绪地在我们的数据集上应用 AutoML 了。AutoML 将根据我们设定的固定时间运行,并为我们提供优化过的模型。我们使用以下语句设置 AutoML:
aml = H2OAutoML(max_models = 30, max_runtime_secs=300, seed = 1)
第一个参数指定了我们要评估和比较的模型数。
第二个参数指定了算法运行的时间。
我们现在在 AutoML 对象上调用 train 方法,如这里所示:
aml.train(x = features, y = output, training_frame = train)
我们指定 x 为之前创建的特征数组,指定 y 为指示预测值 的输出变量,并指定数据帧为 train 数据集。
运行代码,您需要等待 5 分钟(我们将 max_runtime_secs 设置为 300),直到获得以下输出−
Printing the Leaderboard
当 AutoML 处理完成后,它会创建排行榜,对评估过的 30 个算法进行分级。若要查看排行榜前 10 条记录,请使用以下代码 −
lb = aml.leaderboard
lb.head()
执行时,上述代码将生成以下输出 −
显然,DeepLearning 算法获得了最高分。
Predicting on Test Data
现在,您对模型进行了排名,可以在测试数据上查看排名前列模型的性能。要执行此操作,请运行以下代码语句 −
preds = aml.predict(test)
处理将持续一段时间,完成后您将看到以下输出。