gpt4 book ai didi

python - H2O Predict() 函数的性能

转载 作者:行者123 更新时间:2023-11-30 08:53:59 25 4
gpt4 key购买 nike


我正在使用 H2O 的 Random Forest Regression python 中的模型。在评估其速度方面的性能时,我将其与 scikit-learn 的 RandomForestRegressor 进行了比较。 。

该数据集由约 20,000 行和 20 列数据组成。
我的机器运行Windows,上面有python 3.6。

import time
import h2o
import pandas as pd
from h2o.estimators.random_forest import H2ORandomForestEstimator
from sklearn.ensemble import RandomForestRegressor

def timing(f):
def wrap(*args):
time1 = time.time()
ret = f(*args)
time2 = time.time()
print('%s function took %0.3f ms' % (f.__name__ , (time2-time1)*1000.0))
return ret
return wrap


@timing
def predict_row(model, row):
return model.predict(row)


# read data
h2o.init(max_mem_size = "8G")
h2o.remove_all()
h2o_df = h2o.import_file(csv_path)
train, valid, test = h2o_df.split_frame([0.6, 0.2], seed=1234)
X = h2o_df.col_names[:-1]
y = h2o_df.col_names[-1]


# random forest at H2O
rf_h2o = H2ORandomForestEstimator(model_id="rf_h2o_v1", ntrees=100, stopping_rounds=2, score_each_iteration=True, seed=1000000,
col_sample_rate_per_tree=0.3)
rf_h2o.train(X, y, training_frame=train, validation_frame=valid)


# random forest at sklearn
train_df = train[:-1].as_data_frame(use_pandas=True)
y_df = h2o_df[:,-1].as_data_frame(use_pandas=True)
y_df = y_df[y_df.index.isin(train_df.index)]
rf_sklearn = RandomForestRegressor(n_estimators=100, min_samples_leaf=3, oob_score=True, max_features=0.25)
rf_sklearn.fit(train_df, y_df)


# prediction comparison, let's take row #5 from the test set for example
row_h20 = test[5,:-1]
row_array = test[5,:-1].as_data_frame(use_pandas=True).values
rf_sklearn.predict(row_array)

# run 20 times and test performance on all iterations
for i in range(20):
predict_row(rf_sklearn, row_array)
predict_row(rf_h2o, row_h20)

当我运行这段代码时,我发现 scikit-learn 的随机森林比 H2O 的模型快 4-5 倍(最快迭代速度为 6-7 毫秒 vs. ~30 毫秒)两种情况)。
我的问题是:

  1. 真的是这样吗?谁能证实我没有做错任何事吗?
    我知道 H2O 是基于 JVM 构建的,它不应该快如闪电,但我认为它们至少会和 scikit-learn 一样好。

  2. 我需要在回归算法中超快速地实现预测。有没有人有什么建议?
    scikit-learn/H2O 对我来说不是强制性的,但我需要一些可靠的东西。

最佳答案

H2O 使用数据并行性来实现规模和效率,并且这里的行数非常少,因此执行工作的并行线程数可能很少。

当行数较多(数百万以上)时,H2O 在速度和规模方面具有优势。

您可以使用内置的 Water Meter(在 Linux 上)、“top”或其他性能监控工具来查看有多少线程正在工作。如果您打开 H2O Flow Web UI,解析数据后,您可以看到详细的帧分布摘要分割(见下文)。

对于此示例,我提取的数据集有 43,978 行和 31 列。您可以看到每列的 block 数为 1。这意味着我的数据并行度仅为 1,并且只有 1 个线程在工作。 H2O 旨在高效处理更大的数据集。

enter image description here

关于python - H2O Predict() 函数的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45547698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com