【发布时间】:2018-01-14 19:21:08
【问题描述】:
我在 python 中使用 H2O 的 Random Forest Regression 模型。在评估其速度方面的性能时,我将其与 scikit-learn 的 RandomForestRegressor 进行了比较。
数据集包含约 20,000 行和 20 列数据。
我的机器运行带有 python 3.6 的 windows。
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 的模型快 X4-5 倍(6-7 毫秒,而最快迭代约为 30 毫秒)两种情况)。
我的问题是:
真的是这样吗?任何人都可以验证我没有做错什么吗?
我知道 H2O 是基于 JVM 构建的,它不应该像闪电一样快,但我认为它们至少会和 scikit-learn 一样好。我需要在回归算法中超快速地实现预测。有没有人有什么建议?
scikit-learn / H2O 对我来说不是强制性的,但我需要一些可靠的东西。
【问题讨论】:
标签: python performance python-3.x machine-learning h2o